一、简单查询 hKLCJ#T
}@'$b<!B
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 .f%fHj
K1"*.\?F
表或视图、以及搜索条件等。 V3Q+s8OIF
VM
GS[qrG
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
-D
(2J: #
SELECT nickname,email :cem,#(=
iNtaDX|%/
FROM testtable *'.|9W
r@h5w_9
WHERE name='张三' q<[P6}.
zZPuha8
(一)选择列表 ;qafT@
}C
.h@rLorm>
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 4B =7:r
nm5cpnNl
量和全局变量)等构成。 ~dgDO:)
F\JM\{&F
1、选择所有列 42_`+Vt]d7
;f0I
8i,JN
例如,下面语句显示testtable表中所有列的数据: D/Z6C&/I
X$
0?j1
SELECT * X^}I-M%{m
,<n}W+3
FROM testtable @r/#-?W
jVv0ST*z
2、选择部分列并指定它们的显示次序 ieDk ;
m[?E
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 |oH,
#%a;"w
例如: N..yQ-6x?
&zl|87M
SELECT nickname,email twL3\
}N/B
zT=Ho
FROM testtable j"ThEx0
0bceI
3、更改列标题 .0S~872
Uol|9F
在选择列表中,可重新指定列标题。定义格式为: 1n >X[!
8x
AF;)#T<
列标题=列名 ~P*6ozSYpY
3m]4=
列名 列标题 9_L[w\P|4
|{BIHgMh
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ?{P"O!I{
@TLS<~
标题: iEVb"w059
+X#vVD3"
SELECT 昵称=nickname,电子邮件=email w k(VR
q
MfT>rH
FROM testtable J`peX0Stl
3 R=,1<
4、删除重复行 ypbe!Y<i]
m!|kW{B#A
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 nW PF6V>
_GXk0Ia3`
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 =e/9&993
-V-RP;">
5、限制返回的行数 j`JMeCG=Ee
V, Z|tB^
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 iZ#!O*>
]{)a,c NG
表示一百分数,指定返回的行数等于总行数的百分之几。 4,bv)Im+ `
Ttu2 skcv
例如: sv: 9clJ
nno}e/zqf
SELECT TOP 2 * 6LOnU~l,
&vo--V1|
FROM testtable *? 5*m+
;X8yFq
SELECT TOP 20 PERCENT * EY^1Y3D w0
opY@RJ]
FROM testtable gFeO}otm
+DW~BS3
(二)FROM子句 j-4VB_N@
AYt%`Y.!
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 3C?f(J}
gy,ht3
它们之间用逗号分隔。 Fu
SL}P
ZOft.P O
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 In:9\7~jC
$h2){*5E{
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 w,.+IV$Kk
@GBxL*e
使用下面语句格式加以限定: Sc>,lIM
S'|,oUWDb
SELECT username,citytable.cityid ?zeJ#i
T_s_p
FROM usertable,citytable VvvRRP^q
4H,`]B8(D
WHERE usertable.cityid=citytable.cityid I!^;8Pg
!9u|fnC9
在FROM子句中可用以下两种格式为表或视图指定别名: J4QXz[dG
931bA&SL=/
表名 as 别名 aH 4c02s$
E[2m&3&
表名 别名 N^#ZJoR
di?K"Z>
例如上面语句可用表的别名格式表示为: DNOueU
f1`gdQ)H
SELECT username,b.cityid SFB~
->db
hU(umL<
FROM usertable a,citytable b :V1W/c
{%<OD8>p
WHERE a.cityid=b.cityid oo,uO;0G
Uo-)pFN^
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 7R`M,u~f2^
ql<i] Y
例如: cWEE%
t0/p]=+.p/
SELECT a.au_fname+a.au_lname Te.Y#lCT$
>7wOoK|1'
FROM authors a,titleauthor ta |2?'9<
QP@%(]f G
(SELECT title_id,title ~c8?>oN(
@E^~$-J5j
FROM titles ~;QvWS
z8jk[5z
WHERE ytd_sales>10000 R%Qf7Q
:H7D~ n
) AS t "JVkVp[5D+
ks3`3q 7
WHERE a.au_id=ta.au_id TMAJb+@l:
l,R/Gl
AND ta.title_id=t.title_id XxT#X3D/,"
qd9c I&
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 vqnw#U4`
U1@IX4^2`
(三)使用WHERE子句设置查询条件 , R'@%,/
IC#>X5
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: IM:=@a{
|M>eEE*F<
SELECT * 6BY-^"W5`
!(mjyr
FROM usertable K\>tA)IPSV
kd=GCO
WHERE age>20 dA-2%uJ
nIAx2dh?
WHERE子句可包括各种条件运算符: 8yRJD[/S
r>dwDBE
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< _9faBrzd
fXXr+Mor
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… *"R|4"uy
2Gz}T _e
NOT BETWEEN…AND… * 1T&
-|kA)M[
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) XOxr?NPQ^
vbkI^+=,YY
NOT IN (项1,项2……) z3`-plE
I'\kFjc
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ?f#y1m
n?A6u\sQ
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL +~'865 {
~1cnE:x;V
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR $@sEn4h
bsuus
R9W
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 So{x]x:f
'Hc-~l>D
2、列表运算符例:country IN ('Germany','China') y]2qd35u_A
D5$wTI
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 Q<z_/j9
,%n\=
varchar、text、ntext、datetime和smalldatetime等类型查询。 #?5 (o
8
![|F:
可使用以下通配字符: @*}D$}aR'V
-c(F 1l
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 0FGe=$vD
Uh.oErHQD
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 HqI t74+
hD\rtW
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 2GFLnz
pM x
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 =2[7
E
EzDk}uKY0R
例如: r9X?PA0f
Ae
mDJ8Y
限制以Publishing结尾,使用LIKE '%Publishing' JQ}$Aqk
dODt(J}%
限制以A开头:LIKE '[A]%' #@^t;)|
Q&MZN);.
限制以A开头外:LIKE '[^A]%' 0*%Z's\M"
qi;f^9M%
4、空值判断符例WHERE age IS NULL OH;b"]
D0g ZC
5、逻辑运算符:优先级为NOT、AND、OR ~}F{vm
dArDP[w
(四)查询结果排序 RD\
km)zMoE{c{
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: zfI>qJ+Nqt
8'~[pMn`
ORDER BY {column_name [ASC|DESC]} [,…n] k9)jjR*XxG
6Pnk5ps }h
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 < XP9@t&
' pm2n0
序。 m6n?bEl6I
W)9K`hM6
例如: d_4T}%q
Vm%1> '&
SELECT * $P>`m$(8
szsk;a
FROM usertable 5V5%/FUm
TftHwe):V
ORDER BY age desc,userid ASC L~(_x"uXd
Ae69>bkE0
另外,可以根据表达式进行排序。 r;>*_Oc7g
q2. XoCf
?z}=B
hZh9uI7.
二、联合查询 ^[]}R:
f~Fm4>\(
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 x\F,SEj
-`<kCW"
合查询。UNION的语法格式为: K#*reJ}K
!lEY=1nHOJ
select_statement >wb'QzF:
(ohq0Y
UNION [ALL] selectstatement lrnyk(M}Q.
*F
?8c
[UNION [ALL] selectstatement][…n] /TZOJE(2j
Qi_>Mg`x
其中selectstatement为待联合的SELECT查询语句。 U Z.=aQ}M
(rkyW z
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 !6s"]WvF
V+Cwzc^j
行。 /DQc&.jK
L !=4N!j
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 _7IKzUn9g[
XEn*?.e
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 I*x[:)X8
Jj,U RD&0R
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Gqcq,_?gt
!,[C]Q1
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Vnx,5E&
?"zY"*>4
型,系统将低精度的数据类型转换为高精度的数据类型。 RQ'exc2x0
0GB:GBhZ
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
=i_-F$pV
|AcRIq
查询1 UNION (查询2 UNION 查询3) fRy^Q_~,
g0>,%b
e?_@aa9~@{
WA]c=4S
]Tkc-ez
q6_u@:3u
三、连接查询 JL\w_v
z|asa*
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 t]$P 1*I
Eq$&qV-?(
数据库管理系统的一个标志。 Sp7ld7c
[[>wB[w
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 I4i2+
*l}
T.Ryy"%F
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 U>V&-kxtV
F#5B<I
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 2P/K
K
Jd5:{{Lb
查询。 A,\6nO67
?CC"Yij
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 2 Yp7
{]E+~%Va
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 e&>;*$)
)K,F]fc+O
SQL-92标准所定义的FROM子句的连接语法格式为: H2
$GIY
ZKQG:M~|
FROM join_table join_type join_table @;<ht c
ms!r ef4`+
[ON (join_condition)] e*bH0'; q
]4R[<<hd
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 BNd^qB ?
\e!vj.PU
个表操作的连接又称做自连接。 iXjo[Rz^C
OfctoPP _0
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 M7ers|&{
0PU8#2pR
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 UlAzJO6"
qZ}P*+`Q
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ?;vgUO
uL3Eq>~x
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ,WJH}(h"D
io#&o;M<
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 qduWzxB
nBHnkbKoy
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 ]8icBneA~'
|N}P(GF
数据行。 :JfE QIN
GN!qyT
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 F)+{AQL
?t+5s]
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 % ]I ZLJ
X{we/'>
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 6B@CurgB
VH=S?_RY>
运算符等构成。 PH>
b-n
jM$`(Y
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 3GuH857ov
4O;OjUI0a
连接。例如: qTAc[Ko
~mO62(8m
SELECT p1.pub_id,p2.pub_id,p1.pr_info ep=qf/vd<
7\f\!e <
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Ee@4 %/v
zN{K5<7o
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) \0mb
3Q'
QHWBAGA
(一)内连接 _R.B[\r@
$<^u^q37u
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 "Kc>dJ@W
]S(%[|
三种: /[ 6j)HIS
`)T~psT
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 es>W$QKlo
yv\#8I:qh
表中的所有列,包括其中的重复列。 9*E7}b,
txcf=)@>V
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 Mz1G5xcl
?V}j`r8|\4
运算符包括>、>=、<=、<、!>、!<和<>。 _UT$,0u_i
^2$ lJ
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ^=:9)CNw(
-jn WZ5.
结果集合中所包括的列,并删除连接表中的重复列。 x5QaM.+=J
'0\@Mc U]
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: Pt&(npjN,
4'6`Ll|iq
SELECT * o99pHW(E
^)?d6nI
FROM authors AS a INNER JOIN publishers AS p >0dv+8Mn
M/q E2L[y
ON a.city=p.city ^{xeij/
Zum0J{l
h
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): c-g)eV|)S
@FC"nM
SELECT a.*,p.pub_id,p.pub_name,p.country (`6T&>(4
9elga"4:'
FROM authors AS a INNER JOIN publishers AS p OKi\zS
k6Uc3O
ON a.city=p.city u~3%bJ]
vk>b#%1{
(二)外连接 ~}!3G
&q`q4g&7
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ,(.MmP`
F[4;Xq
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 MB%Q WU
{0;3W7
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 LY[~Os W
xGU(n_Y
如下面使用左外连接将论坛内容和作者信息连接起来: i~3u>CT
3d-%>?-ee
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b hzI|A~MFB
,o^y`l
ON a.username=b.username {tThy#
52.>+GC
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: fZxIY,
n.sbr
SELECT a.*,b.* fM #7 y [
.AYj'Y
FROM city as a FULL OUTER JOIN user as b @"Z7nJX
:> & fV
ON a.username=b.username <\0vR20/
TZtjbD>B
(三)交叉连接 Cn>ADWpT&
k^ YO%_
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 <,AS8^$X[
_DrJVC~6@
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 =l.+,|ZH!
h'$QC )P
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 rJa$9B*^
"+zCS|
于6*8=48行。 sP-^~ pp
@]qBF]6
SELECT type,pub_name 8scc%t7
YPzU-:3
FROM titles CROSS JOIN publishers ;SwMu@tg
-QyhwG=
ORDER BY type