一、简单查询 :Z_abKt
/11CC \
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 C7}iwklcsa
PI,2b(`h_
表或视图、以及搜索条件等。 Ml{4)%~Y7f
FFmXT/K"/j
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 'YYT1H)
N pQOLX/<?
SELECT nickname,email {0AlQ6.@>
d>c`hQ(V
FROM testtable [a}Idi`
K
F[0~{*/|G
WHERE name='张三' _F^NX%
+&J1D8
(一)选择列表 bxBndxl
7 n^1H[q
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 kGakdLl
8493O x4 O
量和全局变量)等构成。 i=pfjC
</SO#g^r<
1、选择所有列 kE!ky\E
+%~me?
例如,下面语句显示testtable表中所有列的数据: sEZ2DnDI
|?MD>Pez
SELECT * A@4{-e\
JRE\R&>g
FROM testtable nr(C*E
0m\( @2E
2、选择部分列并指定它们的显示次序 HzuG- V
FP0GE
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ycvgF6Me<
BGOS(
例如: :Dtm+EQ
&NbSG+t
SELECT nickname,email jYBiC DD
!|9k&o
FROM testtable 5Fq+^
jMX|1b
3、更改列标题 P=y1qqC
3Q )"
在选择列表中,可重新指定列标题。定义格式为: \8vZZ t
M9(lxu y1
列标题=列名 "+
k}#<P4\
fi&>;0?7
列名 列标题 A8AeM`
1-.i^Hal
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 7qWa>fX
beV+3HqB8
标题: L}A2$@
nvc(<Ovw
SELECT 昵称=nickname,电子邮件=email Ywcgt|
<A`SC;k\u
FROM testtable km`";gUp>
Pi,86?
4、删除重复行 ^%Ln@!P
~(`MP<
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 F<dhG>E9
O@:R\MwFOZ
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 )]E?~ $,
rg]z
5、限制返回的行数 !.4q{YWcYk
J @IKXhb7_
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 *xKy^f
R+/kx#^
表示一百分数,指定返回的行数等于总行数的百分之几。 W* n|T{n
/R6\_oM
例如: M~Er6Zg
_=cuOo"!
SELECT TOP 2 * 55,2eg#{O
%/!f^PIwX
FROM testtable !RjC0,
,Hp7`I>/
SELECT TOP 20 PERCENT * 0j}@lOt(
3-[+g}kak?
FROM testtable "-G7eGQ
KmqgP`Cu
(二)FROM子句 Tl?jq]
,.;{J|4P
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, O
>@Q>Z8W?
:SZi4:4-J8
它们之间用逗号分隔。 i.FdZN{
xsvJjs;=
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 UA4MtTp`
9tmnx')_
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 GK3cQw
?]+!gz1
使用下面语句格式加以限定: >J:liB|(
8\PI1U
SELECT username,citytable.cityid b/E3Kse?
*hpS/g/3\
FROM usertable,citytable muhu`
k`C
-f?,%6(1
WHERE usertable.cityid=citytable.cityid 1] .m4vC
/NuO>kQa
在FROM子句中可用以下两种格式为表或视图指定别名: k?
,/om1
U_UN& /f
表名 as 别名 .5A .[ZY)
C0ORBp
表名 别名 "od2i\
=t|,6Vp
例如上面语句可用表的别名格式表示为: 7dR]$~+*e
Iy5)SZ'
SELECT username,b.cityid \"Qa)1|
w.+G+r=
FROM usertable a,citytable b ~{{7y]3M-
S&Hgr_/}c
WHERE a.cityid=b.cityid gTdr
]L3MIaO2T
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 {Z>Mnw"R
n9Vr*RKM)
例如: `y{[e j
`@So6%3Y|
SELECT a.au_fname+a.au_lname /7ykmW
z.tN<P 7
FROM authors a,titleauthor ta ke2M&TV
QQ %W3D@
(SELECT title_id,title B f.- 5
UH((d*HX4
FROM titles {GGP8
Q4g69IE
WHERE ytd_sales>10000 Y+0GJuBf
hANe$10=H
) AS t JC/nHM
ih: XC
WHERE a.au_id=ta.au_id R\x3'([A5
J M;WCV%NM
AND ta.title_id=t.title_id F^?DnZs
oS<*\!&D
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 m+x$LkP
[&lH[:Y#
(三)使用WHERE子句设置查询条件 g]d0B!Ar~
>^ E*7Bfp
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: n-OQCz9Xl
j&q%@%Gm
SELECT * H6lZ<R{=
+.uQToqy
FROM usertable #W4
" ^#2
T5dnj&N ]
WHERE age>20 y<l(F?_
cXb&Rm'L
WHERE子句可包括各种条件运算符: q-/t?m0
t"vkd
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< oA;ZDO06r
1=PTiDMJ<*
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… tCv}+7)
S.?DR3XLc
NOT BETWEEN…AND… %{?9#))
$M$-c{>s
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) I2,AT+O<
gN]\#s@[
NOT IN (项1,项2……) ~9@83Cs2
nW
oh(a
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE O-3a U!L
@]Ac >&
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL AP ]`'C
;R$2+9
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR >.uIp4@(
wVc^l
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 {TDZDH
((=T E
2、列表运算符例:country IN ('Germany','China') g|tclBx
/<"ok;Pu7
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 wEQZ9?\
LG??Q+`l
varchar、text、ntext、datetime和smalldatetime等类型查询。 F?qg?1vB|
s(r4m/
可使用以下通配字符: %l!-rXp
ZVrZkd`
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Ko|gH]B'
"/%o'Fq
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 E;An':j
M(n@ytz
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 MSB/O.
p =-~qBw
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 (k_9<Yb3
kM(m$Oo.
例如: )4>7X)j>
hoLA*v2<
限制以Publishing结尾,使用LIKE '%Publishing' t/l<X]o
:#D~j]pP
限制以A开头:LIKE '[A]%' Kq(JHB+
g8@F/$HY
限制以A开头外:LIKE '[^A]%' 4[)tO-v:Y
7`&6l+S|
4、空值判断符例WHERE age IS NULL )"7z'ar
gMp' S
5、逻辑运算符:优先级为NOT、AND、OR oN`khS]_v0
` $q0fTz
(四)查询结果排序 qqys`.
9_ZGb"(Lj
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: \ _?d?:#RD
T1'\!6_5
ORDER BY {column_name [ASC|DESC]} [,…n] ,5AEtoF
-aV(6i*n
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Q 9E.AN
$EzWUt
序。 {d.K)8\
>*Ej2ex
例如: WpRM|"CF
^F&j;8U
SELECT * e0j4t-lL
v8n^~=SH
FROM usertable amQTPNI
gdq6jz
ORDER BY age desc,userid ASC }_('3C,Ba
M+b?qw
另外,可以根据表达式进行排序。 7
D{%
G,<l}(tEG
Z*-a=u%gl'
T6."j_
二、联合查询 #T@k(Bz{L
mu5r4W47
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 HJP~
lg
WdB\n/BWB
合查询。UNION的语法格式为: Ey=}bBx
>?6HUUQ
select_statement JpxQS~VX
Nr).*]g@~
UNION [ALL] selectstatement dGz4`1(>
Z]x6np
[UNION [ALL] selectstatement][…n] mI]gDL1
h4+*ssnYV
其中selectstatement为待联合的SELECT查询语句。 d24_,o\_
;--D?Gs]Qr
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 >(.Y%$9"E
TKgN31 `
行。 qw>vu7/z
"h|kf%
W
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 IW-|"5?9'
5:C>:pA V
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 >s1?rC
`5rfO6;
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 j(k}NWPH
b*/Mco 9O
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 #=;vg
B2|0.G|[j
型,系统将低精度的数据类型转换为高精度的数据类型。 DIJmISk
IAmZ_2
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: B<HN$/
L&~' SC
查询1 UNION (查询2 UNION 查询3) <0 qhc$M
H6Bw3I[
*aFY+.;U`
29m$S7[
pM}~/
7B\Q5fLQ
三、连接查询 E+LQyvF[
cOZBl;}
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ael] {'h]
X8-x$07)
数据库管理系统的一个标志。 ?~(#~3x
@|bJMi
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 /Ov1eQBNG
$RNHRA.
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 +\)Y,@cw
vU]n0)<KB
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 @LSh=o+
u[oV
Jvc
查询。 .wyuB;:
$G5:/,Q
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 _N)&<'lB<
1iNMgA
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 =p"ma83
p\9}}t7n
SQL-92标准所定义的FROM子句的连接语法格式为: w7&.Uqjf
WglpWp)
FROM join_table join_type join_table &%;n9K
m l@%H
[ON (join_condition)] u6Wan*I?
Y_EEnx&>i
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 DEt!/a{X
z[myf]@
个表操作的连接又称做自连接。 x<' $
K=nDC.
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 fOME&$=O
YbnXAi\y|
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 PxGw5:
>(wQx05^D
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 I|qhj*_C
z
Tz_"NI
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) }/,Rp/+7]
~P"Agpx3u
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 RA;/ ?l
-sZb+2tDa
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Li"+`
W&&|T;P<J
数据行。 8lGM>(:o
,<)D3K<
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 L F } d
TA2ETvz^
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ZS;V?]\(
q-ko)]
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 he:z9EG}
W$()W)
运算符等构成。 <lWj-+m
&1?6Q_p6c
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 s=F[.X9lp
G6}&k[d5%
连接。例如: DwZRx@
12m-$/5n+
SELECT p1.pub_id,p2.pub_id,p1.pr_info U zc p
%KkC1.yu<
FROM pub_info AS p1 INNER JOIN pub_info AS p2 au/LoO#6Ro
VJT /9O)Z|
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Y_n3O@,
{"%a-*@%
(一)内连接 kh:_,g
3\
,t_6}
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 x[Hx.G}5+
peT91b
三种: _ DT,iF*6
dJ Q K|/
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 W5= j&&|!
6M_:D
表中的所有列,包括其中的重复列。 _aF8Us
D,[Nn_N
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ]'M B3@T
UcOP 0_/
运算符包括>、>=、<=、<、!>、!<和<>。 X0-PJ-\aD@
>u(^v@Ejf
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 J:gC1g^
$I>]61l%
结果集合中所包括的列,并删除连接表中的重复列。 $/tj<++W
eq(h{*rC
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: WZPj?ou`G
cs.t#C
SELECT * O-K*->5S
qsbV)c
FROM authors AS a INNER JOIN publishers AS p H.E=m0np
OFyy!r@?
ON a.city=p.city *PV"&cx
7aKI=;60.
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 4%w<Ekd
bv'>4a
SELECT a.*,p.pub_id,p.pub_name,p.country la w$LL
kp* !
FROM authors AS a INNER JOIN publishers AS p JGTsVa2
SA&(%f1d
ON a.city=p.city naH(lz|v
eOF*|9
(二)外连接 u)I\R\N
, QWus"5H
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 W02z}"#
v<g=uEpN
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 l~f3J$OkJ
4g8o~JI:v
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 =E%@8ZbK
adIrrK
如下面使用左外连接将论坛内容和作者信息连接起来: 0XCAnMVo
6QbDU[
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
KN`k+!@/7
-6s:D/t1'
ON a.username=b.username !/u
,>7dIJqzw
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: "0[`U(/
a^@.C5
SELECT a.*,b.* AG9DJ{T
)UF'y{K}
FROM city as a FULL OUTER JOIN user as b 8h@L_*Kr
9N)I\lcY
ON a.username=b.username Qkx*T9W
yq k8)\p
(三)交叉连接 F0z7".)
.'_}:~
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 : slO0
9?hZf$z
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 jS[=Zx`
Nr `R3(X
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 'uDx$AkY
Ui
(nMEon
于6*8=48行。 Fj~suZ`
%aMC[i
SELECT type,pub_name G$V=\60a-
BO7HJF)a
FROM titles CROSS JOIN publishers P(b[|QF
0RMW>v/7kL
ORDER BY type