一、简单查询 hRD=Y<>A
=*c7i]@}
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 (Hb:?(
@a0DT=>dT
表或视图、以及搜索条件等。 Ssou
os:A]
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 _n50C"X=&(
ic#`N0s?
SELECT nickname,email VKG&Y_7N
ijK"^4i
FROM testtable <(fRn`)PT
R?"q]af~
WHERE name='张三' SVh 7zh
\kMefU
(一)选择列表 !W}9no
zkuU5O
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 eo?;`7
o.!~8mD
量和全局变量)等构成。 7`zHX&-W
?IqQ-C)6D
1、选择所有列 OuID%p"O
ogHCt{'
例如,下面语句显示testtable表中所有列的数据: fPR1f~r
`tA"
}1;ka
SELECT * "8x8UgG
iXVe.n
FROM testtable 1AM!8VR2
$!-c-0ub
2、选择部分列并指定它们的显示次序 R6kD=JY/!
r") `Ph@yp
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 "!ug_'VW
[6%VRqY
例如: ^cP!\E-^
;Q OBBF3HG
SELECT nickname,email g"p%C:NN
4~Vx3gEV:
FROM testtable =JK@z
g9}DnCT*.
3、更改列标题 /_AnP
4C61GB?Vy
在选择列表中,可重新指定列标题。定义格式为: NV72
(a.z9nqGA
列标题=列名 M3c$=>
93("oBd[s(
列名 列标题 l1OE!W W
:t8b39
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 Dwr)0nk
cdl&9-}
标题: Wz49i9e+d
vNV/eB8#S
SELECT 昵称=nickname,电子邮件=email `.~N4+SP
Rg\z<wPBG
FROM testtable fk6%XO
A+ZK4]xb
4、删除重复行 la0BiLzb]
([T>.s
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 "d#Y}@*~o
lT(WD}OS
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 V@e?#iz
LrM=*Rh,O
5、限制返回的行数 DCIxRPw
(C-{B[Y
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 r3&G)g=u
|[<_GQl
表示一百分数,指定返回的行数等于总行数的百分之几。 U@_dm/;0&
EUD~CZhS"k
例如: ,
pDnRRJ!
%p^wZtm
SELECT TOP 2 * 8=B|C'>
:DrWq{4
FROM testtable `w#Oih!6A|
v5!d$Vctu
SELECT TOP 20 PERCENT * 2&:f&"
h)ECf?r<
FROM testtable QRc{vUR&
w28o}$b`
(二)FROM子句 @=bLDTx;c)
Q('r<v96
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, `5cKA;j>b
&S{RGXj_
它们之间用逗号分隔。 xu/cq9
qON|4+~u%
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 R&8Iz
yM
H[s(e56z
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 8ndYV>{f
BZ94NOOdw
使用下面语句格式加以限定: fxgPhnaC>
4ni<E*
SELECT username,citytable.cityid #C~+JL
rq8K_zp
FROM usertable,citytable <Swt);
Qi,j+xBp
WHERE usertable.cityid=citytable.cityid [w>$QR
1-%fo~!l
在FROM子句中可用以下两种格式为表或视图指定别名: a,@]8 r-"
>:A ARx%
表名 as 别名 XX7{-Yy
{@H6HqD
表名 别名 .*@;@06?
FOv=!'So
例如上面语句可用表的别名格式表示为: *W4m3Lq
9_# >aOqL
SELECT username,b.cityid 7`-Zuf
J`peX0Stl
FROM usertable a,citytable b 3 R=,1<
`YFtL
WHERE a.cityid=b.cityid 4x{0iav
~bM4[*Q7
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 wxR,OR
;,C)!c&
例如: WZ-s--n#
0t^M3+nc
SELECT a.au_fname+a.au_lname ?J%1#1L"/
B -?6M6#
FROM authors a,titleauthor ta yCd-9zb=
*rM^;4Zt
(SELECT title_id,title ,0~^>K
G"-?&)M#a
FROM titles (7mAt3n
k
(|[2J3ZET
WHERE ytd_sales>10000 @oNH@a
j%
*? 5*m+
) AS t B8nf,dj?X
-E^vLB)O
WHERE a.au_id=ta.au_id bx#>BK!
F |d\k Q
AND ta.title_id=t.title_id +DW~BS3
%}SGl${-
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 RHaI ~jb
:}Xll#.,m
(三)使用WHERE子句设置查询条件 &v$rn#l
mPOGidxix
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: |8&,b`Gfo
:Ux?,
SELECT * Qiua
V@B__`y7
FROM usertable -|J"s$yO4
HKU~UTRnZ
WHERE age>20 nim*/LC[:
3p39`"~
WHERE子句可包括各种条件运算符: @KWb+?_H{<
H35S#+KX
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< J}htu
3/aMJR:o
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… x*![fK
~3Lg"I
NOT BETWEEN…AND… Lrta/SU*
cGtO
+DE
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ta35 K"
DwaBdN[!7
NOT IN (项1,项2……) OglEt[ "
n)L*
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE X>d"]GD
Q;[,Q~c[u
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL `e(c^ z#
qOe+ZAJ{%N
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR VeGL)
aDq5C-MzG
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 y[`l3;u:'
_a5d?Q9Z
2、列表运算符例:country IN ('Germany','China') pf%=h
|
!g?|9
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 `s"'r !
_4rFEYz$d
varchar、text、ntext、datetime和smalldatetime等类型查询。 '[U8}z3
{\S+#W\
可使用以下通配字符: m`v2: S}
#Vl 0.l3
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 *}]Nf
jq-p;-i
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 DQNnNsP:M-
3
*d"B tg
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 &%8'8,.
R%Qf7Q
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 :H7D~ n
"JVkVp[5D+
例如: ]=.\-K
?i)f^O
限制以Publishing结尾,使用LIKE '%Publishing' l,R/Gl
XxT#X3D/,"
限制以A开头:LIKE '[A]%' qd9c I&
vqnw#U4`
限制以A开头外:LIKE '[^A]%' Ipf|")*
!,l9@eJQ
4、空值判断符例WHERE age IS NULL ,LTH;<zB)
VGfMN|h
5、逻辑运算符:优先级为NOT、AND、OR @x9a?L.48
0Oi,#]F
(四)查询结果排序 P7J>+cm
$"`- ^
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: O#x*iI%
3 j!3E
ORDER BY {column_name [ASC|DESC]} [,…n] b_,|>U
uXI_M)
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 X'wE7=29M
|>27'#JC
序。 V_>\9m
ji1viv
例如: YsG%6&zEq
sC27FVwo
SELECT * ;>506jZ
XOxr?NPQ^
FROM usertable vbkI^+=,YY
T:t]"d}}
ORDER BY age desc,userid ASC 4FEk5D
?f#y1m
另外,可以根据表达式进行排序。 n?A6u\sQ
+~'865 {
ICuF %
P1zKsY,l$<
二、联合查询 rW0kA1=E
ZZWD8AX
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 A54N\x,
Dakoqke
合查询。UNION的语法格式为: P#pn*L*"T
^:6{2 2C{
select_statement WxW7qt
~;O v-^tp
UNION [ALL] selectstatement
gG
uZ8:f
<!L>Exh&r
[UNION [ALL] selectstatement][…n] bQE};wM,
k xP-,MD
其中selectstatement为待联合的SELECT查询语句。 uJOJ-5}yt
(H)2s Y
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 4 d;|sI@
VK}fsOnj0
行。
QN@CPuy
I{
HN67O
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 aki_RG>U'
HKF H/eV
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 Kpb#K[(]&
>GQEqXs
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 L~_9_9c
Z= jr-)kK
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 g$(
V^
qi;f^9M%
型,系统将低精度的数据类型转换为高精度的数据类型。 OH;b"]
D0g ZC
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ~}F{vm
=Qh\D
查询1 UNION (查询2 UNION 查询3) NXwz$}}Pp
W4hbK9y
Z&0'a
N U|d
, 3,gG"
.^N/peUq
三、连接查询 @[5xq
Uh7v@YMC
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 =.y~f A!
D<|qaHB=
数据库管理系统的一个标志。 VGtC)mG8)
] x\-$~E
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 eK.e|z|
j2Tr$gx<
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 >"gf3rioW
W4[V}s5u
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 -cZDGt
:80Z6F.k`
查询。 ZaeqOVp/j
*_R]*o!W'
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 [E+$?a=
HHiT]S9
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 W- i&sUgy
Z^V6K3GSz-
SQL-92标准所定义的FROM子句的连接语法格式为: N5* u]j
+u!0rLb
FROM join_table join_type join_table XS`M-{f`
[PQ?#:r
[ON (join_condition)] 7s"<
'cx_F
VS9`{
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 3BB%Z6F
D!.[q -<
个表操作的连接又称做自连接。 ()K " c#
dlJbI}-v=
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 2rmSo&3@s
Yiry["[]Q
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 T_sTC)&a
:/:.Kb
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 8CnRi
an4GSL
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) s4 6}s{6
mocI&=EF2X
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 D@.tkzU@E
_u{c4U0,
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 !O-C,uSm
P8^hBv*
数据行。 { T4
_cy2z
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ,Vh.T&X5
A]YVs
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 \]P!.}nX#
_Dym{!t
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 '3TW [!m
`9)t[7
运算符等构成。 Vl_:c75"
}@Ge}9$h
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 'a$Gv&fu
hGd<<\
连接。例如: @)
s,{F
r`AuvwHPs[
SELECT p1.pub_id,p2.pub_id,p1.pr_info RE=`
^xh}I5
FROM pub_info AS p1 INNER JOIN pub_info AS p2 rFaF
Bd
'|S%aMLZ)
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) w=j
Np'2}6P
(一)内连接 *c%oN
|
o4*+T8[|5
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 ;3\3q1oX
uHAT#\m:
三种: Jd5:{{Lb
k$H%.l;E
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 2 Yp7
0j30LXI_
表中的所有列,包括其中的重复列。 6&bY} i^K
p"l3e9&'j
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 1AG=%F|.
jV?
}9L^;
运算符包括>、>=、<=、<、!>、!<和<>。 d+X}cq=
BNd^qB ?
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 T :/,2.l
]wKz E4Z/
结果集合中所包括的列,并删除连接表中的重复列。 Hir Fl
D8>enum
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: EI_
@y82L8G/
SELECT * wY~&Q}U
*uo'VJI7_,
FROM authors AS a INNER JOIN publishers AS p vC1v"L;[o/
4'-|UPhx
ON a.city=p.city OE4+GI.r-
]8icBneA~'
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): |N}P(GF
:JfE QIN
SELECT a.*,p.pub_id,p.pub_name,p.country DXa=|T
0
;b[QRmy
FROM authors AS a INNER JOIN publishers AS p % ]I ZLJ
/ODXV`3QYI
ON a.city=p.city YO}1(m
wjh=Q
(二)外连接 Zs}5Smjl;%
SB5&A_tr
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 td4[[ /
abJ"
[
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 AJSx%?h:6
qTAc[Ko
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 HsnLm67'
br0++}vwL
如下面使用左外连接将论坛内容和作者信息连接起来: 7\f\!e <
Ee@4 %/v
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b >nw++[K_
n>A98NQ
ON a.username=b.username ~(pmLZ<GW}
lY{FSGp
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: (tCUlX2
vfl5Mx4
SELECT a.*,b.* #% of;mJv
Ya;9]k8,
FROM city as a FULL OUTER JOIN user as b 6I!7c^]t
:=8t"rO=W
ON a.username=b.username c%[#~;E
KN?6;G{
(三)交叉连接 ;zYqsS
a)S+8uU
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ]~6_ WE8L
$Bj;D=d@V
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 -s|}Rh?Y
qNm$Fx
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 jL^](J>
UN%Vg:=
于6*8=48行。 ^S)cjH`P
Pt&(npjN,
SELECT type,pub_name 4'6`Ll|iq
o99pHW(E
FROM titles CROSS JOIN publishers ^)?d6nI
#7ov#_2Jd
ORDER BY type