一、简单查询 .s7o$u~l
>9<h?F%S
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 +r4US or
_P,fJ`w
表或视图、以及搜索条件等。 dlJkxEh2
*|_u~v:)|5
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 9e=F
$qg5m,1?
SELECT nickname,email Gp;[WY\
il5WLi;{
FROM testtable 3_^w/-7`B
5T8X2fS:
WHERE name='张三' 1tQZyHc42;
#3kR}Amow
(一)选择列表 2}~1poyi>
',m,wp`
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 &>L\unS
,o*b-Cv/
量和全局变量)等构成。 uDH)0#
<JF78MD\
1、选择所有列 #vLDN R
rIW`(IG_
例如,下面语句显示testtable表中所有列的数据: ;X|;/@@
zr8 4%_^
SELECT * KW+^9&lA
dr,j~ s
FROM testtable 3~s0ux[
6NJ La|&n
2、选择部分列并指定它们的显示次序 U
NQup;#h
9XobTi3+'
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 F ypqf|
MI',E?#yB
例如: 4\Y=*X
[RC|W%<Z>
SELECT nickname,email I>L
lc Y
jqb,^T|j;m
FROM testtable \
{"8(ELX
kJJQcjAP:
3、更改列标题 .7~Kfm@2
U:_T9!fG
在选择列表中,可重新指定列标题。定义格式为: 9dqD(S#C;"
2=F_<Jh|+
列标题=列名 I?bL4u$\
Yk?uxZ4)H
列名 列标题 e!eWwC9u
rLh490@
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ,_\h)R_
<0v'IHlZ8
标题: .N/4+[2p(
u+8_et5T
SELECT 昵称=nickname,电子邮件=email R;I}#b cJ
6<rc]T'|
FROM testtable "i_tO+
iLv"ZqGrw
4、删除重复行 ^4 es
5>h2WL
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 pA+Qb.z5z
X903;&Cim
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 xv4nYm9
bTHJb pt*-
5、限制返回的行数 yMX4 f
%4n=qK9T5
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ZPZ1
7-
[r^f5;Z
表示一百分数,指定返回的行数等于总行数的百分之几。 #?}Y~Oe
Y$oBsg\v
例如: 8ne5 B4
6\~m{@
SELECT TOP 2 * oY +RG|j@
A{&Etu(K
FROM testtable b*P\a
\f /<#'
SELECT TOP 20 PERCENT * 6"&&s
\Cx3^
iX
FROM testtable ->8n.!F}
nqiy)ZN#R
(二)FROM子句 ~)oC+H@{
6JK;]Ah
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, =YLt?5|e
4~Lw:o1a
它们之间用逗号分隔。 sI*( MhU
Z!LzyCVl
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 Lc<Gny^
F!zZIaB]
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 , aawtdt/
Ix1ec^?f
使用下面语句格式加以限定: Zh3]bg5
<@;e N&
SELECT username,citytable.cityid jUBlIVl]
J
)@x:,o
FROM usertable,citytable ~POe0!}
#H7(d T
WHERE usertable.cityid=citytable.cityid 4I {|M,+
Eq'{uV:
在FROM子句中可用以下两种格式为表或视图指定别名: gK#aC[
dQ;rO$co
表名 as 别名 M}38uxP
*dUnP{6 g
表名 别名 ^0X86
[DjdR_9*I
例如上面语句可用表的别名格式表示为: 6
D!,vu
,:=E+sS
SELECT username,b.cityid "#[Y[t\Ia
x`C;
FROM usertable a,citytable b k`\DC\0RG
CgEeO,N]j
WHERE a.cityid=b.cityid 7p u*/W~
.>CqZN,^
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 BT`/OD@
ce+\D'q[
例如: -qx Z3
CHBCi) '6h
SELECT a.au_fname+a.au_lname F\Tlpp9
#c?\(qjWA
FROM authors a,titleauthor ta We9C9)0
F Fg0}
(SELECT title_id,title $7|0{Dw
gI\J sN
FROM titles 3+n&Ya1
\B2=E
WHERE ytd_sales>10000 wXNFL9F8
O- r"G
) AS t [@>Kd`!'
zFQxW4G
WHERE a.au_id=ta.au_id 6PJ0iten
Fnll&TF
AND ta.title_id=t.title_id q;B-np?U
#C!8a
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 #kma)_X
m"+9[d_u
(三)使用WHERE子句设置查询条件 O a-ZeCq
9"MC<
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: yt_?4Hc"
^dqyX(
SELECT * p|AIz3
v\\Z[,dK
FROM usertable 9LCV"xgX
6aMqU?-
WHERE age>20 U_M > Q_r(
$C^94$W
WHERE子句可包括各种条件运算符: S=M$g#X`5
&x;v&
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< <R]?8L0{h
B8B^@
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ^>k [T.
wU+ofj;
+I
NOT BETWEEN…AND… !;iySRZr
skZxR5v3~L
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
WnHf)(J`"
\[Rh\v&
NOT IN (项1,项2……) 4y)"IOd#|
e ~*qi&,4
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE VN`2bp>5I
SjG=H%
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL {\lu; b!
4[+n;OI
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR -?'u"*#1,
m=j7 vb
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ds7I .Q'
-Z6ot{%
2、列表运算符例:country IN ('Germany','China') \Sg&Qv`
'+'
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 u49/LtB\
roL~r`f`
varchar、text、ntext、datetime和smalldatetime等类型查询。 H#wn3O
Ld+}T"Z&M>
可使用以下通配字符: pBmacFP
Mb?6c y[
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 bk#u0N
gpE5ua&
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ot-!_w<
$IB@|n
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 "R):B~8|H{
O!/J2SfuDH
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 bO^%#<7
=_L"x~0I-
例如: 1Qf5H!5vx
Mgf80r=
限制以Publishing结尾,使用LIKE '%Publishing' &)\0mpLK9
JJ7-$h'0q
限制以A开头:LIKE '[A]%' <\Y>y+$3
Y@#~8\_
限制以A开头外:LIKE '[^A]%' 8(uxz84ce
n;O
3.2
4、空值判断符例WHERE age IS NULL DB%=/ \U
3(vI{[yhT
5、逻辑运算符:优先级为NOT、AND、OR Ep?a1&b
:
<m0
GG
(四)查询结果排序 AO/J:`
i3#]_ p{
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: yUNl)E
1N:eM/a
ORDER BY {column_name [ASC|DESC]} [,…n] d![EnkyL;
@@!t$dD
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 )"j_NlO
TKj9s'/
序。 % J+'7'g
^R K[-tVV
例如: "$
u"Py
+J.^JXyp0
SELECT * 5l{_E:.1
ilzR/DJ Ma
FROM usertable y"2#bq
9$#2+G!J
ORDER BY age desc,userid ASC 7xWX:2l*?
#4~Ivj
另外,可以根据表达式进行排序。 bumS>:
!m]76=@
>I!dJH/gj
a=C?fh
二、联合查询 k]I<%
]RGun
GJ
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 <0&];5
on
_K/h/!\n
合查询。UNION的语法格式为: @R`OAdy
?WUu@Z
select_statement ]lm9D@HMC
z2 nDD6N
UNION [ALL] selectstatement F>!fu.Ws
>Q"eaJxE!l
[UNION [ALL] selectstatement][…n] kk^KaD4dA
p/SJt0
其中selectstatement为待联合的SELECT查询语句。 Q,)G_lO
Yckl,g_
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 C]eb=rw$
mufF_e)
行。 @0Tm>s
[&)9|EV
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 bYowEzieF
RHE< QG
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 =Z%&jul
K<\TF+
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 >f}rM20Vm
cAIS?]1
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 W 4 )^8/
O:k@'&
型,系统将低精度的数据类型转换为高精度的数据类型。 ]6}|X#_
F<G.!Y8!&
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: z[CCgs&vqe
`[CXxp
查询1 UNION (查询2 UNION 查询3) /UM9g+Bb
W}JJaZR*X
njvmf*A?S
'B6D&xn'%&
O+z-6:`
+F4xCz7f
三、连接查询 d]w*fn
m!!uf/
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 [.|tD
a-8~f8na{(
数据库管理系统的一个标志。 ]Alu~ Dw
#Wh"_zpM+
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 gp(w6:w
}2JSa8
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带
"&v?>
I,t 0X)
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 GRlA9Q
6t*=.b,N
查询。 zBqr15
qdO^)uJJ
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 C.(<KV{b
,!u^E|24
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 #YhKAG@|
saYn\o"m
SQL-92标准所定义的FROM子句的连接语法格式为: ]3 Mm"7`
F~<$E*&h@
FROM join_table join_type join_table e|]g?!
>TK`s@jdSV
[ON (join_condition)] Y$Os&t@bu
pE15[fJ`
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 M.H4ud
,>"1'i&@
个表操作的连接又称做自连接。 *4=Fy:R]O
Vv6xVX
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 4}#*M2wb
J&
yDX>
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 !tX14O~B-
0H;dA1
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 =XudL^GF
Awe\KJ^`
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) i~k?k.t8
qdUlT*fw
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 F'|,(P
^3AJYu
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 -/7[_,
Tcr&{S&o
数据行。 j+Wgjf
%xWmzdn
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 .{)b^gE
Z&J417buk
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 yTbBYx9Bi
RwT.B+Onuy
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 d|DIqT~{W
p4(-
运算符等构成。 r|rV1<d
cCWOGd
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 -hhE`Y
/sJk[5!z
连接。例如: Cg )#B+
qF( ]Ce
SELECT p1.pub_id,p2.pub_id,p1.pr_info vad" N
<}B|4($
FROM pub_info AS p1 INNER JOIN pub_info AS p2 5F&i/8Ib
]P] lG-
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) c3oI\lU
qY#*zx
(一)内连接 ^W#[6]S
@yobT,DXi
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 XTHrf'BU
'KyT]OObS
三种: |oO0%#1H
bu@Pxz%_
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 *GD 1[:
2NE/ZqREg
表中的所有列,包括其中的重复列。 w&C SE
ux{OgFfi
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 XwlUkw"q
}R}tIC-:
运算符包括>、>=、<=、<、!>、!<和<>。 HQ2in_'
qWQJ>
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 xZ4\.K\f]
>+1^X eeS
结果集合中所包括的列,并删除连接表中的重复列。 c WK@O>
o&I0*~sN
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: y]cx}9~
VVCCPK^<
SELECT * zIRa%%.i<
ho^1T3
FROM authors AS a INNER JOIN publishers AS p R Af+%h*
&QCqaJ-
ON a.city=p.city V 9=y@`;
q@Q|oB0W$)
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): $Q]`+:g*}
7e}p:Vfp
SELECT a.*,p.pub_id,p.pub_name,p.country TpMfk7-
?e&CbVc4
FROM authors AS a INNER JOIN publishers AS p P\SD_8
0r+-}5aSl5
ON a.city=p.city B-M|}T
sM~CP zMa
(二)外连接 +R#*eo;o7
XXe7w3x{
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 (
B50~it
?nUV3#6{
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 7"8HlOHA
4Ag+
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 U.>n]/&
,9W 0fm\t
如下面使用左外连接将论坛内容和作者信息连接起来: vi lNl|
,wZ[Y
3
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 5z El`h
eaF5S'k 4$
ON a.username=b.username V @d:n
9(u2jbA
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: t7)Y@gRy
S :(1=@
SELECT a.*,b.* qJISB7F[%O
1
4(?mM3
FROM city as a FULL OUTER JOIN user as b h"ZF,g;a
:q6hT<f;
ON a.username=b.username yfP&Q<|
QKHm OVh]
(三)交叉连接 rZ0@GA
XUMCz7&j
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 b\^ Sz{
)OjbmU!7
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 UDp"+nS
K8e >sU.
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 |wK)(s
cH2
nG:H
于6*8=48行。 TR
]lP<m
YK"({Z>U
SELECT type,pub_name ZO0_:T#Z
_KD(V2W
FROM titles CROSS JOIN publishers ijoR(R^r
sH+]lTSX6{
ORDER BY type