一、简单查询 ]U!vZY@\
T,@.RF
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 z~L''X7g
sD7Qt
表或视图、以及搜索条件等。 T(MS,AyD]
)y\^5>p[
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 gYA|JFi
AMG}'P:
SELECT nickname,email OKNA36cU'
WM.JoQ
FROM testtable 8B JxD<
$HF. 02{|
WHERE name='张三' U[*VNJSp
WW{5[;LYiB
(一)选择列表 h$)(-_c3
i6?,2\K
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 l)[\TD
<{bQl
L
量和全局变量)等构成。 swYlp
vp?87h
1、选择所有列 nT..+J)
:tp2@*]9Z
例如,下面语句显示testtable表中所有列的数据: NeAkJG=<
iZ<^p1i
SELECT * Yz=(zj
>G$8\&]j
FROM testtable "+/%s#&
N:GS fM@g
2、选择部分列并指定它们的显示次序 F B9PIsFS
j5,1`7\7B
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 DZ92;m
C8rD54A'M
例如: L^i=RGx
5XySF #
SELECT nickname,email n0F.Um
cjAKc|N J
FROM testtable k"\%x=#
26PUO$&b.
3、更改列标题 'bJ!~ML&
NdGIH/Y;M
在选择列表中,可重新指定列标题。定义格式为: [bk2RaX:i
v#0F1a?]D
列标题=列名 _8P"/(
`Rw
Zt4g G KG
列名 列标题 <f.* =/]W2
)b`Xc+{>
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 XTEC0s"F
n|2`y?
标题: m^0r9y,
s0uI;WMg
SELECT 昵称=nickname,电子邮件=email wI><kdz
'?=SnjMX
FROM testtable ma9q?H#X
'N^\9X0
4、删除重复行 !Ob
vQ/}E@?u
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ]Q,;5>#W
9pUvw_9MY
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 B!-hcn]y
EBlfwFd
5、限制返回的行数 #<0Yx9Jh.
(;v)0&h
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 A<P3X/i
5I/wP qR[
表示一百分数,指定返回的行数等于总行数的百分之几。 _OV\W'RrA
q9fCoz
例如: 2 w\$}'
56gpAc
SELECT TOP 2 * ?PVJeFH
y6NOHPp@
FROM testtable BC*vG=a
uT'_}cw
SELECT TOP 20 PERCENT * F}3<q
VH[r@Pn
FROM testtable K*iy ^}
e~R;
2bk
(二)FROM子句 :K.%^ag=j
?#;
oqH<
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, Z0&^U#]
88}+.-3t$
它们之间用逗号分隔。 NbOeF7cq+
rt">xVl
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 PN9^ sLx=
vzV,}
S*c
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 /~3~Xc~=p
:VwU2
使用下面语句格式加以限定: S<}2y 9F
0\v98g<[+
SELECT username,citytable.cityid HUqG)t*c1
Td#D\d\R
FROM usertable,citytable mr:;Wwd
}$M 2XF
WHERE usertable.cityid=citytable.cityid ~3byAL
O@JgVdgf
在FROM子句中可用以下两种格式为表或视图指定别名: ,XT#V\qne
u8ofgcFYE
表名 as 别名 Y `4AML
n\d`Fk
表名 别名 *Q2;bmIc
.5Y%I;~v
例如上面语句可用表的别名格式表示为: $r`K4g
O7@CAr
SELECT username,b.cityid l`lo5:w
`nBCCz'Y!
FROM usertable a,citytable b 5G .Fi21
b
5
o:VixZf
WHERE a.cityid=b.cityid XL[/)lX{
m"Y;GzqQl
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 49f- u
H /Idc,*
例如: Ol ,;BZHc\
.qVz rS
SELECT a.au_fname+a.au_lname gfE<XrG
Zgp]s+%E
FROM authors a,titleauthor ta mv@cGdxu
EtN@ 6xP
(SELECT title_id,title @|Z:7n6S
*8}Y0V\s
FROM titles 1);$#Dlt
k
=! v.VF\;
WHERE ytd_sales>10000 WqN=D5
/CpUq;^
) AS t /64jO?mp
~ILig}I
WHERE a.au_id=ta.au_id j]7|5mC78
Ta #vD_QP
AND ta.title_id=t.title_id xt]Z{:.
:LRR\v0HM
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 wUzQ`h2
NfLvK o8
(三)使用WHERE子句设置查询条件 e;b,7Qw
f`<j(.{9F
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: w+VeT @
UnNvlkjq9
SELECT * 51yIW*
lhg3
}dW
FROM usertable tB.;T0n
a2W}Wb+
WHERE age>20 9fD4xkRS
/nXp5g^6(
WHERE子句可包括各种条件运算符: AoHA+>&U
n<MMO=+bg
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 8?] :>
[+$l/dag
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
{ZFa
+
$mm =$.
NOT BETWEEN…AND…
?7-#iC`
3{_A zL
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) PpMZ-f@
8>x.zO_.c>
NOT IN (项1,项2……) zi:F/TlUC
>JT{~SRB|Y
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE J*6I@_{/U
2{s ND
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 2rHw5Wn]~
Cw?AP6f%
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR iHjo3_g)n
RAKQ+Y"nl
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 A/N*Nc
dsDoPo0!
2、列表运算符例:country IN ('Germany','China') ~\dpD
7'FDI`e[
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 2>Kq)Ii
43rM?_72
varchar、text、ntext、datetime和smalldatetime等类型查询。
N>`+{
wo2^,Y2z+
可使用以下通配字符: TI}H(XL(
pH#&B_S6z=
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 O%9Cq}*
4,9AoK)yp
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 1=#r$H
Z_' %'&Y
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 L*tXy>&b.
?>MD /l(l
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 uZZ[`PA(
e<5+&Cj
例如: :w_F<2d0
0
G_5sF|(mq
限制以Publishing结尾,使用LIKE '%Publishing' yP0P-8
0!=e1_
限制以A开头:LIKE '[A]%' /og}e~q
wI>JOV7
限制以A开头外:LIKE '[^A]%' XBhWj\`(T
,2JqX>On>Y
4、空值判断符例WHERE age IS NULL ZJ"*A+IJx[
s
cR-|GuZ
5、逻辑运算符:优先级为NOT、AND、OR *B}vYX
JmNeqpbB`w
(四)查询结果排序 $Fz/&;KX!
\!ESmxSa;
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: W/oRt<:E
?y<n^`
ORDER BY {column_name [ASC|DESC]} [,…n] %W"\
{\|? {8f
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ORQGay
b("CvD8
序。 gbpm::
n!Y.?mU6
例如: md$[Bs9
]kb%l"&
SELECT * ^'EEry
uNd ;;X
FROM usertable p5F[( H|9
/l(:H
ORDER BY age desc,userid ASC }"m@~kg=
EoU}@MjM~
另外,可以根据表达式进行排序。 S-2xe?sb
w** .8]A"N
h>mQ; L
$L</{bXW
二、联合查询 pMt]wyKr
b@YSrjJ
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 R2]?9\II
F!]UaEmV
合查询。UNION的语法格式为: [-6j4D
+Yi=Wo/
select_statement 9k 7|B>LT
S\0"G*
UNION [ALL] selectstatement 0@AK
Gw+z8^|C&}
[UNION [ALL] selectstatement][…n] DVSYH{U4
(3]7[h7
其中selectstatement为待联合的SELECT查询语句。 1&jX~'
(|U+ (~PJ
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 g<,v2A
;/oMH/,U8
行。 o{-PT'
P:*'x9`
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 P\2QH@p@t
&7@6Y{!/
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 P45q}v
JC =Bxv
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ~]"}s(J;
h@W}xT
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 <[~x]-
$wN'mY
型,系统将低精度的数据类型转换为高精度的数据类型。 $u3N ',&
9MHb<~F
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: R4IFl
z
];uvE? 55
查询1 UNION (查询2 UNION 查询3) -q+Fj;El
c&0IJ7fZG
PKjA@+
R8],}6,;E}
tY[y? DJ
m2_&rjGz
三、连接查询 HvTi^Fb\a
RIJBHOa
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 '|]zBpz
%djx0sy
数据库管理系统的一个标志。 gcv,]v8
%<
W1y
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
Kjf#uU.7
RisrU
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 cA/2,i
c89RuI `B~
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 s#d# *pgzh
*g=*}2
查询。 Q]|+Y0y}X
VS}Vl
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 !4 hs9b
Aga7X@fV(
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 _aDx('
u@gYEx}
SQL-92标准所定义的FROM子句的连接语法格式为: nEGku]pCH{
3)3'-wu
FROM join_table join_type join_table G4RsH/
SU#|&_wtr!
[ON (join_condition)] xeHu-J!P
d9^=#ot
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 GB
!3Z
NKB!_R+
个表操作的连接又称做自连接。 |QzPY8B9O
KGI]W|T
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 tP:xx2N_
v$mA7|(t!
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 pD>3c9J'^F
zh4o<f:-
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 3;M!]9ms
8WyG49eic
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) XG[%oL
1/fvk
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 S3=J1R,
,>g
6OU2~6
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 *Z0}0<
D@Z
5$#<z1M.&
数据行。 UbYKiLDF)
D=OU61AA
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 xp&I~YPH
_E"[%
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 3n/L;T,X
w%ip"GT,
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 B#gmT2L
<B
fwR$
运算符等构成。 },"g*
`C()H@;
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 L{Th>]X
;zOZu~Q|'
连接。例如: \vT8
)\
dKMuo'H'%
SELECT p1.pub_id,p2.pub_id,p1.pr_info YW'Y=*
'v,W
gPe
FROM pub_info AS p1 INNER JOIN pub_info AS p2 AH}
nTm
'0=U+Egp
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) l-Xxv
$wN .~"T
(一)内连接 kQb0pfYs
s R~&S))
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 8%NX)hZyq}
4R0_%x6vG
三种: p!691LI
2KG j !w
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 tb
i;X=5
V|D;7
表中的所有列,包括其中的重复列。 y#MLxm
_I!Xr!!)a0
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ZN)/doK
;klDt|%3j
运算符包括>、>=、<=、<、!>、!<和<>。 .SsIU\[)
\x+DEy'4;5
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 b'&pJ1]]}
$-y+97
结果集合中所包括的列,并删除连接表中的重复列。 she`_'?5
l&rDa=m.J
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: l:ED_env:
0g+@WK6y
SELECT * Brl6r8LGi
s%:fB(
FROM authors AS a INNER JOIN publishers AS p I*ej_cFQ^
JC#@sJ4az)
ON a.city=p.city VgdkCdWRm_
%pt$S~j
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): )_=&)a1U
I45A$nV#Q
SELECT a.*,p.pub_id,p.pub_name,p.country 08f~vw"
lfA
BF
FROM authors AS a INNER JOIN publishers AS p J.&q[
OBl8kH(b>
ON a.city=p.city B -KOf
?
vlGr5#
(二)外连接 d#*5U9\z
8 N` $7^^
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 y((_V%F}
AWi87q
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 (HF,p,h_
4"2/"D0
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 Lr^xp,_ n
EzyIsp> _
如下面使用左外连接将论坛内容和作者信息连接起来: $7r
wara
P=@lkF!\#
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b >R:+ml
YfalsQ8
ON a.username=b.username K4yYNlY
g-^m\>B
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: +,[3a%c)H
q+z\Y?
SELECT a.*,b.* {q)B@#p
:2My|3H\
FROM city as a FULL OUTER JOIN user as b e^GW[lT
OT[m
g4&
ON a.username=b.username 8?YW i
=s]{
(三)交叉连接 8_m9CQ6 i
>FHsZKJ
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 FNM"!z
>l1Yhxd_0*
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 h n|E<
%MJ7u}
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 PQ]9xzOg[
@qDrTH]5
于6*8=48行。 `.W;ptZ6
% 4"~O
_S
SELECT type,pub_name w2+]C&B*
aTm.10{^
FROM titles CROSS JOIN publishers j*u9+.
W~F/ZrT3A
ORDER BY type