一、简单查询 7B)1U_L0H
}opw_h+/F
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Ulx]4;uzf
fbU3-L?
表或视图、以及搜索条件等。 lLDZ#'&An
] |nW
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 rlD!%gG2x
*= ?|n
SELECT nickname,email 15hqoo9!
a{.q/Tbt
FROM testtable px"H
x Ek8oc
WHERE name='张三' u>n"FL'e
A&bj l[s
(一)选择列表 a]T&-#c,}
x-e6[_F
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 Lm=;Y6'`N
X fqhD&g
量和全局变量)等构成。 Xh>($ U
?:ZB'G{%E
1、选择所有列 ykx^RmD`~
marZA'u%B1
例如,下面语句显示testtable表中所有列的数据: P.qzP/Ny
I{jvUYrKH
SELECT * ]jFl?LA%7
EG;E !0
FROM testtable tKeTHj;jO
q;")
2、选择部分列并指定它们的显示次序 uINdeq 7|F
C!a1.&HHZ7
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 9&5<ZC-D
".tL+A[
例如: Ff%V1BH[
-X~mW
SELECT nickname,email Cf3!Ud
`r -jWK\
FROM testtable i*Ldec^
k%sH0 9
3、更改列标题 2h'Wu
qO
BUJ\[/
在选择列表中,可重新指定列标题。定义格式为: /rnI"ze`
qfyZda0d
列标题=列名 |7tD&9<
=I'3C']Z W
列名 列标题 o[T+/Ej&
~?AEtl#&"
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 Z(T{K\)uN
1(Ta*"(0Ip
标题: :t{~Mi=T
]MV8rC[\
SELECT 昵称=nickname,电子邮件=email <aJQV)]\
wDZ<UP=X
FROM testtable 12KC4,C&1i
=d<RgwscJ
4、删除重复行 q.VYPkEib
(Z
SaAn),
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 IB/3=4n^|
*iEtXv
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 a+E&{pV
Ki2!sADd
5、限制返回的行数 3 /@z4:p0R
-f)fiQ-<
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 FT@uZWgQ=
M
9t7y
表示一百分数,指定返回的行数等于总行数的百分之几。 b.&WW
rtRbr_
例如: S3E,0%yo+)
&)%+DUV|
SELECT TOP 2 * H<Oo./8+
_*fNa!@hY
FROM testtable ~,b^f{7`!
t?W}=%M[
SELECT TOP 20 PERCENT * {`QHg O
'6#G$
FROM testtable (~=.[Y
En?V\|,
(二)FROM子句 //U1mDFT
?)xIn)#ls
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, h_vTA
w +t@G`d
它们之间用逗号分隔。 hfaU-IPcFX
)U?_&LY)[M
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 :"\,iH
\^c4v\s<o#
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 wZiUzS;v
:$MOdL[ir
使用下面语句格式加以限定: I6W`yh`I)
z1PwupXt1
SELECT username,citytable.cityid <Kd(fFe
Q +^&
FROM usertable,citytable -n|bi cP
1cLtTE
WHERE usertable.cityid=citytable.cityid d(T4Kd$r
{r,Uik-nL
在FROM子句中可用以下两种格式为表或视图指定别名: wA=r]BT
,#A(I#wL~
表名 as 别名 $J`O-"M
h:YD$XE
表名 别名 \k.`xG?
?Z7`TnG$uf
例如上面语句可用表的别名格式表示为: r~t`H*C)}
jxh:z
SELECT username,b.cityid WQK<z!W5
m+kP"]v
FROM usertable a,citytable b {^VtD
W$rWg>4>
WHERE a.cityid=b.cityid ~RhUg~o
#jQauO
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 py*22Ua^
Dcl$?
例如: 6#?T?!vZ
\<4N'|:
SELECT a.au_fname+a.au_lname e1m?g&[
t'eqk#rq
FROM authors a,titleauthor ta ,ks2&e
,=:K&5mCv
(SELECT title_id,title ]pax,|+$C
z%;plMj
FROM titles iC
gZ3M]
:Ha/^cC/3
WHERE ytd_sales>10000 &L;ocd$
BUO5g8m{
) AS t 2ym(fk.6{
)
7/Cg
WHERE a.au_id=ta.au_id PsY![CPrW
T*z]<0E]
AND ta.title_id=t.title_id Xwm3# o.&)
l!mbpFt
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 Z'z)Oo
rbw$=bX}
(三)使用WHERE子句设置查询条件 )g0lI
h0GoF A<
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: m&.LJ*uM\K
I{Zb/}k-
SELECT * RLmOg{L
AjC:E+g
FROM usertable :t}\%%EbmE
_C?j\Wy
WHERE age>20 CdolZW-!"
SepjF
WHERE子句可包括各种条件运算符: {%V(Dd[B6
{i5?R,a)
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< DBT4 W/
"g{q=[U}
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… m|a9T#B(
:RaQ
=C
NOT BETWEEN…AND… C"{^wy{sL
aAo|3KCs
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) WJShN~ E
{keZ_2
NOT IN (项1,项2……) 1|bXIY.J*
+#}GmUwPG$
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE d>NGCe
7FB?t<x
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL B VBn.ut
8:ubtB
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Kb.qv)6i*
D!<F^mtl
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 gD,&TW
?YhDjQs
2、列表运算符例:country IN ('Germany','China') w_9^YO!!
JzyCeM =
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 ,UNb#=it
#lYyL`B+~
varchar、text、ntext、datetime和smalldatetime等类型查询。 6EqA Y`y
q!Du
J
可使用以下通配字符: A~zn;
&qv~)ZM$
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Y0LZbT3
jUe@xis<T
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 o2/:e
wq)*bIv
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 W^(zP/
b IDUa
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 48^-]};
qt"D!S_
例如: A2_ut6&eb
l=@ B 'a
限制以Publishing结尾,使用LIKE '%Publishing' <_EKCk
XlmX3RU
限制以A开头:LIKE '[A]%' ~#-?V[
a)_3r]sv^
限制以A开头外:LIKE '[^A]%' 5ut| eD`3
L*@`i ]jl
4、空值判断符例WHERE age IS NULL mypV[
BI'>\hX/V
5、逻辑运算符:优先级为NOT、AND、OR Ayz*2N`%
> I2rj2M#
(四)查询结果排序 u[>"_!T
v88vr
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: <2$vo
y Zafq"o
ORDER BY {column_name [ASC|DESC]} [,…n] &Mh.PzO=b
SSK}'LQ
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ?=u?u
k<-
PmR].Ohzi
序。 inP2y ?j
c[dSO(=
例如: ,7{|90'V<
~q$]iwwqT
SELECT * S?J!.(
0w?da~
FROM usertable 2d)Dhxzxk
L%'J]HL-
ORDER BY age desc,userid ASC 8 Rx@_
l|CM/(99-
另外,可以根据表达式进行排序。 ["-rDyP
{)YbksrJ{
@rl5k(
J_Lmy7~xbD
二、联合查询 7!O"k#
IH|zNg{\Y
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 TI>5g(:3\
mF4W4~"
合查询。UNION的语法格式为: 5ggyk0
qu=~\t1[6
select_statement Jo? LPR
\6
^q7V%{54
UNION [ALL] selectstatement p`tz*ewC
S%SYvA
[UNION [ALL] selectstatement][…n] *x36;6~W;
-amo8V;2H
其中selectstatement为待联合的SELECT查询语句。 ^y<^hKjV
E`HoJhB
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 &<&tdShI
#s)f3HU>
行。 Y}~sTuWU
r,5e/X
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Mz@{_*2
9~SPoR/_0
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 _O`prX.:B0
~9 >H(c
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 \GFqRRn
=RoE=)1&-
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 `<XS5h
h=
}%g[1
#%(
型,系统将低精度的数据类型转换为高精度的数据类型。 #S>N}<>
lhUGo =
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: E=NjWO
Gu;40)gm
查询1 UNION (查询2 UNION 查询3) U/>I! 7oe
7HkO:/
TWP@\ BQ
>AEp\*
D
T5d]MU
u>XXKlW:
三、连接查询 ;
476t
*5'8jC"2g
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 YPK@BmAdE
rZK h}E
数据库管理系统的一个标志。 -l[H]BAMXy
K,4Ig!
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 z#{Y>.b
FZ*"^=)`G
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 " ityx?
l\_!oa~
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ?1Nz
,Lc$
kQ\GVI11?
查询。 ]TvMT
x[A|@\Z
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 757&bH|a
l)r\SE1
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 y-pdAkDh
:zW? O#aL-
SQL-92标准所定义的FROM子句的连接语法格式为: Z$z-Hx@%
{_7hX`p
FROM join_table join_type join_table @ &jR^`Y.
2/SUEnaLy_
[ON (join_condition)] g[cnaS|?
u#6s^
)W
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 [s}W47N1
wgz]R
个表操作的连接又称做自连接。 Zpd-ob
'o='Q)Dk
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 GRc)3
2,
GMU!GSY
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 \`.v8C>vG
&r,vD,
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 EU(e5vO
Z~:)hwF
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) xI,3(A.
@!;A^<{ka
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 PqspoH
0OI
rtPo)#t
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 )xp3
ElH
/qdv zv%T
数据行。 FH</[7f;@N
|s/)lA:9
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 %YVPm*J~
fR1LVLU
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
b>5*G1
D;sG9Hky
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 0hY3vBQ!
yp~z-aRa
运算符等构成。 ~n -N
2)BO@]n
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 fb Bu^]^S
=8_b&4.:&
连接。例如: QRQ{Bq}#
gY+d[3N
SELECT p1.pub_id,p2.pub_id,p1.pr_info ?;#Q3Y+
`yR/M"u6T
FROM pub_info AS p1 INNER JOIN pub_info AS p2 bAlty}U
HOi~eX1d
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) %XR(K@V
0MpW!|E[b
(一)内连接 L IKuK#
[C!*7h
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 "Lvk?k
)hx
E}Cz(5
三种: [kJ;Uxncz~
p$"~vA .
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 !S~)U{SSK
D)MFii1J~
表中的所有列,包括其中的重复列。 (jKqwVs.:
7<LuL
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 l#uF%;GDX
uV|F3'jT
运算符包括>、>=、<=、<、!>、!<和<>。 5$
How!
x~k3kj
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ESviWCh0Fl
JbEEI(Q>g
结果集合中所包括的列,并删除连接表中的重复列。 c,#=In2
L1_O!EQ
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: aj|3(2;Kp
ll}_EUF|
SELECT * :E{)yT
<\nM5-wR
FROM authors AS a INNER JOIN publishers AS p Tkr~)2,(I!
`;Ui6{|
ON a.city=p.city '!$QI@@
uj;iE
9
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): rHk(@T.]
~LI }
SELECT a.*,p.pub_id,p.pub_name,p.country e!=7VEB
Q>[{9bI4QP
FROM authors AS a INNER JOIN publishers AS p U| yt
YdV.+v(30
ON a.city=p.city JQLQS
P|1 D6
(二)外连接 RrLj5 Jq
j7d^ga-`
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 R;,5LS&*a
shGUG;
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 _I)TO_L;
b73}|4v
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 S%H"i
y
=ZSYg K
如下面使用左外连接将论坛内容和作者信息连接起来: .NWsr*Tel
A46dtFD{
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b CUB;0J(
5>dA7j^v
ON a.username=b.username [cFD\"gJAr
f2tCB1[D+
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: +% <kcc3
ZK?V{X{";
SELECT a.*,b.* |5(CzXR]
;=0-B&+v
FROM city as a FULL OUTER JOIN user as b P:J|![
} A6z%|d
ON a.username=b.username m5/]+xdNX
[4EIy"
(三)交叉连接 ^0"fPG`
GRpwEfG
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 t<+>E_Xw
Z$i?p;HnW
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 n=f?Q=h\3
"4KyJ;RA*
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 GQ85ykky
EId>%0s5
于6*8=48行。 Y q/vym-O5
Gqq<-drR
SELECT type,pub_name %/)z!}{
A+Bq5mik
FROM titles CROSS JOIN publishers DZ`,QWuA
|+~P; fG
ORDER BY type