一、简单查询 -L6CEe
zv;xxAX
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Y}2Sr-@u
`[}X_d 1A
表或视图、以及搜索条件等。 zAklS 7L
#XqCz>Z
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ~G=E
Q]a
0T(+z)Ki
SELECT nickname,email ~a_X
7
#%E^cGfY
FROM testtable ,:'JJZg@
@Y.r ,q
WHERE name='张三' "zXrfn
|=,jom
(一)选择列表 HYT~AO-!
qbS6#7D
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 j[w=pF,o
f##/-NG
量和全局变量)等构成。 +%K~
iOb7g@=
1、选择所有列 s]kzXzRC?
J#i7'9g
例如,下面语句显示testtable表中所有列的数据: ]e"!ZR?XJ
, .;0xyc
SELECT * %t!S 7UD
ZADMtsk
FROM testtable >35w"a7S
, u%V%
2、选择部分列并指定它们的显示次序 8c9<kGm$E
]sVWQj
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 =QtFJ9\
Khc^q*|C)
例如: C:5d/9k
G&1bhi52
SELECT nickname,email 9oO~UP!ag
u?dPCgs;h
FROM testtable #m?)XB^_
S-gO
3、更改列标题 LOfw
#+]d
"H`Be
在选择列表中,可重新指定列标题。定义格式为: !Pnjr T
vVa|E#
[
列标题=列名 jED.0,+K!
z
rSPa\M
列名 列标题 EUcD[Rv
kV?fie<\)
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 $>O~7Nfst7
9.M'FCd~M
标题: ;2&"
LAxN?ok9gD
SELECT 昵称=nickname,电子邮件=email 6Nn+7z<*&z
GVnDN~[
FROM testtable
0]c&K
=tt3nfZ9
4、删除重复行 sV%DX5@
Pm/i,T6&\
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 -X$EE$:
Hh=fv~X
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ~KMah
a6DR' BC
5、限制返回的行数 HFy9b|pjy
=ejU(1 g
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Y 2ANt w@
X=]utn
表示一百分数,指定返回的行数等于总行数的百分之几。 A2M(
ad
J}xM+l7uY
例如: 4y7_P0}:B
;n(f?RO3X
SELECT TOP 2 * >iOf3I-ATt
'_.qhsS
FROM testtable qD>^aEd@4
7<WS@-2I#
SELECT TOP 20 PERCENT * Y#68_%[
;HXk'xN
FROM testtable $ -1ajSVJ
k"i3$^v8
(二)FROM子句 Zhfg
ktTP~7UVi
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, wX]$xZ!s
23^>#b7st
它们之间用逗号分隔。 C'$}{%Cc@$
]}rNxT4<
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 BkXv4|UE
{HEWU<5
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 OU,FU@6,7w
)>FAtE
使用下面语句格式加以限定: ekyCZ8iai
o1(;"5MM
SELECT username,citytable.cityid %BkE %ZcZ
ch0^g8@Q[
FROM usertable,citytable a`w=0]1&*
(?1$
WHERE usertable.cityid=citytable.cityid 9#:nlu9
2w7$"N
在FROM子句中可用以下两种格式为表或视图指定别名: Zio!j%G
*Sj)9mp
表名 as 别名 NzQvciJ@"
w ea
表名 别名 F-|DZ?)k5
[l5jPL}6
例如上面语句可用表的别名格式表示为: iw,uwh|L
pwfQqPC#_
SELECT username,b.cityid l.pxDMY
5 [~HL_u;,
FROM usertable a,citytable b EWDsBNZaI
sX~E ~$_g
WHERE a.cityid=b.cityid ZNw|5u^N
_1gNU]"
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 j.Uy>ol
U!|)M
例如: Lbz/M_G
Fw&ImRMk
SELECT a.au_fname+a.au_lname G^d3$7
8` +=~S
FROM authors a,titleauthor ta #(614-r/
75Z|meG~
(SELECT title_id,title md{nHX&
b_ZvI\H
FROM titles e5bXgmyil
bDWLHdu
a
WHERE ytd_sales>10000 akbB=:M,x
m=9b/Nr4
) AS t n+=qT$w)
tP|/Q5s
WHERE a.au_id=ta.au_id g$GGo[_0
QoxYzln
AND ta.title_id=t.title_id i.6 b%
L-?ty@-i
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 tdRvg7v,N%
xbCR4upS
(三)使用WHERE子句设置查询条件 }TMO>eB'
dnD@BQ
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: <MG&3L.[
`:3nF'
SELECT * kB@gy}
Ox J0."
FROM usertable afX|R
y_L8i[
WHERE age>20 hev;M)t
&Pme4IHtm
WHERE子句可包括各种条件运算符: 5OWyxO3{
}d}sC\>U
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< P.Bwfa
-51LF=(!L
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… (Nc~l ^a
k^ZP~.G
NOT BETWEEN…AND… (^iF)z
tUH?N/qn
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) A^).i_
!aUYidd
NOT IN (项1,项2……) AmIW$(Ce
yH"i5L9
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE FW8Zpr!u
}y*D(`
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL Zfk]Z9YO
`Ns@W?
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR (8m_ GfT
j|pTbOgk%
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 $)NS]wJ]3
^X{U7?x
2、列表运算符例:country IN ('Germany','China') *_I`{9~'
\k=dqWBr7
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 F<{,W-my `
jC[_uG
varchar、text、ntext、datetime和smalldatetime等类型查询。 M7?ktK9`ma
(rhlK}
C
可使用以下通配字符: +pG+ xI
o3+s.7 "
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 XgX~K:<jt
8<}=f4vUj5
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ^BLO}9A{P
_fZec+oM
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 .?s jr4
c!
kr
BS
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 pW.WJ`Rk
vC>2%Zgf-
例如: dQSO8Jf
'V^M+ng
限制以Publishing结尾,使用LIKE '%Publishing' h[qZM
4G I3|{
限制以A开头:LIKE '[A]%' !HU$V9C
<QvVPE}z
限制以A开头外:LIKE '[^A]%' .gfi9J
x&DqTX?b,
4、空值判断符例WHERE age IS NULL 7xO05)bz
pLe4dz WA
5、逻辑运算符:优先级为NOT、AND、OR 8/j|=Q,5
;b65s9n^b
(四)查询结果排序 *cM=>3ws/
;UgwV/d
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: sXEIC#rq
)/DN>rU
ORDER BY {column_name [ASC|DESC]} [,…n] G{6@]72
=(hBgNH
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 4|&/#Cz^Y
\^,Jh|T
序。
Hy:x.'i
lHM}
E$5
例如: @mZK[*Ak<*
d+)L K~
SELECT * `:7r5}(^
J?TCP%
FROM usertable yNfj-wM
jt}oq%Bf
ORDER BY age desc,userid ASC _Zav Y<6
tH;9"z#
~
另外,可以根据表达式进行排序。 |-vyhr0
eCKm4l'BZ
P=EZ6<c3&
r6\g#}
二、联合查询 <-N eusx%
!bLCha\
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 eD7\ ,}O
EwG+' nlE
合查询。UNION的语法格式为: <H]PP6_g:
Y_faqmZ9]
select_statement vM5I2C3_>!
Ay6T*Nu`
UNION [ALL] selectstatement QE"$Lc)
,9^ 5
[UNION [ALL] selectstatement][…n] q*R~gEi#yk
M6MxY\uM
其中selectstatement为待联合的SELECT查询语句。 |mG;?>c)
GB `n
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 Bi fI.2|
+e>G V61
行。 (421$w,B%
o"RE4s\G~r
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 @Z$fEG)9
N%:uOX8{
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 R-n%3oh
~7}no}7
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 *tZ3?X[b
+>ituJ
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 N0lFx?4
H"pYj
型,系统将低精度的数据类型转换为高精度的数据类型。 _`QME r?
myXGMN$i
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: >@4Ds"Ye"O
W{ozZuo
查询1 UNION (查询2 UNION 查询3)
ArX*3
1: cq\Y
<5]_u:
7m8:odeF
zXGI{P0O
j }^?Snq
三、连接查询 @AG=Eq9<o
;ACeY
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 tvzO)&)$
)CL/%I,^
数据库管理系统的一个标志。 /%?bO-
,V4pFQzL
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 QQHC
1
&n6
|L8
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 =|- xj h
\hzx?
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
&@7|_60
I GcR5/3
查询。 d9
8pv%
U_B`SS
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 !})3Fb
@izS_I,
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 AQ.q?'vE)
1nLFtiki
SQL-92标准所定义的FROM子句的连接语法格式为: WWTJ%Rd|
Z[j-.,Qu
FROM join_table join_type join_table nDchLVw
S
1Ji\
[ON (join_condition)] f;ycQc@f
wVs |mG"
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 Ox/va]e7"
/ dn]`Ge)
个表操作的连接又称做自连接。 'Uo:b<
;#"`]khd
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 QaEXk5>e
bL7mlh
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 X_|} b[b
WUi7~Ei}
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 Md m(xUs
PsD]gN5"
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 0MzHr2?'P
G}~b
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 r>q`# ~
|b7>kM}"
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 CUw
9aH
~JT{!wcE}o
数据行。 `^N;%[c`z
9k"nx ,"
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的
n#]G!7
ZNA?`Z)f
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 g-(xuR^*
AAl`bhx'n
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 Cw^)}23R
'Ph;:EMj
运算符等构成。 ;[zx'e?!
I2l'y8)d
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 C,z]q$4
pcl_$2_
连接。例如: K|1^?#n
|$ 0/:*
SELECT p1.pub_id,p2.pub_id,p1.pr_info 3 \WdA$Wx
\)"qN^we
FROM pub_info AS p1 INNER JOIN pub_info AS p2 IH0^*f
T<=\5mn
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) n*xNMw1x"T
vA{[F7
(一)内连接 &]c9}Ic
xO@OkCue
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 }w@nZG ^&
aH#|LrdJ
三种: Fu><lN7
\%VoX`B
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 zj)[Sntn?
Te13Af~
表中的所有列,包括其中的重复列。 dk ?0r
p 5'\< gQ
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 0nd<6S+fs
S9BJjo
运算符包括>、>=、<=、<、!>、!<和<>。
t|DYz#]
pL-$Np] V
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ouI0"R&@
Dx%fW`
结果集合中所包括的列,并删除连接表中的重复列。 , $=V
uQNoIy J)
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: wDG4rN9x
WQ]pg
"
SELECT * G#*;3X$
x1et,&,
FROM authors AS a INNER JOIN publishers AS p yC5|"+
A$
U|QDV16f
ON a.city=p.city Lsz`nD5
~eP2PG
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ?~{xL"
xl^'U/
SELECT a.*,p.pub_id,p.pub_name,p.country zkOgL9
(_8
^s*} 0
FROM authors AS a INNER JOIN publishers AS p ;FBc^*q
L5W>in5(
ON a.city=p.city A0ToX) |C
jj2UUQ|
(二)外连接 :KLD~k7yA(
dw|0K+-PH
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ,L;vN6~
`dZ|}4[1
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 6>I.*Qt \l
ZIp=JR8o$
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ;=OH=+Rl
#`$7$Y~]
如下面使用左外连接将论坛内容和作者信息连接起来: qg/5m;U
K;PpS*!
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ^d*>P|n*@e
'Ot[q^,KRG
ON a.username=b.username
_1'Pb/1
%-Z~f~<?
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: h~p}08
s|T7)PgR
SELECT a.*,b.* /(aX>_7jg
=*Xf(mh c
FROM city as a FULL OUTER JOIN user as b >``GDjcJ
val<N293L>
ON a.username=b.username )|x5#b-lz
Cj+=9Dc
(三)交叉连接 U^&Cvxc[[
k Dt)S$N4n
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 {@AcL:Eit
0)!zhO_}
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 E,@UM$alP
:F=nb+HZ
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 _4$DnQ6&
[@Y q^.6t
于6*8=48行。 (q N(#~
UAZ&*{MM^
SELECT type,pub_name >>zoG3H!
w>_EM&r6~u
FROM titles CROSS JOIN publishers Pltju4.:C
oF R'GUQC
ORDER BY type