一、简单查询 _I("k:E7
J 8/]&Ow
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 #cN0ciCT'
7e{w)m:A
表或视图、以及搜索条件等。 5hVp2w-
GI&XL'K&
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 =@98Gl9!
E>/kNl
SELECT nickname,email .L,xqd[zC
N36<EHq
FROM testtable S,K'y?6
^-s'Ad3
WHERE name='张三' i.eu$~F
U_/sY9gz(
(一)选择列表
>dnH
UDJ{iZ
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 Ueq*R(9>
6ty>0
量和全局变量)等构成。 Jj<UtD+
QAp+LSm
1、选择所有列 TRQ@=.
[n[!RddY
例如,下面语句显示testtable表中所有列的数据: 9?VyF'r=
]Iku(<*Ya
SELECT * 9#:b+Amzz
s Zan.Kc#
FROM testtable ;TaR1e0
N;<.::x
2、选择部分列并指定它们的显示次序 d?j_L`?+
\DP*?D_}?
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 )c'5M]V
Ca: jN0
例如: Tgpf0(
*Q?ZJS~
SELECT nickname,email V3<baxdE
y*Egt `W
FROM testtable #6XN_<
B{\cV-X$0
3、更改列标题 0JQ0lzk1
k{*IR
在选择列表中,可重新指定列标题。定义格式为: 2v
^bd^]u:
EhEUkZE3)
列标题=列名 {-(}p+;z
zp"Lp>i
列名 列标题 )!h(o R
Yx- 2ux
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 gW{<:6}!*
'cs!(z-{x
标题: KO`ftz3 +
k7rFbrLZ
SELECT 昵称=nickname,电子邮件=email % D]vKv~<
zTDB]z!A
FROM testtable ?(9/V7HQ.5
t>D|1E"
4、删除重复行 %SKp<>;9
Uu~7+oaQ
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 <h(KIY9T
tx$kD2
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 jo75MSj
7Ao9MF-
5、限制返回的行数 gWt}q-@nRR
J%G
EIe|
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 vwVK^B
&PHejG_#
表示一百分数,指定返回的行数等于总行数的百分之几。 3F5Y#[L`
RlRkw+%m
例如: 8dg\_H_
!.(Kpcrg
SELECT TOP 2 * hT`kma
dP>~ExYtm
FROM testtable 6S#Y$2
P
8@Zg@>,
SELECT TOP 20 PERCENT * +mM=`[Z`??
=T73660
FROM testtable ?F{sym@i
hlY]s
&0
(二)FROM子句 Lu.D,oP
-f&16pc1t
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, P`/;3u/P
yc4?'k!
它们之间用逗号分隔。 -__RFxG
9`83cL
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 F`/-Q>Q
3\x@G)1
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 `Gct_6
Lk?%B)z
使用下面语句格式加以限定: Y ^s_v_s
qPh
@Bl3
SELECT username,citytable.cityid A1b</2
qJjXN+/D
FROM usertable,citytable UDjmXQ2,
~7!=<MW
WHERE usertable.cityid=citytable.cityid \!!qzrq
QucDIZ
在FROM子句中可用以下两种格式为表或视图指定别名: RCXm</
9g*O;0 uz
表名 as 别名 =?o, ' n0
$]V,H"
表名 别名 i!H)@4jX
&|/@;EA$8
例如上面语句可用表的别名格式表示为: 4o+SSS
RJpH1XQ
j
SELECT username,b.cityid O$Wi=5
1u?h4wC
FROM usertable a,citytable b "I[a]T}/
9q
+I
WHERE a.cityid=b.cityid @DiXe[kI
J1i{n7f=@
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 t)#8r,9c
9Fo00"q
例如: L1'PQV
;^XF;zpg
SELECT a.au_fname+a.au_lname 12 8aJ
H1?t2\V4
FROM authors a,titleauthor ta |l4tR
xJG&vOf;?
(SELECT title_id,title -^1}J
8Zj=:;
FROM titles N>R\,n|I
t>hoXn^-
WHERE ytd_sales>10000 ,;3bPjey
QO1pwrX<
) AS t dTV4 Q`Z
F$L2bgQR?'
WHERE a.au_id=ta.au_id 1NHiW
v
&zuPt5G|
AND ta.title_id=t.title_id
j,DF' h
jL9g.q4^
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 o#"U8N%r
NCW<~
(三)使用WHERE子句设置查询条件 q=I8W}Zi
C bWz;$r
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Dno]N
\a#{Y/j3
SELECT * 6?;U[eV
%G'{G
FROM usertable csh@C
ckC8
lN(|EI
WHERE age>20 OD@k9I[
U46qpb7
WHERE子句可包括各种条件运算符: 2 m"2>gX
[b2KBww\
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< .uh>S!X, ]
]%%I=r
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Z\YCjs%
B$ =oU
NOT BETWEEN…AND… /)%$xi
]_"c_QG
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) v3p0
*F<Ar\f5
NOT IN (项1,项2……) (Q]Ww_r~
|wxAdPe
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE DpRGPs
5T*Uq>x0
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL OLH[F
3_DwqZ 'O
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 8O[br@h:5
1>c^-"#e^
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 #QUQC2P(~
#&k`-@b5|
2、列表运算符例:country IN ('Germany','China') 539fB,
jv;8Mm
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、
ff;9P5X
Io;x~i09K
varchar、text、ntext、datetime和smalldatetime等类型查询。 <)qJI'u|
?&`PN<~2z
可使用以下通配字符: Ad}Nc"O
]| xfKDu
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 AjYvYMA&
(]@yDb4
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 5cUz^ >
;b`kN;s
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 e,?qwZK:y
MdC}!&W
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 `i `F$ ;
+=Y[RCXT
例如: lcX'n8/3
>;K!yI?0
限制以Publishing结尾,使用LIKE '%Publishing' "W b>y*S
Q4Zw<IZv5
限制以A开头:LIKE '[A]%' H2jF=U"=
*Cj<Vy
限制以A开头外:LIKE '[^A]%' Z[ 53cVT^
LJgGX,Kp
4、空值判断符例WHERE age IS NULL v:IpZ;^
iW?z2%#
5、逻辑运算符:优先级为NOT、AND、OR qg06*$%
)KdEl9 o
(四)查询结果排序 al{}_1XoU
RM3"8J
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: I3.cy i
Op_(10|
ORDER BY {column_name [ASC|DESC]} [,…n] 3/{,}F$
j5:/Gl8
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 4=nh'
U38
Z~3
序。 Q{o ]^tN
Z[G[.\0
例如: ,%T
sfB
7~qyz]KkE
SELECT * Yq-Vwh/
{9XN\v=$"*
FROM usertable ?APCDZ^
&SW~4 {n:
ORDER BY age desc,userid ASC pwg\b
]<BT+6L
另外,可以根据表达式进行排序。 8x`EUJ
Ods~tM
c }7gHud
YXLZ2-%ohZ
二、联合查询 Vv&GyqoO]
Pb}Iiq=
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 0K(&EpVE
MP|$+yuR~
合查询。UNION的语法格式为: s?Z{LWZ@
p_B5fm7#6W
select_statement `]I p`_{
r>lo@e0G
UNION [ALL] selectstatement sh/4ui{
!BjJ5m
[UNION [ALL] selectstatement][…n] 'j9x(T1M1
u#+Is4Vh
其中selectstatement为待联合的SELECT查询语句。 8dLK5"_3
-4v2]
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 a|-ozBFR
1wy?<B.f
行。 ~,Kx"VK
cB6LJ}R
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 $EnBigb!
AQGl}%k_
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 2AXf'IOqE
':7gYP*v
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Y~B-dx'V
d$HPpi1LL
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 r]deVd G
l@ 5kw]6
型,系统将低精度的数据类型转换为高精度的数据类型。 LO;6g~(1
xz-?sD/xe
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: gs(ZJO1 /L
6J<R;g23R]
查询1 UNION (查询2 UNION 查询3) *o=[p2d"X
&9EcgazV
2-%9k)KH
wW,
n~W
tfdb9#&?
48)D%867.;
三、连接查询 avY<~-44B
.wPI%5D
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 bl-D{)X
GE*%I1?]
数据库管理系统的一个标志。 v(]dIH
y`Zn{mQ@[
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 kA/yL]m^S
:{ Lihe~\
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ^g=j`f[T
I`nC\%g
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 >W6?!ue_
r8>Qs RnU%
查询。 ub]s>aqy
v$Xoxp
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 p^s:s-"f\
ZKJhmk
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 u =lsH
YJ}9VY<}1K
SQL-92标准所定义的FROM子句的连接语法格式为: y9~:[ jB
@!*I
mNMI
FROM join_table join_type join_table 0.&-1pw
V*W H
[ON (join_condition)] [$@EQ]tt/
_Mi*Fvj
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 > .K
lv#L+}T
个表操作的连接又称做自连接。 ?(Xy 2%v
HHL7z,%f
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 SNC)cq+{
Jo\karpb
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 8(]q/g"O
i7mo89S
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 QsBC[7<jd-
T~
P<Gq},
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) k54b@U52 h
pp+z5
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 }J6 y NoXu
$mxl&Qr>Q;
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 $ncP#6
XrJLlH>R4
数据行。 )3ZkKv;zY
~ E n'X4
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 U2
Cmf
QTU$mC]
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 8{ )N%r
;P^}2i[q>[
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 -YS9u[
:464~tHI[`
运算符等构成。 W^i[7 r
ri49r*_1
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 6('CB|ga
T2 TWb
连接。例如: *9US>m Vy
|=[._VH1
SELECT p1.pub_id,p2.pub_id,p1.pr_info @xr}(.
jP.dQj^j&
FROM pub_info AS p1 INNER JOIN pub_info AS p2 G[]h1f!
v)~!HCG
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) K@?K4o
{a,U{YJ\H
(一)内连接 7 iQa)8,
U:gvK8n
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 ^@<Ia-x
D2f~*!vEnA
三种: bp'\nso/
|`d-;pk!%
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 'M
fVZho{
8peK[sz
表中的所有列,包括其中的重复列。 9O\yIL
>gDKkeLD
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 j2oU1' b
p-h(C'PqF
运算符包括>、>=、<=、<、!>、!<和<>。 PJAM_K;
K/$5SN1
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 {Hz;*1?$k
T3t
w.yh
结果集合中所包括的列,并删除连接表中的重复列。 QG5c>Q
,7;euV5X
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: Wf=hFc1_@
}^`5$HEi
SELECT * EJ(z]M`f
<1<0 odB
FROM authors AS a INNER JOIN publishers AS p REPI>-|
=<Ss&p>
ON a.city=p.city Y ^5RM
8-9<r
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): B3p79j
GmZ2a-M
SELECT a.*,p.pub_id,p.pub_name,p.country JykN EMB#
< Q6
FROM authors AS a INNER JOIN publishers AS p b<BkI""b
GD4+f|1.*
ON a.city=p.city LAuaowE\v
%Lom#:L'
(二)外连接 (R!`Z%
,#hNHFa'JH
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 )!5"\eys
HG3iK
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 #66u<FaG
[ub)`-6 u
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 58]t iP"
EV_u8?va
如下面使用左外连接将论坛内容和作者信息连接起来: vkLyGb7r<
k;HI-v
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b Is!+`[ma
7TA&u'
ON a.username=b.username ckbD/+
,S1'SCwVdJ
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 7e H j"_;
Fu65VLKh
SELECT a.*,b.* hmI>
7@&
%V92q0XW
FROM city as a FULL OUTER JOIN user as b x) R4_3
)jMk~;'r
ON a.username=b.username V5+|H1=
fwSI"cfM
(三)交叉连接 RA}Y$ }^#'
`rpmh7*WV
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 Lt{&v^y
uf`/-jY
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 8< z
\j0016;
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 $HAwd6NI
tY60~@YO&
于6*8=48行。 aL/7xa
bK|nxL
SELECT type,pub_name uP1]EA
`)M&^Z=D
FROM titles CROSS JOIN publishers ]E1|^[y
Se[>z(
ORDER BY type