一、简单查询 7,:$, bL
NR|t~C+
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 lOJ3_8
f'28s*n
表或视图、以及搜索条件等。 QxS=W2iN
Qqn9nO9
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 q{E44
eQ7F
&|&tPD/dJ
SELECT nickname,email T=D|jt
wOU\&u|
FROM testtable fOtzbYVC
JK_(!
WHERE name='张三' uE%$<o*#
o b,%); m
(一)选择列表 I {&8iUN
O\&[|sGY{
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 >J,y1jzJ
\I[50eh|
量和全局变量)等构成。 GO<,zOqvU
N_^s;Qj
1、选择所有列 n)xLEx,
xG"*w@fs7
例如,下面语句显示testtable表中所有列的数据: eGr;P aG
x-%4-)
SELECT * ?Ja&LNI9S
gSn9L)k(O
FROM testtable =/zb$d cz
`+?g96
2、选择部分列并指定它们的显示次序 G}8Zkz@+
~P;KO40K
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 _&xi})E^O]
r>Rm=eKJ
例如: \[yg f6#[
DLBHZ?+!
SELECT nickname,email C0v1x=(xiM
(#?k|e"Y"`
FROM testtable X+LG Z4]D
R m^$Dn
3、更改列标题 5@&{%99
JT(6Uf
在选择列表中,可重新指定列标题。定义格式为: }X?M6;$)
wcW8"J'AH
列标题=列名 (eEs0
T\3aT
列名 列标题 /t"FZ#
O4lHR6M2
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 .`@)c/<0
yuA+YZ
标题: pN?geF~t|
}XcYIo#+t
SELECT 昵称=nickname,电子邮件=email T_3JAH e
XMpa87\
FROM testtable & cV$`L
, tb\^
4、删除重复行 DITo.PU
Ae[Na:G+
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 {2,vxGi
Z\. n6
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 _'Rzu'$`
% 8hjMds
5、限制返回的行数 05PRlz*x=
97 eEqI$#
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 x4=Sm0Ro|V
hw9qnSeRy
表示一百分数,指定返回的行数等于总行数的百分之几。 'h.:-1# L
su\iUi
例如: ;%W]b
YkuFt>U9,
SELECT TOP 2 * 7G]v(ay
vnr{Ekg
FROM testtable 9Q/t+
qr<RMs
SELECT TOP 20 PERCENT * :XFr"aSt
!9p;%Ny`
FROM testtable AS?
ESDC
'JK"3m}nT
(二)FROM子句 ]9]o*{_+(f
oo4aw1d
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, :/<SJ({q
Q}6!t$Vk
它们之间用逗号分隔。 1O,:fTG<
oqUF_kh
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ;U)xZ _Ew~
3Z%~WE;I
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 qEJ#ce]G
!!:mjq<0
使用下面语句格式加以限定: 19j"Zxdg Y
xm$-:N0q
SELECT username,citytable.cityid 9Rd&Jq^
UI%Z`.&
FROM usertable,citytable $s]vZ(H
ZULnS*V;5
WHERE usertable.cityid=citytable.cityid iO@UzD#v
RzOcz=A}
在FROM子句中可用以下两种格式为表或视图指定别名: tN1xZW:
fPBJ%SZ
表名 as 别名 Uu_Es{@
@
Cd#\D|
表名 别名 }5]2tH${
uEui{_2$
例如上面语句可用表的别名格式表示为: {$xt.<
NXHe;G
SELECT username,b.cityid u8Ak2:
aM7=>
FROM usertable a,citytable b s~'"&0Gz
6"YcM:5~
WHERE a.cityid=b.cityid pt$\pQ
SUC'o"
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 fvBL? x
f"RS,]
例如: 4..M *U
N3(.7mxo
SELECT a.au_fname+a.au_lname ORx6r=zg
qd<-{
FROM authors a,titleauthor ta Lvd es.0|
cNl NJ
(SELECT title_id,title L+.&e4f'oj
E< Y!BT[X
FROM titles q>rDxmP<
6m%#cP
(6K
WHERE ytd_sales>10000 z3Zo64V~7
Q].p/-[(
) AS t (Cb;=:3G
\"pp-str
WHERE a.au_id=ta.au_id /Os6i&;
A9_}RJ9
AND ta.title_id=t.title_id !9t,#?!
WCD)yTg:ES
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 z50P*
eS
2!Qg1hM
(三)使用WHERE子句设置查询条件 Xti.yQx\
rU9z? (
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Y*/e;mG.
LU $=j
SELECT * b.j$Gna>Q
alH6~
FROM usertable =&I9d;7
IOT-R!.5V
WHERE age>20 4$+1&+@ ]
`?G&w.Vs
WHERE子句可包括各种条件运算符: ,GF]+nI89
b4&l=^:e=
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ?DGg.2f
QpD-%gN
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… jS ?#c+9
&u2H^ j
NOT BETWEEN…AND… xn=#4:f
%uw7sGz\
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) &WNIL13DK
fE"-W{M
NOT IN (项1,项2……) _#K?yP?
hVIv->
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE =m;,?("7t3
$0Ys{m
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL \ `;1[m
;,/4Ry22j-
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 0^vz /y1c
Lpohc4d[V
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 *,|x
p
zY9CoadZ
2、列表运算符例:country IN ('Germany','China') zygH-3C7o
f?$yxMw:@
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 9ZNzC
i!
$0R5 ]]db)
varchar、text、ntext、datetime和smalldatetime等类型查询。 KM"BHaSkF
iURSYR
可使用以下通配字符: DwGRv:&HH
K@%gvLa\
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 (mplo|>
D#P]tt.Z
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 }
m"':f
@/,0()* dL
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 +
}$(j#h
uFA}w:Fm
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 aLl=L_
k
t'[
例如: }@"v7X $
+p[O|[z
限制以Publishing结尾,使用LIKE '%Publishing' Z;S)GUG^
=YIosmr
限制以A开头:LIKE '[A]%' |ZC'a!
4
|bu= T
限制以A开头外:LIKE '[^A]%' $4*gi&
Yxy!&hPLv:
4、空值判断符例WHERE age IS NULL B2Rpd &[
(|#%omLL
5、逻辑运算符:优先级为NOT、AND、OR [nG[ x|;|
p( )LQT!
(四)查询结果排序 zJ$U5r/u
-g:i'e
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: wwv+s ~(0
v}id/brl
ORDER BY {column_name [ASC|DESC]} [,…n] -?l`LbD
Q~/=p>=uu
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 9R">l5u
#3tC"2MZ
序。 byTHSRt
P,b&F
例如: &-w. rF@
)c?nh3D
SELECT * o^'QGs "
@iMF&\KC
FROM usertable qu^~K.I"
,B /b>i
ORDER BY age desc,userid ASC #2lvRJB
>^IUS8v
另外,可以根据表达式进行排序。 +~*e B
jtq^((Ux
aK]AhOG
-r]L MQ
二、联合查询 `~_H\_JpO
d'H gek{T
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 <>Ha<4A
=E
v T
@25
合查询。UNION的语法格式为: ; xQhq*
ep0dT3&
select_statement gIIF17|Z
r:Q=6j,
UNION [ALL] selectstatement i) Q
d>(v
(i?9/8I
[UNION [ALL] selectstatement][…n] Rlm28
!qHB?]
其中selectstatement为待联合的SELECT查询语句。 `krVfE;_O
r(_Fr#Qn
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 * kUb[
5lM 3In@
行。 d-W*`:Q
TIaiJvo
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 n!lE|if
[9Tnp]q
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 "T<7j.P?
JS<w43/j
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 +%~me?
sEZ2DnDI
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 |?MD>Pez
A@4{-e\
型,系统将低精度的数据类型转换为高精度的数据类型。 JRE\R&>g
nr(C*E
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: -~H
"zu`
ymnK `/J!Q
查询1 UNION (查询2 UNION 查询3) FP0GE
g:p`.KuB
+JXn
A_2lG!!
6
v;}MHl
CP$,fj
三、连接查询 ~3-+~y=o~
?[WUix;
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 -yu$Mm
s&wm^R
数据库管理系统的一个标志。 hAP2DeT$
6{g&9~V
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 M9(lxu y1
"+
k}#<P4\
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 l <Z7bo
r&:yZN
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 :6m"}8*q8
AI,E9
查询。 iV\*7
Gf9O\wrs
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 W3^^aD-
U^K8^an$
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ou]jm=4[
(l(d0g&p>
SQL-92标准所定义的FROM子句的连接语法格式为: |Vu`-L'Jz
ORXH<;^0y
FROM join_table join_type join_table ]XL=S|tIq
F<dhG>E9
[ON (join_condition)] O@:R\MwFOZ
)]E?~ $,
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 rg]z
!.4q{YWcYk
个表操作的连接又称做自连接。 J @IKXhb7_
*xKy^f
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 R+/kx#^
W* n|T{n
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 9o]!D,u8=5
R4zOiBi'B
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 Z]5xy_La
`>lY$EBG@[
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) wNNg"}&P
9OlJC[
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ?/~Q9My
8k.#4}fP
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 "tDB[?
r $ YEq5
数据行。 )2u_[Jc=
UjyrmQf
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 9PaV*S(\TR
, 0?_?
GO
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ^$rqyWZYp
<u?\%iJ"
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 6\y?+H1
'I>geW?{QK
运算符等构成。 1p<*11
z$(`{
o%a
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 4ZYywD wn
64^3ve3/a=
连接。例如: 3b`#)y^y?%
i@%a!].I
SELECT p1.pub_id,p2.pub_id,p1.pr_info 6!=q+sw/X
Zl.,pcL
FROM pub_info AS p1 INNER JOIN pub_info AS p2 eF4f7>5Cv
,WAJ&
'^
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) [EQTrr(
D
rV*Ri~Vx
(一)内连接 `?d`
#)Ck
?-<>he
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 SF"r</c[
R#rfnP >
三种: 5E}]U,$
bJynUZ
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 DD[<J:6
I-Am9\
表中的所有列,包括其中的重复列。 w.+G+r=
~{{7y]3M-
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 `84,R!
xF
3Z>
运算符包括>、>=、<=、<、!>、!<和<>。 $j4/ohwTDY
&,\my-4c>
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 wz Y{ii
y6H`FFqK
结果集合中所包括的列,并删除连接表中的重复列。 O6">Io5
fOP3`G^\
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: y3P4]sq
/
w[Tu
SELECT * yEkwdx5!(
^pqJz^PO.
FROM authors AS a INNER JOIN publishers AS p Q4g69IE
_Y)Wi[
ON a.city=p.city =t.T9'{
Xs~IoU
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): }yd!UU
R\x3'([A5
SELECT a.*,p.pub_id,p.pub_name,p.country #f_.
02YmV%
FROM authors AS a INNER JOIN publishers AS p $Xs`'>,"
YmHu8H_Q
ON a.city=p.city o,/w E
"}S6a?]V
(二)外连接 !';;q
( yB]$
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 \86NV="U
|:L}/onK
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 v"_E0
3!
<2N=cH'
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 z]&?}o
g#G ]}8C
如下面使用左外连接将论坛内容和作者信息连接起来: ezS@`_pR;
{9cjitl
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b zT>BC}~.b
lx> ."rW
ON a.username=b.username lnK#q.]
.kB!',v\
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: /?V-
)kYDN_W
SELECT a.*,b.* Xwd9-:
vX&W;&
FROM city as a FULL OUTER JOIN user as b /*t H$\6*
8/lgM'Eux
ON a.username=b.username }q,d JE
{W=5
J7
(三)交叉连接 \Qf2:[-V0
bYr*rEcA
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 :BB=E'293
yl0;Jx?
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 /0XmU@B
^zfs8]QSf
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 #K!"/,d@>J
I^[[*Bh*C
于6*8=48行。 yI/ FD
RNt9Qdr4y
SELECT type,pub_name Tl1H2s=G-
s&XL