一、简单查询 V\kf6E
d%9r"=/
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 NdQXQa?,
H3.WAg[`
表或视图、以及搜索条件等。 [JGa3e
'C~NQ{1TV
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 'Z7oPq6
0n_Cuh\
SELECT nickname,email O4&/g-
(o\:rLZu
FROM testtable '7W?VipU
m4nJ9<-
WHERE name='张三' xnu|?;.}!
+MQf2|--
(一)选择列表 cmu5KeH
Fa9]!bW
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 XQk9 U
0X)'8N
量和全局变量)等构成。 sf?D4UdIH
;1cX|N=
1、选择所有列 `ge{KB;*n#
r! 5C3
例如,下面语句显示testtable表中所有列的数据: / vge@bsE
79a{Zwdd9j
SELECT * odquAqn
0}Xkj)R,
FROM testtable 1H@GwQ|<=
5jg^12EP
2、选择部分列并指定它们的显示次序 EPr{1Z
U$pHfNTH
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 awXL}m[_!
{P(Z{9 u%
例如: -?!Z/#i4
/+J?Ep(_
SELECT nickname,email F#iLMO&Q
ha'oLm#
FROM testtable 6[c
LbT0
$+ZO{
(
3、更改列标题 ,KIa+&vJW@
0ldde&!p
在选择列表中,可重新指定列标题。定义格式为: 8\y%J!b
gzP(LfI5
列标题=列名 xN}P0
0pu])[P]_[
列名 列标题 d?&?$qf[
q!<`ci,uS
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 R6)p4#|i
_q=$L
eO5
标题: c?eV8h1G
mxQS9y
SELECT 昵称=nickname,电子邮件=email s+^o[R
T3
eF}Q8]da
FROM testtable X<(h)&E
GA6Z{U{XS
4、删除重复行 Os8]iNvW\
r#]gAG4t\
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 uHQJ&
w]) bQ7)
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 gA!-F}x$
F)_Rs5V:(
5、限制返回的行数 Ajq;\-:
4\2p8__
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 \Ul*Nsw
akBR"y:~:H
表示一百分数,指定返回的行数等于总行数的百分之几。 eJ%~6c`@!
rem&F'x0V
例如: QD<^VY6
!V@Y \M
d
SELECT TOP 2 * cWp
n/.a
Iu(T@",Q#
FROM testtable YT,1E>rd
>H5BY9]I
SELECT TOP 20 PERCENT * ED"5y
Y#{KGVT<
FROM testtable R`ZU'|
< W/-[ M
(二)FROM子句 =t&B8+6
o|l)oc6{
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, n1uJQt
v2EM| Q xp
它们之间用逗号分隔。 cGsxfwD
6l [TQ
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 p4Vw`i+DnH
'iMI&?8u
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ,$vc*}yI0
p`Omcl~Q
使用下面语句格式加以限定: +2B{"Czm
)R9>;CuC9?
SELECT username,citytable.cityid Tr/wG
1(hgSf1WH
FROM usertable,citytable qJ"dkT*
^67P(h
WHERE usertable.cityid=citytable.cityid LD_aJ^(d
V)Z*X88:Tv
在FROM子句中可用以下两种格式为表或视图指定别名: V[+ Pb]
Qh/yPOSm:
表名 as 别名 -&))$h3o\
>S5D-)VX
表名 别名 N.xmHv Pk
:XBeGNI*#
例如上面语句可用表的别名格式表示为: l%fnGe` _
8,dCx}X
SELECT username,b.cityid 0NpxqeIDY
1.yw\ZC\
FROM usertable a,citytable b _h@7>+vl~
!&SUoa
WHERE a.cityid=b.cityid <B$Lu4b@c
9S&6u1
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 _*bXVJ
]
0>Ki([3
例如: t}nZrD
IH[/fd0
SELECT a.au_fname+a.au_lname f:"es: Fb
#hR}7K+@
FROM authors a,titleauthor ta A>7'W\R
O%(:8nIgZ
(SELECT title_id,title \RMYaI^+;
X"iy.@7
FROM titles X-oou'4<
./5|i*ow
WHERE ytd_sales>10000 wzo-V^+q
:7:Nx`D8
) AS t 1;vn*w`p
^"6xE nA]
WHERE a.au_id=ta.au_id 'n!;7*
R*Pfc91}
AND ta.title_id=t.title_id YIgzFt[L
c0!bn b
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 q*Ns]f'a
;13lu1
(三)使用WHERE子句设置查询条件 (.%:Q0i1
|;rjr_I
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: $Xz9xzOR
i7e{REBXb
SELECT * <T
-U%wLkf|
FROM usertable G:u[Lk#6K
nF
A7@hsm
WHERE age>20 \e'>$8%T
s}`=pk/FM
WHERE子句可包括各种条件运算符: V%e'H>EC
Eto0>YyZ
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 4vBZb^W;9
uZmfvMr3
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… w{2V7*+l
:Nc~rOC_
NOT BETWEEN…AND… ",&}vfD4M
vuDp_p*]S
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) JguE#ob2
IO^O9IEx,
NOT IN (项1,项2……) JO+ hD4L
fcJ#\-+E
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE `'Z ;+h]
Qkr'C
n
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL z ;
:E~;
zFB$^)v"<
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR z<^HohT
tBrd+}e2*
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
Q9%N>h9
VD36ce9
2、列表运算符例:country IN ('Germany','China') ]>R`]U9*O
^!pagt^
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 'f;+*~*L
.%WbXs
varchar、text、ntext、datetime和smalldatetime等类型查询。 x0Tb7y`
0qJ(3N
可使用以下通配字符: bG.aV#$FIg
L8 R|\Bx
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 $D9JsUij
X5>p~;[9
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 20% xD e
&~$^a1D6
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 er l_Gg
f*oL8"?u&
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 P-^Z7^o-bX
v,+2CVdW
例如: 2&$ A x
>K50 h
限制以Publishing结尾,使用LIKE '%Publishing' !^l<jrM
g%4|vA8
限制以A开头:LIKE '[A]%' )
I-8.
.]v8W51Y
限制以A开头外:LIKE '[^A]%' V-7!)&q
oB_{xu$6|
4、空值判断符例WHERE age IS NULL Q6.},o
U]e;=T:3
5、逻辑运算符:优先级为NOT、AND、OR l6l)M
HpNf f0c
(四)查询结果排序 k*z)AR
\P{VJ^)0
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 1C .<@IZ
H~||]_q|
ORDER BY {column_name [ASC|DESC]} [,…n] [0MVsc=
*QAK9mc
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 $qIMYX
evimnV
序。 q7m-} mBN~
!y4o^Su[
例如: "'6KQnpZ
O$#`he/jm
SELECT * lD
!^MqK
~5cLI;4h
FROM usertable E8FS jLZ
(F$q|qZ%
ORDER BY age desc,userid ASC ZZl)p\r
eT}c_h)
另外,可以根据表达式进行排序。 GbStqR~^#
W J^r~*r
bhuA,}
J,+|
Fb
二、联合查询 ||qsoF5B]
sEhdkN}6
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 A5?[j
QT0
e7vPiQCc
合查询。UNION的语法格式为: GW`9SB
Sfh \4h$H
select_statement SC86+
\J9@p
UNION [ALL] selectstatement oEKLuy
#W!@j"8eK
[UNION [ALL] selectstatement][…n] ,/o<O jR
8LR_K]\
其中selectstatement为待联合的SELECT查询语句。 5&+
qX
2b
AX]lMe
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 wm8(Ju
~p8-#A)X,)
行。 L6 hTz'
&IOChQ`8P
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Z4E:Z}~''
7CM<"pV
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 Q> @0'y=s
ivw2EEo,
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 }@a_x,O/x}
#.FtPR
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 v0=^Hym
R:i7Rb2C
型,系统将低精度的数据类型转换为高精度的数据类型。 ^U:pv0Qz
_~5{l_v|I
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ]hv4EL(zi
mv<z%y?Oj
查询1 UNION (查询2 UNION 查询3) gt'0B-;W
i(L;1 `
I&R4.;LW
ha3 Qx
yWt87+%T
V\)@Yk2
三、连接查询 6^UeEmjc
vPSH
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 0'z$"(6D
,$W7Q
数据库管理系统的一个标志。 )Hl;9
SvDVxK
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 K~v"%sG{`
*4]I#N
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 x:@Ht TX
F/&Z1G.
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ",`fGu )
y=5s~7]
查询。 x1Z?x,-D"
BE}lzn=sF
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 uK}k]x\z
N<Ti[Q]G
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 !t~S.`vF
3vNo D
SQL-92标准所定义的FROM子句的连接语法格式为: zOWbdd_zl
qK;n>BTe
FROM join_table join_type join_table F~{yqY5]n
l)=Rj`M
[ON (join_condition)] 8Ay#6o
RK"dPr
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 (#LV*&K%IC
2$=?;~
个表操作的连接又称做自连接。 Aw9^}k}UfD
jyLpe2 S
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 4vp,izNW
_@jl9<t=_
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 WR gAc%
,MuLu,$/
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 OHM.xw*?.
&{/ `Q,
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 5NBc8h7 V
Fu{[5uv
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 { S4?L8
kM]?
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 XvZg!<*OH
Q5{i#F7nJm
数据行。 4+' yJ9~,B
{u3^#kF
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 :}e*3={4
h^?[:XBeav
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 u{tjB/K&
@&mv4zz&W
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ) dwPD
YDC[s ^d5
运算符等构成。 y%`^*E&
6hAeLlU1
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 r3_@ L>;
lNls8@
连接。例如: L?4c8!Q
nWmc
SELECT p1.pub_id,p2.pub_id,p1.pr_info tjuW+5O
mNWmp_c,1
FROM pub_info AS p1 INNER JOIN pub_info AS p2 @H1pPr
l J;wl|9
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) L7%Dc2{^(
$2 ~A^#"0
(一)内连接 >umcpkp-h
)Xl/|YD
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 -Ufd+(
y<8)mw
三种: R%8nR6iG"
9I+;waLlB
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 -:*PXu
r >u0Y
表中的所有列,包括其中的重复列。 -"<H$
ATk>:^n
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 `c(,_oa{
.e"De-u
运算符包括>、>=、<=、<、!>、!<和<>。 b4S7Q"g
) m%ghpX
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 v3Te+oLg
Hx62x X
结果集合中所包括的列,并删除连接表中的重复列。 z!D >l
Z\6azhbI}
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: :*)~nPVV
1sGkbfh{t
SELECT * s80:.B
\*v}IO>2})
FROM authors AS a INNER JOIN publishers AS p "Yq-s$yBi
)}]<o
|'
ON a.city=p.city ]J5[ZVz
it D%sKo
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): `i,ZwnLh{
"|.>pD#0&
SELECT a.*,p.pub_id,p.pub_name,p.country f|w+}z
.A&Ey5
FROM authors AS a INNER JOIN publishers AS p +2|X 7wA
>"5^]o2?~l
ON a.city=p.city zPH1{|H+l
uy~5!i&
(二)外连接 @@'zMV%
wvp\'* $
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 hc`9Y
C W7E2
^P$
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 A5F< <
lWd)(9Kj
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 =}Bq"m
7.hVbjy'-
如下面使用左外连接将论坛内容和作者信息连接起来: S%kE<M?
rs=wEMq/
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 3!Rb{
Xi4!7IOmo
ON a.username=b.username f?2Y np=@
!b7]n-1zs
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ` {k>I^Pg
G0^23j
SELECT a.*,b.* Y^2`)':
[o*u!2 r
FROM city as a FULL OUTER JOIN user as b D7 [n^WtL
hG2btmBht
ON a.username=b.username |\XjA4j
Q`,D#V${D
(三)交叉连接 1LJ
?Ka[_*
V4l`Alr\L
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 [WRs1$5
ryW1OV6?_0
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 V%<<Udu<
fP&F$"o8
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 d[kb]lC
n-}:D<\7
于6*8=48行。 yodJGGAzk
4+$<G /K
SELECT type,pub_name ;=5V)1~i1;
NQ'^z
FROM titles CROSS JOIN publishers ^G~W}z?-
% 95:yyH 0
ORDER BY type