一、简单查询 _5O~]}
fQg^^ZXe"
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 C=U4z|Ym
9f5~hBlo
表或视图、以及搜索条件等。 "{H{-`Ni
(b&Z\?"
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 W[]|Uu/%
,HmGp
SELECT nickname,email ^^tTA^
.pm%qEh
FROM testtable 2Dvq3VbiO"
O&~
@ior
WHERE name='张三' nmE H/a
QQS"K
g
(一)选择列表 yv>uzb`N
i.?rom
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 wN/v-^2
DAORfFG74
量和全局变量)等构成。 u(?U[pe[
bJR\d0Z
1、选择所有列 b].U/=Hs
xXmlHo<D
例如,下面语句显示testtable表中所有列的数据: I69Z'}+qz
]gv3|W
SELECT * O*,O]Q
e7&RZ+s#wZ
FROM testtable H$Pf$D$
-~4kh]7%
2、选择部分列并指定它们的显示次序 2e3AmR@*
-ik((qx_
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 <@+L^Ps~z
NE)w$>0M
例如: M\7F1\ X
t
U~q4$qqE
SELECT nickname,email RF4B]Gqd
VsK8 :[Al
FROM testtable $kMe8F_
m]
p]J_6A
3、更改列标题 ~HT:BO$
%(POC=b#[
在选择列表中,可重新指定列标题。定义格式为: TM_bu
-O/[c
列标题=列名 V2@(BliP
~Hj c?*
列名 列标题 iXXaB+w
Xqew~R^MP
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 jO*H8XO
Qx!Bf_,J
标题: Y( EF )::
F J?]|S.?,
SELECT 昵称=nickname,电子邮件=email <veypLi"R
HTMo.hr
FROM testtable \Ov~ t
c5O8,sT
4、删除重复行 kXUJlLod
F*Yx1vj
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 s+G(N$0U
dpt P(H
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ZGCp[2$
oq1wU@n
5、限制返回的行数 l-h[I>TW
cP@H8|c=
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 fmUrwI1 %
^r7KEeVD
表示一百分数,指定返回的行数等于总行数的百分之几。 .i` -t"
%P#|
}
例如: a8k`Wog
{c drMP@""
SELECT TOP 2 * K!E\v4
p_apVm\t_
FROM testtable f6Y-ss;'
F%%mcmHD#
SELECT TOP 20 PERCENT * wZ`{ i
[kgCB7.V
FROM testtable H&k&mRi
G'nSnw
(二)FROM子句 0XyPG
[E2".F3
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, UalwK
{%,4P_m
它们之间用逗号分隔。 PtL8Kd0`C
.uN(44^+x
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 uLI;_,/:
JZ-64OT
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ]f wW
dtz1
qk0cf~gz
使用下面语句格式加以限定: KRhls"\1
"(';UFa
SELECT username,citytable.cityid pB%oFWqK
^HI2Vp
FROM usertable,citytable zd F;!
e-lc2$o7{
WHERE usertable.cityid=citytable.cityid !I91kJt7
0YoV`D,U
在FROM子句中可用以下两种格式为表或视图指定别名: WBzPSnS2
F)/4#[
表名 as 别名 n 4H'FZ
=~)rT8+)
表名 别名 -G=.3
bux
Y2g%{keo
例如上面语句可用表的别名格式表示为: QNXS.!\P
W3%RB[s-
SELECT username,b.cityid 0}9j l
k@[[vj|W
FROM usertable a,citytable b p2+K-/}ApP
k%s,(2)30
WHERE a.cityid=b.cityid {!.w}
O\%0D.HEz
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 v&f\ Jv7
wg:\$_Og
例如: v9t'CMU
sULsU t#
SELECT a.au_fname+a.au_lname Q(BZg{
6IJ;od.\b$
FROM authors a,titleauthor ta r.=.,R
cnG>EG
(SELECT title_id,title Sm|TDH
Upg8t'%{op
FROM titles nmuU*oL
AOTtAV_e
WHERE ytd_sales>10000 y4&x`|tv
m-cw5lW
) AS t moMNd(p
jpMMnEVj6P
WHERE a.au_id=ta.au_id 7+6I~&x!Lz
7WmY:g#s
AND ta.title_id=t.title_id s]D1s%Mx
k6\&[BQs
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 =<ht@-1
6G_{N.{(
(三)使用WHERE子句设置查询条件 eqWs(`
TA#pA(k
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: h 3 J&
Q,ZV C
SELECT * KT*"Sbh
^
$N3.O.
FROM usertable yv)-QIC3
/7-FVqDx8
WHERE age>20 `)BZk[64
9wdX#=I
WHERE子句可包括各种条件运算符: t0^)Q$
_u~`RlA
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< sc rss
izu_KBzy
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… =">0\#
lr
-+|>M)
NOT BETWEEN…AND… =65XT^
WaE%g
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) z`]:\j'O3"
NZwi3
NOT IN (项1,项2……) Ov.oyke4
J*^ i=y
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE pp
>F)A0v
v\}{eP'
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL B!)Tytm9u
:"Rx$;a
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR dw| VH1fS
98UI]? 4
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 +NOq>kH@
m*KI'~#$%
2、列表运算符例:country IN ('Germany','China') G12o?N0p
4'N 4,3d$
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 _+%p!!
T[J8zLO
varchar、text、ntext、datetime和smalldatetime等类型查询。 "VMb1Zhf
b.)jJLWv@
可使用以下通配字符: ~D/1U)kt
v<| iN#
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 1Z_ H%(
-"bC[ WN
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 w3ZOCWJS
5<7sVd.
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 @ xTVX'$
wV4MP1c$
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Nfmr5MU_
TEC#owz
例如: }rWg']
DMKtTt[}
限制以Publishing结尾,使用LIKE '%Publishing' JDOn`7!w
Z)}2bJwA
限制以A开头:LIKE '[A]%' 0}g~69Z1=
T?7++mcA
限制以A开头外:LIKE '[^A]%' t\n'Kuk`
7De BeY
4、空值判断符例WHERE age IS NULL # `@jVX0
71\GK
5、逻辑运算符:优先级为NOT、AND、OR g$qM}#s0}
$ao7pvU6
(四)查询结果排序 f{{J_""?&
C!Fi &~
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Xpfw2;`U'
}%0X7'
ORDER BY {column_name [ASC|DESC]} [,…n] _gl1Qtv@rf
J!@R0U.
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 t&_X{!1X"w
&(|x-OT
序。 GP`sOPr
s/P+?8'9
例如: cSmy
M~[
H9WXp&
SELECT * e&NJj:Ph*
GX*9R>
FROM usertable &@D\4b,?nm
z<9Llew^e
ORDER BY age desc,userid ASC C879eeJ
@r\{iSg&g.
另外,可以根据表达式进行排序。 q/qig5Ou
h)z2#qfc
:_o^oi7G
oZi{v]4
二、联合查询 U/h@Q\~U
Qp>Z&LvC5
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 D|'[ [=
Xv 7noq|
合查询。UNION的语法格式为: BUyKiMW 49
mR8tW"Z2
select_statement 8K&=]:(
3XNk*Y[5
UNION [ALL] selectstatement &{ZUY3
:b;`.`@KL_
[UNION [ALL] selectstatement][…n] zqp>Xw
EWOa2^%}Z\
其中selectstatement为待联合的SELECT查询语句。 ZM[Z9/S8
ciFqj3JS
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 r5NH*\Q
}$(\,SzW
行。 Fj"/jdM
x]t$Zb/Uxa
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 v'r)d-T
;f)AM}~^Q
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 (,cG+3r]
kX+98?h-C
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 aF>&X-2
9VSi2p*
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 q*cEosi'F?
r^ABu_u(`I
型,系统将低精度的数据类型转换为高精度的数据类型。 T*'WS!z
wGxH
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: sFsf~|
^Ww5@
查询1 UNION (查询2 UNION 查询3) g1Osd7\o
s3VD6xi7
-TS,~`O
8fPTxvXqL
>oC{YYcK
2W#^^4^+
三、连接查询 SnM^T(gtS3
4b6)+*[O
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ^@Z8_PZo
^|2m&2
数据库管理系统的一个标志。 Gz(l~!n~a
PM'2zP[*W
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Z{?T1 =n
>=.3Vydi1
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 Rgl cd
[.&n,.k
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 )mjGHq2
h67{qY[J[
查询。 t=fP^bJ
iU(B#ohW"
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 @ 'U`a4
<-,y0Y'
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 &2I8!Ia
F@zTz54t
SQL-92标准所定义的FROM子句的连接语法格式为: Oz)/KZ
lr@w1*
FROM join_table join_type join_table VCvf'$4(X
ES8(:5
[ON (join_condition)] DhD##5a
<5}j(jxz}
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 : t/0
aX
Ie
个表操作的连接又称做自连接。 ab]Q1kD
wc&D[M]-/
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比
7NnXt'
z#GSt
ZT
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ;<"V},
C
0Gu?;]GSv
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 k"%sdYkb!
n~tb z"&
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) G\^<MR|
O- LwX
>
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 M }q;\}
Y/T-q<ag8
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 C
&y
2I
c;zk{dP
数据行。 OXn-!J90P
O,S>6o)?
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 -)R
=p"-w
$xcZ{C
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 {L [
{JF"PAS7
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 S\!vDtD@
]q4(%Q
运算符等构成。 VE}r'MBk
+;M 5Sp
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 0)ZLdF_6
Qqk(,1u
连接。例如: sf:IA%.4t
emB<{kOkw
SELECT p1.pub_id,p2.pub_id,p1.pr_info o2q-x2uB
p(K^Zc
FROM pub_info AS p1 INNER JOIN pub_info AS p2 tmoaa!yRnT
B]Ec
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) #^R@EZ
;zV<63tW
(一)内连接 uX]]wj-R3
L4bYVTm|
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 yrl7
WNKg>$M
三种: B<n[yiJ}
7S=,#
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 TQ0ZBhd
Sw5:T
表中的所有列,包括其中的重复列。 5HE5$S
=6'bGC%c
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 P ?nk>
gsl_aW!
运算符包括>、>=、<=、<、!>、!<和<>。 ;%^{Zybh
!hHX8TD^J
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 0,Ib74N'w
.yFO]
r1aL
结果集合中所包括的列,并删除连接表中的重复列。 KWAd~8,mk
}[h]z7e2S
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: Z:es7<#y
XXA]ukj;r
SELECT * o=K9\ l
sLXM$SMBh
FROM authors AS a INNER JOIN publishers AS p 65*Hf3~~
w{So(AF
ON a.city=p.city Q1rEUbvCE
NL;sn"
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): $R+gA{49%
#
, eC&X45
SELECT a.*,p.pub_id,p.pub_name,p.country " Up(Vj@
-;FAS3(wy
FROM authors AS a INNER JOIN publishers AS p ;Krb/qr4_
w5
] lU
ON a.city=p.city %Lb
cwh(9
]<L~f~vU
(二)外连接 g j]8/~lr
5\w*W6y
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 <W) F{N?
#g0N/
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 Fq5u%S
!
Vlx
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 cMnN} '
" a,4E{7
如下面使用左外连接将论坛内容和作者信息连接起来: !$>b}w'
9!Jt}n?!g
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b dNF_T?E\
`'k2gq&
ON a.username=b.username
N&kUTSd
* fj`+J
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: pV;0Hcy
w-xigm>{Z
SELECT a.*,b.* >goHQ30:
5??}9
FROM city as a FULL OUTER JOIN user as b ysl#Rwt/2
,J-|.ER->
ON a.username=b.username !!)$?R;1
?%Tx%
dB
(三)交叉连接 b-#lKWso
D6+3f#k6
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 m%>}T75C^
^cSfkBh
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 }#%Ye CA?
-!O8V
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 $`ptSR
"#-iD
于6*8=48行。 (Z[c7
ZH8 w^}
SELECT type,pub_name %#eQN
~
A'b$X1h
FROM titles CROSS JOIN publishers 8"g+
k`PRy
MSeg7/ MF
ORDER BY type