一、简单查询 %5_eos&<^)
aBM'ROQ
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 #"M 'Cs
C/P,W>8
表或视图、以及搜索条件等。 |U_48
y\
nR0m
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 3q:-98DT
NVnKgGlHgd
SELECT nickname,email /HNZwbh]uJ
J3sO%4sYR
FROM testtable zXB]Bf3TH
?80@+y]
WHERE name='张三' ;3n0 bKDY
}*n(RnCn
(一)选择列表 VA _O0y2
B;8YX>r
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 I(8,D[G.m
b8J\Lm|J
量和全局变量)等构成。 `>fN?He
@= c{GAj
1、选择所有列 O_f|R1G5z
/$hfd?L
例如,下面语句显示testtable表中所有列的数据: 9 Byk/&$U
SnbH`\U"
SELECT * j$*]'s&_hZ
-Uz
xs5Zl
FROM testtable +a&-'`7g
h^P>pI~
2、选择部分列并指定它们的显示次序 %PG::b
*@Z/L26s;=
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 `4cs.ab
r'hr'wZ
例如: z[Kxy1,
`hM:U
SELECT nickname,email Ep}KIBBO
O.=~/!(
FROM testtable {6<7M
US)wr
3、更改列标题 h<*l=`#
xZ@H{):
在选择列表中,可重新指定列标题。定义格式为: z9$x9u
VEd#LSh
列标题=列名 O0"i>}g4
a4,bP*H
列名 列标题 Do(7LidC5
qy@gW@IU
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 [E(DGt
-p>KFHj6
标题: 1!\!3xa V
)J_!ZpMC
SELECT 昵称=nickname,电子邮件=email RlX;c!K
jh]wHG
FROM testtable OgrUP
;T6^cS{ Gj
4、删除重复行 Cc]s94
~}4o=O(
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 QB@qzgEJ!,
f?F
i{m
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 8'*z>1ZS5
Z`"UT#^SI
5、限制返回的行数 ,ewg3mYHC&
}se)=7d8
Z
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 dv%gmUUf}k
~GfcI:Zz&
表示一百分数,指定返回的行数等于总行数的百分之几。 /,5`#Gte_
>w9)c|
例如: eEn_aX
bm1ngI1oI
SELECT TOP 2 * 5 v~Y>
g_]
u<8&
FROM testtable n<CJx+U
)QTk5zt
SELECT TOP 20 PERCENT * 5vYh~|
"h7-nwm
FROM testtable %>i7A?L
mo#4jtCE
(二)FROM子句 pP?J(0Q~
c6s(f
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, c0<Y017sG
`Dh %c%j)
它们之间用逗号分隔。 Rv q_Zsm
GU'5`Yzd9
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ;lX:EU
D{.%Dr?
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 @D"#B@j
HcHfwLin0
使用下面语句格式加以限定: %8$JL=c
2>fG}qYy$
SELECT username,citytable.cityid yL.si)h(p
'A!Dg
FROM usertable,citytable WGG|d)'@
B0 q![
WHERE usertable.cityid=citytable.cityid 8t}=?:B+{
^Sy\<
在FROM子句中可用以下两种格式为表或视图指定别名: l$,l3
2t[c^J
表名 as 别名 y%TR2CvT
Jkm\{;
表名 别名 <l wI| <
q9WdJ!-^X
例如上面语句可用表的别名格式表示为: RO wbzA)]r
"XC6 l4Z
SELECT username,b.cityid >Fx$Rty
<
q;]
FROM usertable a,citytable b bq[Q
/gy;~eB01
WHERE a.cityid=b.cityid (:+IS
W
r.i.w0B(
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 4C01=,6ye
-ZQ3^'f:0J
例如: &%qD Som3
)r?i^D&4
SELECT a.au_fname+a.au_lname o,\%c"mC
V]k!]
FROM authors a,titleauthor ta a2=wJhk
mu"]B]
(SELECT title_id,title .j}u'!LKul
5\=9&{WjND
FROM titles 1uV_C[:
,C&h~uRi#f
WHERE ytd_sales>10000 6^{ hY^Z
}%k"qW<Y
) AS t <u2*(BM4
fy_'K}i3k
WHERE a.au_id=ta.au_id ]; ^OY\,
#(aROTV5a
AND ta.title_id=t.title_id p6Z]oL q
5)$U<^uy
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 87<y_P@{
mnmwO(.
(三)使用WHERE子句设置查询条件 1v2wP2]|;
sgX}`JH?z
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: <*(~x esPS
p+8]H
%
SELECT * 7vj[ AOq3l
f6|3|
+
FROM usertable &g& &-=7)
=l7LEkR
WHERE age>20 (
?/0$DB
TdQ^^{SRp
WHERE子句可包括各种条件运算符: LG<lZ9+y
7abq3OK+`
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Z:/S@ry
3gabk/
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… W^=89I4]
$\^]MxI
NOT BETWEEN…AND… \o
% ES
r`B+ KQ4
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) t91CxZQ^s
f2yv7t
T
NOT IN (项1,项2……) =]zPUzr,|
f "&q~V4?
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE b%PVF&C9W
}?fa+FQGp
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL J$EEpL
KFfwZkj{
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
gA[M
4l$8lYi
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 _r8AO>
\clWrK
2、列表运算符例:country IN ('Germany','China') so8-e
rk. UW
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 \FKIEg+(2
6op\g].P
varchar、text、ntext、datetime和smalldatetime等类型查询。 XdS<51 C
$ 1dI
可使用以下通配字符: |Q I3H]T7
X4k/7EA
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 F_r eBPx
i@I %$!cB
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ix#
D$mrnm4d
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 ffB]4
xK
y<o
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 A&M/W'$s
>{??/fBd-
例如: >b$<lo
Bhs`Y/Ls-
限制以Publishing结尾,使用LIKE '%Publishing' )?xt=9Lh
F"F(s!
限制以A开头:LIKE '[A]%' 3)-#yOr
CTP%
限制以A开头外:LIKE '[^A]%' d:wAI|
2 sOc]L:9
4、空值判断符例WHERE age IS NULL (qG$u&
4[-9$
r
5、逻辑运算符:优先级为NOT、AND、OR )Z _i[1V
=|#-Rm^YB
(四)查询结果排序 3AL.UBj&}
$I/p 6
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ueg X
iB,*X[}EqG
ORDER BY {column_name [ASC|DESC]} [,…n] U^YPL,m1
5 O6MI4:
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 FD-)nv2:
5;Z~+$1
序。 ""a8eB6
co@8w!W
例如: .iYg RW=T
@t^2/H
?O
SELECT * <|_Ey)1
6
%51pf uL
FROM usertable >I!(CM":s$
zc{C+:3$^
ORDER BY age desc,userid ASC 2~4C5@SxL
P>kx{^
另外,可以根据表达式进行排序。 #RD%GLY
;'Q{ ywr
Rq9gtx8,=
Y5 opZG
二、联合查询 pqr"x2=.
a&[n Vu+
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 BY d3 rI
onlyvH4
合查询。UNION的语法格式为: /PCQv_Y&,/
yh)q96m-V=
select_statement BdKwWgi+a
**"P A8
UNION [ALL] selectstatement @hvq,[
w&gHmi
[UNION [ALL] selectstatement][…n] ;uDFd04w
[
+W1rm$Q
其中selectstatement为待联合的SELECT查询语句。 c9[5)
oEN_,cUp
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 q ^gEA5
W{h7+X]Y
行。 RW)C<g
L; ~=(
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 4jW{IGW
*Tlv'E.M
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 72 6y/o
8xX{y#
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 40E[cGz$*
neBkwXF!
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ;:4puv+]
'$zFGq
}}
型,系统将低精度的数据类型转换为高精度的数据类型。 hMQaT-v
<b\urtoJ
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: MI }D%n*
qSd
$$L^
查询1 UNION (查询2 UNION 查询3) fm*Hk57
r:cUAe7#
4HJrR^
Qi61(lK
S`G\Cd;5
[ZbK)L+_
三、连接查询 &)l:m.
i&$uG[&P
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 v+G:,Tc"
;D1IhDC
数据库管理系统的一个标志。 +\%zy=
f/x "yUq
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 1 W u
SMyg=B\x?7
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 p1nA7;B-m
2&m7pcls
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 1#(1Bs6X
"J#:PfJ%
查询。 -ZB"Yg$l
f+V':qz
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 "->:6Oe2
"Tv7*3>
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ~-+Zu<
L DsYr]
SQL-92标准所定义的FROM子句的连接语法格式为: FScQS.qF
*`#,^p`j
b
FROM join_table join_type join_table TRZ^$<AG
[XXN0+ /
[ON (join_condition)] Y"qY@`
|@BN+o;`Om
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 UVK"%kW#(
[P/gM3*'
个表操作的连接又称做自连接。 v(i Uo&Ge
sfa'\6=O
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 sFQ|lU" n
3_$eQ`AAA
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Ub,unU
U\ued=H
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 F
4/Uu"J:
R=PzR;8
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) d3GK.8y_z
meR2"JN'
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 MlFvDy
*-_Npu6
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Qx;A; n!lw
7o. 'F
数据行。 %jkPrI
}El_.@'T &
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 !U_L7
cy 4'q?r
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Pc'?p
N+5^h(~
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ` qTY
>9`ep7
运算符等构成。 iC]lO
w>uZ$/
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 >{a,]q*
)*ckJK
连接。例如: =]e^8;e9
Q\L5ZJ%y/
SELECT p1.pub_id,p2.pub_id,p1.pr_info Br5Io=/wg
!Yu-a!
FROM pub_info AS p1 INNER JOIN pub_info AS p2 1 1CJT
s? k[_|)!
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) "44?n <1
)*h~dx_c m
(一)内连接 9#ft;c
$x;h[,y
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 K*$#D1hG
<q\)
o_tH
三种: $0T"YC%
2(Uz9!<V
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 2-aYqMmT;
"\;wMR{
表中的所有列,包括其中的重复列。 Bq@wS\W>b}
s2~dmZ_B|_
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 *GP_ut%
GDp p`'\
运算符包括>、>=、<=、<、!>、!<和<>。 !T#y r)
p^P y,
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 OPW"ABJ
CDnz
&?
结果集合中所包括的列,并删除连接表中的重复列。 /T[ICd2J
CDj Dhs
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: e"#D){k#
4Z9wzQ>
SELECT * ~+C?][T
8"mW!M
FROM authors AS a INNER JOIN publishers AS p D^55:\4(
a
+yI2s4Z
ON a.city=p.city !m(L0YH
I^(#\vRW
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 1Uk~m
JyC&L6[]Z
SELECT a.*,p.pub_id,p.pub_name,p.country ?3TV:fx"X
?VQLY=?
FROM authors AS a INNER JOIN publishers AS p /;6@M=6u
0WE1}.J<
ON a.city=p.city ^alZ\!B8
R2THL
(二)外连接 Wx$q:$h@q
FJ8@b
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 K#hY bDm
qO{ ZZ*
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 2,V+?'^j
PMhhPw]
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 1D p@n
_G #"B{7
如下面使用左外连接将论坛内容和作者信息连接起来: ;+34g6
^z}lGu
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ~49N
/I'u/{KB
ON a.username=b.username `(/saq*
e>9Z:vY
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: Yc`j
)kKmgtj
SELECT a.*,b.* o Xi}@
Du:p!nO
FROM city as a FULL OUTER JOIN user as b YQV?S
An #Hb=
ON a.username=b.username s%[GQQ-N
UXPegK!
(三)交叉连接 Wk#h,p3
E8_Le
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 R{uJczu
ttFY
_F~S
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 aq+IC@O
a`b zFu{
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 RE
$3| z
|W*@}D
于6*8=48行。 %=9yzIjbAt
5%?b5(mnD
SELECT type,pub_name RefRoCD1
GyAgPz
FROM titles CROSS JOIN publishers U5CPkH1
Ldhk^/+
ORDER BY type