一、简单查询 ZlwcwoPib
bw<~R2[
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 LRfFn^FPM
/It.>1~2@
表或视图、以及搜索条件等。 FE^?U%:u@
D0,oml
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 [rD+8,zVm
kM6
EZ`mj
SELECT nickname,email SF78s:_!_
H>@JfYZ0
FROM testtable "!w[U{
:7 s#5b
WHERE name='张三' * wQZ'
q/aL8V<"z
(一)选择列表 xKkVSEup
KU8Cl>5
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ;
HR\R
(STWAwK-
量和全局变量)等构成。 g&5pfrC [
p~k`Z^xY$
1、选择所有列 hx2!YNx !
Wr}a\}R
例如,下面语句显示testtable表中所有列的数据: &?uzJx~
s\n,Z?m
SELECT * oeRYyJ
b ?=
FROM testtable gFH;bZU
q%)*,I<
2、选择部分列并指定它们的显示次序 =~(L JPo6
yF [@W<
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 H/ B^N,oi
"pKGUM
例如: iNaC ZC
SOi(5]
SELECT nickname,email ~
33@H
t9=|* =;9)
FROM testtable SFm.<^6
z!uB&2C{k
3、更改列标题 ttJ:[ R'
-*-zU#2|
在选择列表中,可重新指定列标题。定义格式为: ix_$Ok
;d'O. i=
列标题=列名 ?!Th-Cc&m
B'[3kJ '
列名 列标题 _4x[}e7KF
nd*!`P
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 n"`SL<K1
Y/Gswcz
标题: VG*=)8{
[fJFH^&?hr
SELECT 昵称=nickname,电子邮件=email VS@rM<K{
dwsy(g7
FROM testtable FKvO7? K
/*xmv
$
4、删除重复行 eyl) uR
[^"(%{H
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 3M>FU4Ug2
pdXgr)Uv
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 75BOiX
MHzsxF|
5、限制返回的行数 c# 4ZDjvm6
E&Zx]?~
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 "e!$=;5
~wd?-$;070
表示一百分数,指定返回的行数等于总行数的百分之几。 nms<6kfzL
pZ|nn
例如: ,"lBS?
B?zS_Ue
SELECT TOP 2 * kgI.kT(=
GE| ^ryh
FROM testtable 2%No>w}/2
d .lu
SELECT TOP 20 PERCENT * ZkVvL4yIK
-uY:2
FROM testtable Z ysUz
]ge^J3az$u
(二)FROM子句 "Qm~;x2kB
V
IRv
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 5a/
A_..+I
-|iA!w#31
它们之间用逗号分隔。 G^eFS;
ThiPT|5u
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 #I@[^^Vw
bD^ob.c.A
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 K=^_Ndz
i?s&\3--Y
使用下面语句格式加以限定: 07WIa@Q
Ia>th\_&
SELECT username,citytable.cityid 9!/1F !
l`w|o
FROM usertable,citytable `[HoxCV3o
otnY{r*
WHERE usertable.cityid=citytable.cityid n;T
V%KW[v<G<
在FROM子句中可用以下两种格式为表或视图指定别名: UBk
5O&
;>x1)|n5
表名 as 别名 Jhq5G"
1:l&&/Wy
表名 别名 mDt",#g
QBT-J`Pz
例如上面语句可用表的别名格式表示为: . R8W<
$S-;M0G
x
SELECT username,b.cityid 7-0twq
o9SfWErZ
FROM usertable a,citytable b b}{9
:n/SC
KcyM2hE7
WHERE a.cityid=b.cityid PI<s5bns
{
Mm[1Z;H
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 |\L,r}1N
w"Y55EURB
例如: ng)yCa_Ny
[g
68O*
SELECT a.au_fname+a.au_lname K#pt8Q
|k9j )Hg(
FROM authors a,titleauthor ta $TW+LWb
Qmh(+-Mp(
(SELECT title_id,title LCm}v&~%A
=+#RyV
FROM titles +OuG!3+w
sn-+F%[
WHERE ytd_sales>10000 :usBeho
WiCM,wDi
) AS t tf}Q%)`f
thboHPml{
WHERE a.au_id=ta.au_id @^jLYu|W
?ut juMdl
AND ta.title_id=t.title_id 3ncvM>~g
vM;dPE7
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 qk{UO
<
[#h!3d|?B
(三)使用WHERE子句设置查询条件 oUS>p" :
#a>!U'1|
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: G6ES]
P\4o4MF@K
SELECT * TVh7h`Eg
:s985sEv
FROM usertable <cc0 phr
1OwkLy,P
WHERE age>20 &WV 9%fI
e:D9;`C
WHERE子句可包括各种条件运算符: G:s:NXy^
jWmBUHCb
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< >$9yQ9&|
_BA_lkN+D
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… iSW73P;)
|*| a~t
NOT BETWEEN…AND… dWWkO03|
1s\hJATfz
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) D`ge3f8Wi
=ZL}Av}
NOT IN (项1,项2……) DG
FvRB
7I3CPc$
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE xE[tD? M{
gQt@xNO
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL $7
Uk;xV
s3%8W==rBW
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR ="eum7
]ZATER)jq
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 L2A#OZZu
&H>dE]Hq,
2、列表运算符例:country IN ('Germany','China') I,uu>-
cCCplL
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 DLM9o3/*J
8-l Y6M\R\
varchar、text、ntext、datetime和smalldatetime等类型查询。 *N+aZV}`Z
q%&7J<
可使用以下通配字符: ;;H:$lx
6KTY`'I
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 V2* |j8|
Q 8E~hgO
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 }iloX#
.T
X& X
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 oh)l\
UAO#$o(
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 -+Dvyr
W"@lFUi
例如: *\vc_NP]
3k0%H]wt
限制以Publishing结尾,使用LIKE '%Publishing' bj^m<}
v%Q7 \X(
限制以A开头:LIKE '[A]%' }}Uv0g8D
><7`$ 2Or
限制以A开头外:LIKE '[^A]%' 1"6k5wrIA
8H b|'Q|^
4、空值判断符例WHERE age IS NULL ,p1]_D&
ml2z
5、逻辑运算符:优先级为NOT、AND、OR &3?yg61Ag
PFw"ICs
(四)查询结果排序 B.WkHY%/
j( :A
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: zPc;[uHT
dEL"(e#0s4
ORDER BY {column_name [ASC|DESC]} [,…n] $8}'6,
Qq`\C0RZ
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 /)|y+<E]}
,]"u!,yHb
序。 nd1*e
,~iAoxD5jY
例如: 0G 1o3[F
9F4|T7?
SELECT * 3NWAyCq-
21 j+c{O
FROM usertable o$k$
wQ^a2$Z
ORDER BY age desc,userid ASC .).<L`q
Xlw=R2`)~
另外,可以根据表达式进行排序。 8[ OiG9b
2ow\d b
~.PYS!" +
SLo/7$rct
二、联合查询 N9<eU!4>
t}gqk'
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 YPEd
XU8}
es]m 6A
合查询。UNION的语法格式为: !:e
qPpz
/XB1U[b
select_statement 0xcqX!(
b4ivWb |`
UNION [ALL] selectstatement 1hG O*cq!
BI]t}7
[UNION [ALL] selectstatement][…n] G#v7-&Yl6
d`/{0 :F
其中selectstatement为待联合的SELECT查询语句。 9@B+$~:}7
I SmnZ@
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 <,C})H?
T5;D0tM/
行。 2ZeL
D
]eF3a.G
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 iH=@``Z
|_*1/Wz@
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 uBgHtjmae
RI;RE/Z
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ,Pm/ci(s
=x}/q4}L
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 `-\"p;Hp0
-~k2Gy;E
型,系统将低精度的数据类型转换为高精度的数据类型。 jw[`\h}8
b1cd5
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 1P_bG47
?_r"Fg;"
查询1 UNION (查询2 UNION 查询3) _K>m9Q2
<-pbLL 9
8hg(6 XUG
(~oPr+d
Z}wAh|N-
VJaL$Wv)H
三、连接查询 wSMgBRV#^
CHB{P\WF
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 "/"k50%
HvTQycG
数据库管理系统的一个标志。 d6VKUAk'7>
|T%/d#b~
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 [PT_y3'%
5sE}B8
mF
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 vrGNiGIi[
]Y?$[+Y
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 aRmS{X3
V2.K*CpZ7
查询。
#p>PNW-
4E)[<%
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 $;1~JOZh
9[*kpMC
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 y=Hl ~ev`9
($TxVFNT
SQL-92标准所定义的FROM子句的连接语法格式为: D 4wB
&~U
2H#vA
FROM join_table join_type join_table /MC\!,K
+!(hd
[ON (join_condition)] |7-tUHMo[
HNPr|
(
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 ^ytd~iK8
$j/F7.S
个表操作的连接又称做自连接。 : Ej IV]e
!QovpO">z
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 )94R\f
r%m2$vx#
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ln.~ >FO
Mx
}(w\\T
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 :Us-^zVr
Ow
I?(ruL'
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 9[!
Hz)|X
rd RX
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ".u?-xcbJ
0AEs+=
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 aZRgd^4
K*<n<;W
数据行。 9=SZL~#CE
L!Ro`6|7;
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 D-.>Dw:
@'<|B. f
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 82vx:*Ip!}
[I9d
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 }bVyvH
SZPu"O\
运算符等构成。 tv2dyC&a
[Dhc9
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 uP$K{ )
b<8h\fR#'
连接。例如: "J9+~)e^!
SXL6)pX
SELECT p1.pub_id,p2.pub_id,p1.pr_info pV!(#45 ~W
8yo9$~u;
FROM pub_info AS p1 INNER JOIN pub_info AS p2 $
]HI YYs
Du/s
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) $I9zJ"*
:97`IV%
(一)内连接 T2dpn%I
O6pjuhMx
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 }oG&zw
Uu(W62
三种: y^
:x2P
[{ pc1U-
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 4u&doSXR
S92Dvw?
表中的所有列,包括其中的重复列。 }&j&T9oX
zehF/HBzE
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 nxt1Y04,H
cZYX[.oIB
运算符包括>、>=、<=、<、!>、!<和<>。 qH
~usgqB7
bchhokH
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Di6:r3sEO
iY2bRXA
结果集合中所包括的列,并删除连接表中的重复列。 DXUI/C f
b?$3jOtW
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: P'K')]D=!
4q[r
KNl
SELECT * 'Zzm'pC
sxqXR6p{
FROM authors AS a INNER JOIN publishers AS p ,LW0{(&z
-[F^~Gv|;
ON a.city=p.city o+na`ed
Z(Vrmz2.
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): K( p1+GHC
"FU|I1Xz
SELECT a.*,p.pub_id,p.pub_name,p.country E.}Zmr#H
$W09nz9?
FROM authors AS a INNER JOIN publishers AS p li{_biey}
^K"`k43{
ON a.city=p.city ]?r8^L yZ4
i8{jMe!Sa
(二)外连接 5&>(|Y~I
82<L07fB
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 @dXf_2Tv=
CtfSfSAUuu
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 zQ[mO
GA|q[<U
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 SbZk{lWcq
SlZu-4J.-
如下面使用左外连接将论坛内容和作者信息连接起来: S `[8TZ
D >mLSh
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 6/z}-;,W'
O []+v
ON a.username=b.username }PXWRv.gW
f|`{PP`\
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: YGHWO#!Gp
2PC4EjkC
SELECT a.*,b.* 7+ysE
*~vRbD$q
FROM city as a FULL OUTER JOIN user as b \yy!?UlaI
1w5nBVC*$V
ON a.username=b.username Ip4~qGJ
+)Ty^;+[1
(三)交叉连接 YT_kMy>
&F:7U!
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 f`c z@
gR6:J
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 AT%0i
Nwc(<
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 KDhHp^IXQ
=19]a
于6*8=48行。 "P|G^*"~2
d0xV<{,-
SELECT type,pub_name kA3kh`l
yG_#>3sD+%
FROM titles CROSS JOIN publishers s:_5p`w>
J7xZo=@k
ORDER BY type