一、简单查询 `O~NT'Ed8
[3$L}m
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 -,xCUG<g
:Y? L*
表或视图、以及搜索条件等。 ;8F|Q<`pV
/zt9;^e
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 4%! #=JCl
(<M^C>pldf
SELECT nickname,email ?yAp&Ad
+65OR'd
FROM testtable #Z;6f{yWf
nsT]Yxo%M
WHERE name='张三' 6yDj1PI
g%C!)UbT
(一)选择列表 K4T#8K]aZF
$}&r.=J".
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 |W't-}yf
}iGpuoXT`
量和全局变量)等构成。 $qz(9M(m#
R$>]7-N}
1、选择所有列 @ P:b\WCI
IE;Fu67wi
例如,下面语句显示testtable表中所有列的数据: {;:QY1QT
48}L!m @
SELECT * C%c}lv8;^
P:~Xaz\F
FROM testtable XOOWrK7O
Z|78>0SAt
2、选择部分列并指定它们的显示次序 M.DU^-7
J#k3iE}
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 cL+--$L
Mn)>G36(
例如:
ywQ>T+
iJ8 5okv'
SELECT nickname,email 8PN/*Sa
.`I;qF
FROM testtable \o|5/N
1yFVF
3、更改列标题 L&D+0p^lI
P<.
TiF?@
在选择列表中,可重新指定列标题。定义格式为: wEQ7=Gyx
=D&xw2
列标题=列名 'A^ ;P]y
tx$i(
列名 列标题 8}B*a;d
Cx
N]fo
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 G,jv Mb`+
#9R[%R7Nz
标题: I
JPpF`
o0yyP,?yh
SELECT 昵称=nickname,电子邮件=email sObH#/l`
M lv
FROM testtable KOQiX?'
1\'?.
4、删除重复行 tVAWc$3T
;f]p`!]
3
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 h;q=<[h\
]1 V,_^D
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ">{Ruv}$
XwZ~pY ~
5、限制返回的行数 [Ej#NHs
\BRxdK'
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ';'TCb{f *
K;n2mXYGM
表示一百分数,指定返回的行数等于总行数的百分之几。 D]n"`< Ho
cpIFjb>u{
例如: p3m!Iota
mbf'xGO
SELECT TOP 2 * 5g x9W\a ?
/]xu=q2
FROM testtable 9S<87sO
\tpJ
SELECT TOP 20 PERCENT * <N4)X"s
\+?>KpE,b
FROM testtable 5hhiP2q
4t C-msTf
(二)FROM子句 4$5d*7
?&ow:OH+
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, >AtW
'}nH\?(
它们之间用逗号分隔。 j{U#g8
|8QXjzH
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 sIVVF#0}]
ZWtlO P#]
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 #NoY}*
3`Ug]<m
使用下面语句格式加以限定: qD/GYqvm
Q3@MRR^tY
SELECT username,citytable.cityid T<jo@z1UL
X@["Jjp
FROM usertable,citytable /~8<;N>,+
2qA"emUM
WHERE usertable.cityid=citytable.cityid ?{)s dJe
;^[VqFpeS
在FROM子句中可用以下两种格式为表或视图指定别名: #5Q?Q~E@
>5O#_?
表名 as 别名 TO,XN\{y
bOB<m4
表名 别名 "k;j@
vU4Gw4
例如上面语句可用表的别名格式表示为: lmsO
6=I4F
fGwRv%$^
SELECT username,b.cityid >}uDQwX8
hJ)\Vo
FROM usertable a,citytable b 3d1$w
UY ^dFbJ
WHERE a.cityid=b.cityid %Voq"}}N
3 L:s5
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 5W Z9z-6
k@[P\(a3b
例如: Fm{/&U^
w[K!m.p,u
SELECT a.au_fname+a.au_lname O<*l"fw3
\68x]q[
FROM authors a,titleauthor ta ?Z1&ju,Hd-
7_=7 ;PQ<
(SELECT title_id,title ]* #k|>Fl
F2N)|C<
FROM titles 1#Ls4+]5
J{69iQ
WHERE ytd_sales>10000 D*nNu]|j
UI?AM 34
) AS t <[oPh(!V
MF41q%9p
WHERE a.au_id=ta.au_id SU`RHAo
\ZOH3`vq
AND ta.title_id=t.title_id (V06cb*42[
mDCz=pk)
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 @W|N1,sp
z{>p<)h
(三)使用WHERE子句设置查询条件 C.#\Pz0
pA%Sybw+
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: h1A/:/_M6
<*Ex6/j
SELECT * 7GFE5>H
hoDE*>i
FROM usertable {9,!XiF.:
C4].egVg
WHERE age>20 9>OPaLn
hoOT]Bsn
WHERE子句可包括各种条件运算符: kp$w)%2JW
5gg
Yg$
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< J8;l G
9_4bw9A
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… \y^Ho1Fj
Twi7g3}/jB
NOT BETWEEN…AND… =dp(+7Va
} vzNh_
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) !Z}d^$
P{gGvC,
NOT IN (项1,项2……) AWG;G+
T`7HQf ;
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE w y\0o
rZi\
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 5.TeH@(
X%sMna)
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR zT< P_l
kLfk2A;' i
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 +%'!+r
l
&|
guPZ
2、列表运算符例:country IN ('Germany','China') nl\l7/}6
|GLh|hr
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 vUNmN2pRJ
A|90Ps
varchar、text、ntext、datetime和smalldatetime等类型查询。 fK?/o]vq
YPU*T&~
可使用以下通配字符: Bokpvd-c7
Ht,dMt>:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 V:Lq>rs#
|({ M8!BS
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 iu$:_W_
~B2,edkM
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 .m^L,;+2
"rJJ~[Y
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 i*\\j1mf
<5t2 +D]]}
例如: EG&97lb
<,:5d2mM.
限制以Publishing结尾,使用LIKE '%Publishing' %%c1@2G<
iKVJ
c=C
限制以A开头:LIKE '[A]%' v*[oe
!^FR a{b
限制以A开头外:LIKE '[^A]%' i
.GJO +K
O`rKxP
4、空值判断符例WHERE age IS NULL = 9K5f#;e
!C3ozZ<
5、逻辑运算符:优先级为NOT、AND、OR p\).zuEf.
|3SM
(四)查询结果排序 QrSF1y'd
# ^q87y
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: xRp;y*
PZ[hH(EX
ORDER BY {column_name [ASC|DESC]} [,…n] lB<
kf1[
[~v1
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 T4fVZd)x
N7l`-y
序。 3X>x`
iU1yJ=
例如: V\6V&_
YA:!ULzR*
SELECT * [zsUboCkc
,CED%
FROM usertable vLT$oiN[c
DPg\y".4Y&
ORDER BY age desc,userid ASC >2BWie?T
}c?W|#y`.o
另外,可以根据表达式进行排序。 /y-eVu6
]Dd}^khv
$sS;#r0
8ZN"-]*
二、联合查询 Muay6b?
`iZ){JfAH
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 @ i*It Hk
Vm]xV_FOd
合查询。UNION的语法格式为: F~Sw-b kSf
\NF5)]:
select_statement $)v`roDD.
HOSt0IHzty
UNION [ALL] selectstatement De^Uc
$GJuS^@%
[UNION [ALL] selectstatement][…n] Tg yY 9
uN*Ynf(:-
其中selectstatement为待联合的SELECT查询语句。 kb~;s-$O`s
j0uu*)Rk
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
HE{JiAf
<.knM
行。 B }t529Z
VtYrU>q
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 z~($
"
X6-;vnlKN
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 iyJx~:
8$~^-_>n/
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ojG;[@V
DcRvZH
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 m'PU0x
svRYdInBNu
型,系统将低精度的数据类型转换为高精度的数据类型。 {g7~e{2
+[B@83
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: :x[SV^fw[
?8!\V NC.
查询1 UNION (查询2 UNION 查询3) 1%$Z%?
JuD&121N*
:>K8oE
QruclNW{Bv
h1Nd1h@-
qtlcY8!
三、连接查询 rr^?9M*{V
=Q~@dP
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 K:q|M?_
&HB!6T/
数据库管理系统的一个标志。 .r~M7 I
IBYSI0
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 d=eIsP'h
Y+nk:9
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 [9d4 0>e
L/xTW
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 \\P*w$c
ksy]t|
查询。 @MKf$O4K
T!X`"rI
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ht_'GBS)
9 GtVcucN
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ^i!I0Q2yd
a`6R}|ZB
SQL-92标准所定义的FROM子句的连接语法格式为: Cg3 d
;[B-!F>
FROM join_table join_type join_table LV@tt&|N
u$<>8aMei
[ON (join_condition)] 4SJb\R)XK
o&MOcy D
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一
bKt4
0]xp"xOwW
个表操作的连接又称做自连接。 |f3 :9(p
QxT\_Nej*n
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 H>F j
p :zRgwcn
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 heScIe
N^`
X16vvsjw5
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 j8W<iy
6z2%/P-'
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) `r]C%Y4?
AP+%T
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 8'M:uI
NA+7ey6
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 zy`T!
$
H'}6Mw%ra
数据行。 >%LY0(hY3
^s\T<;
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 {uurLEe?
S]Ye`
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 rV}&G!V_t
M9~6ry-_
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ~\+Bb8+hpJ
3F32 /_`
运算符等构成。 N(%(B
o ~M=o:^nH
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 7Q9| P?&:z
sGx3O i
连接。例如: W'6sY@0m
<c$rfjM+JU
SELECT p1.pub_id,p2.pub_id,p1.pr_info m qwJya
]CDUHz
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Ax*xa6_2
-""(>$b2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) i,wZNX
zUq(bD
(一)内连接 4 %V9
a n0n8l
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 AdRp{^w
Va A.J
三种: [I}z\3Z
%
mpQu:i|W
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 e.fxB
QH_Ds,oH=
表中的所有列,包括其中的重复列。 10xza=a
biV NZdA
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 gwr?(:?
BjGfUQ
运算符包括>、>=、<=、<、!>、!<和<>。 q:=jv6T#
4s@Tn>%SP
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 'Fql;&U
>
*c
9S.
结果集合中所包括的列,并删除连接表中的重复列。 /vC!__K9:
}X. Fm'`
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: @^/aS;B$>
+ViL"
SELECT * Eu<f
- ,?LS w
FROM authors AS a INNER JOIN publishers AS p $%4<q0-
.osG"cS
ON a.city=p.city qWf[X'
8`6G_:&X
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): j{D tjV8
P-<1vfThH
SELECT a.*,p.pub_id,p.pub_name,p.country
n(|rs
Ow(aRWUZD_
FROM authors AS a INNER JOIN publishers AS p =zu;npM
5A<}*T
ON a.city=p.city ydA@@C\&
p{:y?0pGN
(二)外连接 CM%;/[WBxy
?J-\}X
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 yL),G*[p\}
>TiEYMW
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 /8!n7a7
/;{L~f=et)
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 jT!?lqr(Rb
%hlgLM
如下面使用左外连接将论坛内容和作者信息连接起来: sVGQSJJ5
yFS{8yrRUU
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b RR'sW@
#c":y5:
ON a.username=b.username v+}${h9
:LlZ#V2
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: A}}dc:$C
6nREuT'k
SELECT a.*,b.* 3SI0etVr
HA7%8R*.2i
FROM city as a FULL OUTER JOIN user as b O /:FY1
\w"~DuA
ON a.username=b.username *K|ah:(r1\
zR<fz
(三)交叉连接 9gglyoZ%
O;i0xWUh
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 <EcxNj1
D_1O4/
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Ji:<eRx)
.<Jv=
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 NqGSoOjIO2
8!HB$vdw7
于6*8=48行。 cx ("F/Jm
h&n1}W+
SELECT type,pub_name s~bi#U;dF
~I9o* cq
FROM titles CROSS JOIN publishers "RM\<)IF
7=5eLc^
ORDER BY type