一、简单查询
xS=_yO9-
%04:z77
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 c3=-Mq9Q
D:=t*2-Iv
表或视图、以及搜索条件等。 @%6)^]m}r
't
+"k8
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 r_b8,I6{]
r5t;'eCea
SELECT nickname,email _*O7l
3p:=xL
FROM testtable <+V-k|
?qju
DD
WHERE name='张三' d{er|$E?
B4`2.yRis
(一)选择列表 Oo FgQEr@
>vUB%OLyP
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 "6?lQw
e
iaY5JEV:CA
量和全局变量)等构成。 !Tv?%? 2l
CPVzX%=
1、选择所有列 /_]ltX D
:W~6F*A
例如,下面语句显示testtable表中所有列的数据: o^HNF+sm
I[}75:^Rt
SELECT *
+"jl(5Q
;avQ1T'{?g
FROM testtable s(Z(e %
YTQ5sFuGM
2、选择部分列并指定它们的显示次序 j]rXoV>
%1Yz'AiW[
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 oFWt(r
k/% #>
例如: 59V#FWe-
BbFa=H.
SELECT nickname,email Hal7
MP
Z;#%t.
FROM testtable "[k1D_PZ
ful#Px6m
3、更改列标题 FC6x Fg^
d:A}CBTSY
在选择列表中,可重新指定列标题。定义格式为: WrNLGkt
J0=7'@(p
列标题=列名 UcgG
Odm#wL~E
列名 列标题 IE2CRBfs
YQ;
cJ$
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 N1%p"(
bG"HD?A_
标题: "jT#bIm
:4|M
jn
SELECT 昵称=nickname,电子邮件=email S@x}QQ|.
)B6# A0
FROM testtable 1!vPc93 $$
R,%_deV\(
4、删除重复行 n=q=zn;
7AFE-'S
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 hi!`9k
%dc3z"u
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 WJfES2N
{V}qwm?
5、限制返回的行数 +=7:4LFOL
Ejv%,q/T(
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 cph~4wCS[U
-;$nb~y
表示一百分数,指定返回的行数等于总行数的百分之几。 a5|@R<iF
NetYg]8`
例如: ^=^$tF
%,/lqc Fo
SELECT TOP 2 * N>0LQ
MI
jo}1u_OJ
FROM testtable -ey)J
+?t
Z^+rQ.%n"&
SELECT TOP 20 PERCENT * joqWh!kv7U
uMvb-8
FROM testtable r$ =qQ7^#
zN%97q_
(二)FROM子句 @D~B{Hg
,9d9_c.T
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, /%!~x[BeJ>
ND5$bq Nu?
它们之间用逗号分隔。 \@K~L4>
1_uvoFLk
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 tmO`|tn&
eJHp6)2
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ?R|th Z
VevNG*
使用下面语句格式加以限定: }x:0os
4J5pXlzV
SELECT username,citytable.cityid [[WF0q
!;v.>.lw
FROM usertable,citytable OUI6
ax\[
~EEs}i
WHERE usertable.cityid=citytable.cityid 9#qeFBI
pISp*&
在FROM子句中可用以下两种格式为表或视图指定别名: dFW.}"^c
G(/DtY]
表名 as 别名 %?9Ok
z\T Lsx
表名 别名 Lg4YED9#
/ylc*3e'4
例如上面语句可用表的别名格式表示为: 9[VxskEh
0}]SUe^
SELECT username,b.cityid
uFG<UF
qM",( Bh
FROM usertable a,citytable b ]]2k}A[-I
5dl,co{q
WHERE a.cityid=b.cityid w_Uh
Z(e^ iH
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 ?qmp_2:WU
_'!kuE,*1
例如: :U'Cor
H
e)@3m.
SELECT a.au_fname+a.au_lname j+kC-U;
7C7>y/uS
FROM authors a,titleauthor ta 7O)" `
FOH@OY
(SELECT title_id,title \S ."?!U
booRrTS
FROM titles O)]v;9oER
Xgat-cy'DA
WHERE ytd_sales>10000 ~Y7dH
Dn
S_b/DO
) AS t q/PNJ#<
^A9M;q
WHERE a.au_id=ta.au_id p=Y>i 'CG
.tnkT;T
AND ta.title_id=t.title_id ;a
r><w
y9 L14
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。
%w
) +V
d
~`V7B2Y
(三)使用WHERE子句设置查询条件 g`0moXz
[syj#
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: hH>``gK
G$bJ+
SELECT * W\cjdd
,SUT~oETP
FROM usertable taWqSq!
I:l01W;
WHERE age>20 5l{Ts04k%
86
.`T l;
WHERE子句可包括各种条件运算符: r.yK,
mJ5H=&Z
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< S,jZ3^
4_^[=p/R
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… <RXw M6G2
pQa:pX
NOT BETWEEN…AND… ru9zTZZD
vScjq5"p
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) .0p^W9
N|usFqCNk^
NOT IN (项1,项2……) [}z,J"Un
M4yI`dr6
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE :"1|AJo)
]a'99^?\
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL Um`!%
W7sn+g\
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR [?0d~Q(R#
i|WQ0fD
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 4hs)b
Fhf<T`
2、列表运算符例:country IN ('Germany','China') EGVM)ur
eWs&J24
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 P8Qyhc
Ib=x~za@n
varchar、text、ntext、datetime和smalldatetime等类型查询。 qv*7K@
E_T2z4lw
可使用以下通配字符: ==N{1gO]
1q7tiMvV-
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 ino:N5&;;
UL$}{2N,_
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 j<<3Pr
`G9 l
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 S\i@s_
TrS8h^C
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 w_tJ7pz8T
88s/Q0l
例如: 8'
DW#%
~`ny@WD9
限制以Publishing结尾,使用LIKE '%Publishing' };L ^w:
^h' Sla
限制以A开头:LIKE '[A]%' I:cg}JZ>|
i1lBto[
限制以A开头外:LIKE '[^A]%' L{-LX=G^
=c.5874A`
4、空值判断符例WHERE age IS NULL fWnD\mx?0
QS[L~97m2M
5、逻辑运算符:优先级为NOT、AND、OR $'rG-g!f\
=FP0\cQ.
(四)查询结果排序 4GdX/6C.
>$WQxbwM(
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: NoE*/!Sr
ia @'%8
ORDER BY {column_name [ASC|DESC]} [,…n] *cuuzi&
E
H:T
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 FzQTDu9
8.AR.o
序。 9;.(u'y|
D\dWt1n
例如: /AY4M;}p
F,BOgWwP
SELECT * D,v U
"\C$
FROM usertable m,i,n9C->
G2bDf-1ew
ORDER BY age desc,userid ASC x!LQxoNF
aT!'}GjL
另外,可以根据表达式进行排序。 nfSbM3D]h
nn/?fIZN4
Hb} X-6N
H %JaZ?(
二、联合查询 IYn]U4P.
`]Fx.)C#
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 Dl(3wgA
K_)eWf0a
合查询。UNION的语法格式为: R0ID2:i]F
58\&/lYW
select_statement C?v[Z]t
ZYU=\
UNION [ALL] selectstatement zi R5:d3
#6Fez`A
[UNION [ALL] selectstatement][…n] RqEH|EUZ
,mhQ"\ +C
其中selectstatement为待联合的SELECT查询语句。 R'EUV0KX>Y
LEMfG~Czq
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 VVH.2&`I
IN8>ZV`j)
行。 00v&lQBW
0.T4{JS#
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 F'jWV5"*
lO&3{dOYE
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ]D[DU]K
gb
^?l~SS
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 $3`>{3x$
;<yd^Xs
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 {~!q`Dr3?q
@1.QEyXG
型,系统将低精度的数据类型转换为高精度的数据类型。 ?0?
R
Q_* "SRz
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 7S/G
B
HEA#bd\
查询1 UNION (查询2 UNION 查询3) \^ghdU
Dd;Nz
JlMT<;7\
#e'
}.4cr
]f+ csB
p' M%XBu
三、连接查询 I2nF-JzD2a
3vcO!6Z5
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 |f~@8|MQP+
.CL^BiD.D
数据库管理系统的一个标志。 j83p)ido
I}Nd$P)>
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 G!K]W:m
l @^3Exwt
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 )*4fzo
"Rn3lj0
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 |D, +P
JkW9D)6
查询。 a=M\MZK>
H*#s
}9=kZ
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 fRg`UI4w}
*`ZH` V
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 q _-7i
Q+g!V5'
SQL-92标准所定义的FROM子句的连接语法格式为: b
Q]/?cCYV
2M#r]
FROM join_table join_type join_table 3nZo{p:E
PaV-F_2
[ON (join_condition)] `PY>Hgb
%f($*l.
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 jqPkc28
=bEda]
个表操作的连接又称做自连接。 K|dso]b/
w@N
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ^]{R.(#z
ByCnD
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 `jwa<N4e@
7o8{mp'_
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 31/Edd"]
s
kg*
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) os/vtyP:a
[IK )
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 %-d]X{J:
76u&EG%
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 T49zcJf;
zN
[2YJ$
数据行。 eImn+_ N3
0v9rv.Y"
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 HttiX/2~
lP<:tR~K
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 '` pDngX
G "73=8d
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ~%YBI9$+
foQ#a
运算符等构成。 6`f2-f9%iq
">#wOm+ +
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ,yd?gP-O
E9~Ghx.
连接。例如: lT(oL|{#P
;3'.C~
SELECT p1.pub_id,p2.pub_id,p1.pr_info kT;S4B
-wjN"g<
FROM pub_info AS p1 INNER JOIN pub_info AS p2 5}`_x+$%(`
M)U{7c$c7
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 3YVi"
k?2
-|E!e.^7:
(一)内连接 ;VWAf;U;B
$sEy%-
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 'Fmvu
o<N nV
三种: EVoEszR
TYy.jFT-
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 V{JAB]?^
,T2G~^0
表中的所有列,包括其中的重复列。 -;'1^
R)c'#St
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 gvLf|+m
U~pV) J
运算符包括>、>=、<=、<、!>、!<和<>。 P>Ez'C
J>\B`E
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 '_V2!?+RU+
t^w"w`v\u
结果集合中所包括的列,并删除连接表中的重复列。 p\bDY
xXM{pd
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: utIX %0
Nqu>6^-z0
SELECT * t25,0<iW
e d<n9R
FROM authors AS a INNER JOIN publishers AS p ]w.;4`l*
78/Zk}I]
ON a.city=p.city [D!jv"
~c&bH]cj
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): bFW =ylF9
.FLy;_f+
SELECT a.*,p.pub_id,p.pub_name,p.country qTqwPWW*
rwI
FROM authors AS a INNER JOIN publishers AS p 5F~'gLH/F-
~-I+9F
ON a.city=p.city NgY=&W,
ll C#1
(二)外连接 :53)Nv
_]Zs,Hy
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 q#s,-u u
!TUrQ
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ,gS;m
&!'J
;1a~pF S
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 !1ED~3/X
Z
/9>
如下面使用左外连接将论坛内容和作者信息连接起来: CO`_^7o9(
6b:tyQ
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b sJDas,7>
v-PXZ'7~
ON a.username=b.username {|'E
~/P&Tub^
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: \ioH\9
`|/<\
SELECT a.*,b.* (Tbw3ENz
4y+< dw
FROM city as a FULL OUTER JOIN user as b ,]d,-)KX8
f`;j:O
ON a.username=b.username uB]b}"+l
>M`CVUf
(三)交叉连接 bdc&1I$
s#WAR]x0x
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 bLwAXW2K+
iB498t
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 3J5!oF{H
'JRvP!]
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 2'W<h)m)z
>Vwc3d
于6*8=48行。 hK_LEwd;
<?@NRFTe
SELECT type,pub_name 3h *!V6%q
@WVcY:1t#
FROM titles CROSS JOIN publishers /@,j232
]4pkcV
P
ORDER BY type