一、简单查询 WpSdukXY{
{l_R0
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 4/Ok/I
RQ}x7</{
表或视图、以及搜索条件等。 ;) (qRZd6
Qzb8*;4?FF
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 &$vDC M4
$ZwsTV]x
SELECT nickname,email y(6&90cr
/Hx%gKU
FROM testtable L=zeFn
.^P^lQT]>
WHERE name='张三' M(? |$$
.t7D/_
(一)选择列表 HTkce,dQ
6q6&N'We
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 `=%[
r")=Z1y
量和全局变量)等构成。 B'atwgI0
9r\8 !R
1、选择所有列 ^ /:]HG
q0DoR@
例如,下面语句显示testtable表中所有列的数据: w?<:`
=NyzX&H6
SELECT * @oYTJd(v{
>:Q:+R;3o
FROM testtable s( 2=E|
|~v($ c
2、选择部分列并指定它们的显示次序 j!:U*}f
] p'+F
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 M}/%t1^g:
cGOE $nL
例如: 3)42EM'9(
-^\k+4;
SELECT nickname,email p~Dm3^Y
UxD1+\N6?
FROM testtable sOU_j4M{
#BlH)Cv
3、更改列标题 @YWfq$23
>G/>:wwSP.
在选择列表中,可重新指定列标题。定义格式为: MH{vFA4:,
mj5A*%"W
列标题=列名 6~$<
I%{^i d@
列名 列标题 YfF&: "-NU
Z0`?
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 S,Zjol %p
{vA;#6B|
标题: *M-.Vor?R
]p+t>'s
SELECT 昵称=nickname,电子邮件=email >Z<ym|(T*
|mY<TWoX
FROM testtable Nk}Hvg*(
'#u2q=n4*
4、删除重复行 bis/Nfr]
N]+x@M @^3
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 If!0w
;h
z-$?.?d
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Er{[83
CdTmL{Y1
5、限制返回的行数 `2r21rVntf
Ldir'FW
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ?xUz{O0/
.7E-
表示一百分数,指定返回的行数等于总行数的百分之几。 /1n}IRuw
sY1@ch"
例如: ;M4N=G Wd4
y^M'&@F
SELECT TOP 2 * 0FTiTrTn
y~ ^>my7G
FROM testtable VFA1p)n
s/Q}fW$ex
SELECT TOP 20 PERCENT * -uO< ]
GXJ3E"_.
FROM testtable `Rj
i=k>
Qyd3e O_
(二)FROM子句 4_r8ynq{z
f()^^ +
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, vbwEX 6
=7Tbu'O;
它们之间用逗号分隔。 dVe3h.,[v
K7e<hdP_#
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 +zL=UEBN
X<-]./
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 u!L8Sv
PO)5L
使用下面语句格式加以限定: `yuD/-j
DB?_E{y]
SELECT username,citytable.cityid <JZ=K5
L=HL1Qe$G]
FROM usertable,citytable -6t#
?Dkc'
rw+0<r3|K
WHERE usertable.cityid=citytable.cityid nR"k%$
.fD k5uo
在FROM子句中可用以下两种格式为表或视图指定别名: |U7{!yy%MF
3P-#NL
表名 as 别名 ' P-K}Y
O]{H2&k@
表名 别名 X8;03EW;
unD8h=Z2
例如上面语句可用表的别名格式表示为: wJ IJPYTK
~xvQ?c?-
SELECT username,b.cityid fCEd
:Kr
ZMx_J
FROM usertable a,citytable b ?{{E/J:%
.iew5.eB+
WHERE a.cityid=b.cityid lD C74g
w2$HP/90j
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 g`J? 2
_]
"OK(<x]3;>
例如: JZP2NB_xt
*j<;;z-
SELECT a.au_fname+a.au_lname Pfd FB
*q8W;WaL
FROM authors a,titleauthor ta +[~\\X
4S"K%2'O
(SELECT title_id,title 2sittP
06Uxd\E~
FROM titles ;iS}<TA
zh50]tX
WHERE ytd_sales>10000 wu
3uu1J
V TEyqo2
) AS t \19XDqf8
nMVThN*Ig
WHERE a.au_id=ta.au_id N?87Bd
df8rf8B-
AND ta.title_id=t.title_id G]&:">&R
VK`b'U&l"
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 sBSBDjk[
=1+I<Ljk
(三)使用WHERE子句设置查询条件 sV[|op
1N#TL"lMS
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: a o7|8[
{nHy!{+qqG
SELECT * a`|/*{
1 !\pwd@{
FROM usertable UdLC]
$X\BO&
WHERE age>20 @H{$,\\
&"^A
WHERE子句可包括各种条件运算符: u\t ;
C($`'~b
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< wbr"z7}
.3HC*E.e
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… PfuYT_p4s
0tsll1
NOT BETWEEN…AND… W}.4$f>
?94da4p
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) _$=xa6YA
wkd591d*
NOT IN (项1,项2……) Fg,[=CqB[
;G},xDGO_m
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE p.l]%\QI
!J:DBtGT
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL OEAF.
]j{S' cz
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 5T8!5EcS*
DF&C7+hO
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 01w=;Q
ec]ksw6T+
2、列表运算符例:country IN ('Germany','China') -z|idy{
H=yD}!j
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 G&Cl:CtC
C]r$
varchar、text、ntext、datetime和smalldatetime等类型查询。 j?&FK
oW/&X5
可使用以下通配字符: xH'H!
8
+Oyt
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Qy3e,9nS
q2hZ1o
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 L)w& f
2"i<--Y
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 a7d782~
}RoM N$r
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 WQK#&r*
;^
/9sLW?#
例如: x]{h$yI
]gmf%g'C
限制以Publishing结尾,使用LIKE '%Publishing' ?Rl*5GRW
M_XZOlW5
限制以A开头:LIKE '[A]%' !-;Me&"I=`
h.7 1O"N
限制以A开头外:LIKE '[^A]%' MA1,;pv6
8a05`ZdP
4、空值判断符例WHERE age IS NULL \<PX'mnO
@D60
5、逻辑运算符:优先级为NOT、AND、OR 'wQ=b
sJ0y3)PQ
(四)查询结果排序 #
=322bnO
zD?$O7
|ZK
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: }7C{:H2d
zg5u
ORDER BY {column_name [ASC|DESC]} [,…n] s!+?)bB
}& 1_gn15
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 J#X 7Ss
3~ZtAgih%
序。 :X$&gsT/,
4XKg3l1
例如: <~Y4JMr"
YobIbpo
SELECT * 5jsnE )
Gu%`__
FROM usertable =ecv;uu2
Y@r#:BH)
ORDER BY age desc,userid ASC o 86}NqK
kv'n W
另外,可以根据表达式进行排序。 {QhvHV
D!X{9q}S1
-iW[cj
R`$
wLgRI$_Dm
二、联合查询 =tog<7
c`t1:%S
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 4 5Ql7~
klx4Mvq+/@
合查询。UNION的语法格式为: "?N`9J|j)~
@lj
select_statement
Cw+ (,1
4bJ3uIP#
UNION [ALL] selectstatement I&cb5j]C
P!vBS"S
[UNION [ALL] selectstatement][…n] 2>H\arEstR
95H`-A
其中selectstatement为待联合的SELECT查询语句。 r[?rwc^
", |wG7N
K
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 "@f`O
DL~LSh
行。 4$|G$h
#Y{"`5>
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 &FK=w]P
k5ZwGJ#r
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 =W4cWG?+
s0`uSQ2X
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 t7~mW$}O
nY*ODL
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 m?m,w$K
qQom=x
型,系统将低精度的数据类型转换为高精度的数据类型。 w?5b: W,
/vQ^>2X%
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: MDB}G
'
vAVoFL
查询1 UNION (查询2 UNION 查询3) GN>T }
jAJkCCG
WK=!<FsC$
1/{:}9Z@
2HTZ,W
I @z{Gr
三、连接查询 -~aVt~{k/
6=kd4'yV
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ]c5Shj5|p
-\I0*L'$|\
数据库管理系统的一个标志。 +fwq9I>L
uj]GBo=
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 ?Rwn1.Z
F1+2V"~
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 *r %
LD6fi
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 U .rH,`
bX9}G#+U
查询。 K crF=cA
o/[NUQSI
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 g=%W"v
N2~z&y8.
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 *i\7dJ Dj
uUJ2d84tV
SQL-92标准所定义的FROM子句的连接语法格式为: Yw{](qG7e`
w5[POo' 5
FROM join_table join_type join_table w?/,LV
\Js9U|lY
[ON (join_condition)] 0P)c)x5
te:VYP
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 w"sRK
(&x[>):6?
个表操作的连接又称做自连接。 I#mT#xs6
7 yi >G
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 @-7K~in?^
T0SD|'
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Z$pR_dazU
&{
f5F7E@
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 FIS-xpv$
~pw_*AN
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) c]n4vhUa5
XRz.R/
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 `Yut1N
p"X\]g^jA>
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 4dy)g)wM
:wF(([&4p!
数据行。 x7/2e{p
uu
p\,lbrv
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 Bq _<v)M*
F{}z[0
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 sn*s7v:
:l7\7IT
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 0? l
Fq{nc]L6
运算符等构成。 g\^(>Ouc
xE9s=}
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 9~4Kbmr>q
v` B_xEl
连接。例如: +I/P5OGRN
aE;!mod
SELECT p1.pub_id,p2.pub_id,p1.pr_info ^@)+P/&
Y<|L|b6
FROM pub_info AS p1 INNER JOIN pub_info AS p2 9sRP8Nj|
?,Hk]Rl3
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
8!T^KMfz
kg-%:;y.
(一)内连接 YZnrGkQ
Vk-_v5
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 yRy9*r=
.*,Zh2eXU
三种: u&g} !Smc8
*JDc1$H0
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 %+'&$
(_W[~df4
表中的所有列,包括其中的重复列。 q5`Gl
WUxr@0
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 hR?rZUl2M
<fyv^e
运算符包括>、>=、<=、<、!>、!<和<>。 7'<4'BGzl]
[s2%t"H-y
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 '-*r&:
Dg]i};
结果集合中所包括的列,并删除连接表中的重复列。 ,= PDL
Mc\lzq8\ 1
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
&hF>}O
mg3jm
SELECT * ,%:`Ll
t]$
-Pvt+I>
FROM authors AS a INNER JOIN publishers AS p {=(4
A,iXiDb3pK
ON a.city=p.city w}E?FEe.
me9RnPe:
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): )WzCUYE 1/
qVY\5`f@
SELECT a.*,p.pub_id,p.pub_name,p.country w68qyG|wM
Tq?W @DM*
FROM authors AS a INNER JOIN publishers AS p J^?O]|
>:K3y$]_
ON a.city=p.city c1z5t]d
N1SR nJu<f
(二)外连接 ?e ~* ,6
O35f5Kz
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 :3G9YjzC}
G/D{K$=t~
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 1n5&PNu
4@VX%5uy
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 kz??""G7/
FKzqJwT
如下面使用左外连接将论坛内容和作者信息连接起来: pLIBNo?
vdo[qk\C
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b \k* ]w_m-
Pgo5&SQb
ON a.username=b.username PJ_|=bn
Eod2vr=Q
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: oL~Yrb%R
,`wxXU7
SELECT a.*,b.* -Wig k['v
g>Z1ZK0;M
FROM city as a FULL OUTER JOIN user as b <6`,)(dj
?@u
&3/&
ON a.username=b.username R@EFG%|`_
Vt&I[osC
(三)交叉连接 *r_.o;6
Comuc
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 I?:V EN:
|;].~7^
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Lf,gS*Tg?
68d @By
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 kj[[78
FX'W%_f,
于6*8=48行。 Nn^el'S'
PF+`3
SELECT type,pub_name q8p 'bibY
FqiK}K.~/
FROM titles CROSS JOIN publishers <9Chkb|B
Ne4A
ORDER BY type