一、简单查询 ,Ma^ &ypH
JNnDts*w
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 &mS^ZyG
(KZ{^X?a
表或视图、以及搜索条件等。 a/xn'"eli
Tpa5N'O
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 @-`*m+$U6
3F^Q51:t
SELECT nickname,email SNk=b6`9
ysnx3(+|
FROM testtable iuul7VR-%
Dk5 1z@
WHERE name='张三' 'i|YlMFI g
((%?`y
(一)选择列表 P?P#RhvA1
)MT}+ai
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 @gK?\URoT
k)TpnH! "
量和全局变量)等构成。 XfIJ4ZM5
Ar#(psU
1、选择所有列 B/Ws_Kv
deh*Ib:(S
例如,下面语句显示testtable表中所有列的数据: 6[AL|d
DK
S~G]~gt
SELECT * N?`' /e
!ULn7\@
FROM testtable :e+jU5;]3
<<O$ G7c
2、选择部分列并指定它们的显示次序 *wjrR1#81x
w7&A0M
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 k$:|-_(w
t4-[Z$n5
例如: TIg3`Fon
(A.C]hD
SELECT nickname,email {R{=+2K!|k
EU Fa5C:
FROM testtable ]A_`0"m.U
j3ls3H&
3、更改列标题 (S Yln>o
gbD KE{
在选择列表中,可重新指定列标题。定义格式为: 2y1Sne=<Kb
HTTCTR
列标题=列名 V>rU.Mp
QU
AFt s(
列名 列标题 %E;'ln4h&,
_7y[B&g[r
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ;8 lfOMf
+&H4m=D-#a
标题: t"I77aZ$A
1X1dG#:
SELECT 昵称=nickname,电子邮件=email *|HY>U.
eS){1
FROM testtable lH~[f
*lJxH8 \
4、删除重复行 J]r^W)O
uCB=u[]y4
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ;722\y(Y
`uTmw^pZX
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 1G`Pmh@
<wHP2|<l*
5、限制返回的行数 }Ou}+^Bc
+ LJ73
!
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 u)Whr@m
8H`[*|{'
表示一百分数,指定返回的行数等于总行数的百分之几。 ;<4a*;IO
<%mRSv
例如: 4Wp=y
uhq8
SELECT TOP 2 * ,<X9 Y2B
|6y
FROM testtable Rf% a'b
"$vRMpW:
SELECT TOP 20 PERCENT * 0<*<$U
yaX
iE_.
FROM testtable cm+P]8o%{
i"=\d
(二)FROM子句 1=v*O.XW`
=-Ck4e *T
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 62NsJ<#>
b#o|6HkW
它们之间用逗号分隔。 I]_5}[I
:rP=t ,
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 asqV~n
9A#i_#[R
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 iN.n8MN=I
$<OD31T
使用下面语句格式加以限定: y>ktcuML
!H\F2Vxs
SELECT username,citytable.cityid ~F#j#n(=`q
^=*;X;7
FROM usertable,citytable ]I6 J7A[
4mbBmQV$#
WHERE usertable.cityid=citytable.cityid u$`a7Lp,n
lk =<A"^S
在FROM子句中可用以下两种格式为表或视图指定别名: -F3-{E
EiaW1Cs
表名 as 别名 wdoR%b{M
qxJ\ye+'*
表名 别名 dD@(z:5M\
J9 I:Q<;
例如上面语句可用表的别名格式表示为: _(zG?]y0P
G KeU%x
SELECT username,b.cityid 4I(Xy]wm
!TcJ)0
FROM usertable a,citytable b Kf-JcBsrT
$Z>'Jp
WHERE a.cityid=b.cityid 7PF%76TO
51.%;aY~z
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 8l">cVo]T
[.}oyz;}N
例如: ;O#>Y
T6kdS]4-
SELECT a.au_fname+a.au_lname ]K%!@O!
$`'/+x"%
FROM authors a,titleauthor ta M'l ;:
OB}Ib]
(SELECT title_id,title #,v{Ihn
Z #m+ObHK1
FROM titles .o}v#W+st
G]aOHJ:.
WHERE ytd_sales>10000 kvj#c
U`s{Jm
) AS t 3= ;<$+I6
R/a*LSe@&
WHERE a.au_id=ta.au_id >KKMcTOYY
tZB<on<.)
AND ta.title_id=t.title_id )WFr</z5bA
*gz{.)W
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 BD7Ni^qI$
S`]k>'
l
(三)使用WHERE子句设置查询条件 "J3x_~,[4m
[a<SDMR
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: _Bj":rzY
wI "U7vr
SELECT * ??/
'kmd
{(?4!rh
FROM usertable pmYHUj
#
!Xw5<J3L-
WHERE age>20 (C)p9-,
3T0"" !Q
WHERE子句可包括各种条件运算符: f|oh.z_R
t.C5+^+%
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< H" 7u7l
k~z Iy;AZ
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 7 Fsay+a
G .4X'
NOT BETWEEN…AND… ]
@fk] ]R
|(^PS8wG
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) f6"Z'{j
ZSm3 XXk
NOT IN (项1,项2……) % %UE+u@J
Y\'}a+:@Ph
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE +x}<IS8
Fv`,3aNB
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 6;5Ss?ep
iDrZc
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Q=yg8CQ
[)X\|pO&
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Z;)%%V%o
h2J
x]FJ
2、列表运算符例:country IN ('Germany','China') eh#(eua0/
vs{s_T7Mz]
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 R0-j5&^jju
lU8Hd|@-
varchar、text、ntext、datetime和smalldatetime等类型查询。 b5n'=doR/I
a7%]Y}$
可使用以下通配字符: |]*/R^1>2
;i+#fQO7Q
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 8DaL,bi*.
%ULr8)R;
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Dv`c<+q(#
SMK_6?MZ
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 e\75:oQ
;i:d+!3XwC
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 RViuJ;
}*"p?L^p{
例如: Kx JqbLUC
%H"47ZFxAs
限制以Publishing结尾,使用LIKE '%Publishing' uY'HT|@:{
7. ;3e@s
限制以A开头:LIKE '[A]%' y"wShAR
-z(+/ /K:#
限制以A开头外:LIKE '[^A]%' )w%!{hn
;sFF+^~L
4、空值判断符例WHERE age IS NULL S|+o-[e8O
4H]L~^CD
5、逻辑运算符:优先级为NOT、AND、OR |P}y,pNQ
u,4eCxYE$
(四)查询结果排序 nzeX[*
JqiP>4Uwm^
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: }JAG7L&{
8Uxne2e
ORDER BY {column_name [ASC|DESC]} [,…n] q> C'BIr
V3j= Kf
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 8)I^ t81
(dSL7nel;L
序。 @f_+=}|dc
[!OxZ!
例如: |ZBI *
#Mw8^FST
SELECT * "snw4if
@F*%9LPv
FROM usertable AYx{U?0p
)K
ORDER BY age desc,userid ASC pyvSwD5t
%84rL?S
另外,可以根据表达式进行排序。 h.t-`k7
E< fV Z,
\)|hogI|f
!C:$?oU
二、联合查询 |$b}L7_
ekCC5P!
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 J7p),[>I<
[cp+i^f
合查询。UNION的语法格式为: J/*`7Pd
M/K5#8Arj
select_statement JaGtsi9%.
}`~+]9<
UNION [ALL] selectstatement |
%Vh`HT
XOS[No~
[UNION [ALL] selectstatement][…n] kZ3ThIk%
,nm*q#R,0
其中selectstatement为待联合的SELECT查询语句。 <UQbt N-B\
/t"3!Z?BOv
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 W6/yn
:6\qpex
行。 ^DwYOo 2B
R*2E/8Ia
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 [HZv8HU|
|#
2.Q:&
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 Q$Q([Au
,DkNLE
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 6 ~w@PRy
N//KPh
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ,nDaqQ-C!!
y_lU=(%Jd
型,系统将低精度的数据类型转换为高精度的数据类型。 r<^HmpUJ
B_m8{44zM
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: >I&5j/&}+
@6T/Tdz
查询1 UNION (查询2 UNION 查询3) ikiypWq
>V}#[ /n
v^ VitLC
:G%61x&=Zc
wDe& 1(T^
z ~/` 1
三、连接查询 B,epzI
v
z '&%(
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ;@|n @ax
81
sG
数据库管理系统的一个标志。 v,>Dbxn
@t_=Yl2;
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 'AH0ww_)n
DN5 7p!z
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 o:Sa,
!DK
Z@PmM4F@S
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 +!.^zp21
wEvVL
查询。 ?+}_1x`
'AS|ZRr/
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 xYpd: Sm
:^B1~p(?sK
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 O[JL+g4
ZX./P0
SQL-92标准所定义的FROM子句的连接语法格式为: `&c kZiq
.5ha}=z
FROM join_table join_type join_table q'Tf,a
'@k+4y9q?
[ON (join_condition)] X?qK0fS
+OWX'~fd<
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 'kO!^6=4M
lp%pbx43s
个表操作的连接又称做自连接。 .jjG(L
~%kkeh\j
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 P:MT*ra*,
t=W}SH
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 mSl.mi(JiZ
K^<BW(s
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 +}os&[S
UhQj
Qaa~
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) UJ')I`zuI
?QdWrE_
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 PP33i@G
@YTaSz$L
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 9 X`Sm}i
fN1-d&T
数据行。 SbrecZ
)W
_v:?A9
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 3K0A)W/YEs
o9yJf#-En
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 dn$!&
w-L=LWL\
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 PmEsN&YP]
3eAX.z`D
运算符等构成。 }Sh?S]]`
mLLDE;7|}
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 V#gK$uv
C7ScS"~
连接。例如: 84zSK)=Y
B!L{
SELECT p1.pub_id,p2.pub_id,p1.pr_info rlSeu5X6
<
!C)x
FROM pub_info AS p1 INNER JOIN pub_info AS p2 x@;m8z0
4yr'W8X_
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ywmo#qYe
6HWE~`ok6
(一)内连接 `%"\@<
i#Bf"W{F
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 `%9 uE(
ShP^A"Do
三种: u.m[u)HQ
XnMvKPerv'
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Gk&)08
FxWS V| Z
表中的所有列,包括其中的重复列。 ?_9
,CcV/K
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 >7T'OC
h_3E)jc
运算符包括>、>=、<=、<、!>、!<和<>。 a:OQGhc=
K)|G0n*qS
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 U@)eTHv}6
CXx*_@}MU
结果集合中所包括的列,并删除连接表中的重复列。 \\H}`0m:
'"/=f\)u
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: !6O(-S2A
,pQZ@I\z
SELECT * ;)z:fToh
bSi%2Onj
FROM authors AS a INNER JOIN publishers AS p VSI9U3t3w
Q%f^)HZGR
ON a.city=p.city h#
o6K#
g63(E,;;J
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): XZ]uUP
vDhh>x(
SELECT a.*,p.pub_id,p.pub_name,p.country B:S>wFE(.
i0kak`x0
FROM authors AS a INNER JOIN publishers AS p }t=!(GOb}
}9# r0Vja
ON a.city=p.city pis`$_kmwV
1N#|
}ad
(二)外连接
}Gm>`cw-
S8wLmd>
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 N&+x+;Kx
$)ijN^hV
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 U175{N%3
c&?m>2^6
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 /}fHt^2H
8hz^%vm
如下面使用左外连接将论坛内容和作者信息连接起来: "W7K"=X
RSyUaA
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b y@: h4u"3
0oZ=
yh
ON a.username=b.username O1U= X:Zl
oAJM]%g{
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: [")o.(
uLL]A>vR
SELECT a.*,b.* +yH7v5W
z2_*%S@
FROM city as a FULL OUTER JOIN user as b .B]MpmpK
IS{wtuA.
ON a.username=b.username pnowy;
#@9/g
(三)交叉连接 Xq]w<$
FaQe_;
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 L~rBAIdD
gmO!
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 +_?hK{Ib"
8:c-k|CX
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ]}-7_n#cC
rq/yD,I,
于6*8=48行。 r6MMCJ|G
3G)#5Lf<
SELECT type,pub_name 7uS~MW
?GoR^p #p
FROM titles CROSS JOIN publishers l|~A#kq
vMi;+6'n>
ORDER BY type