一、简单查询 -:P`Rln
"AayU
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 7XDze(O5
D$vP&7pOr4
表或视图、以及搜索条件等。 x$WdW+glZ-
J=OWXL!<a
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 qbunP!
% njcWVP;
SELECT nickname,email w~S~
*
SHQ[L4{
FROM testtable 4hLv"R.
WokQ
X"
WHERE name='张三' efnj5|JSV
E{#Y=
(一)选择列表 J nzI-
y
1oVjx_I5y
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 L74Sx0nk=
28jm*Cl8
量和全局变量)等构成。 GO|EeM!iB
\.AI;^)X@]
1、选择所有列 L[LgQ7esQ
-y1t;yU.L
例如,下面语句显示testtable表中所有列的数据: MV,;l94?%=
noLb
SELECT * !P"=57d}"l
zm9_[0
FROM testtable
KJ]ejb$
DP-euz
2、选择部分列并指定它们的显示次序 /EXubU73
L3
VyW8Y
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 l*0`{R
A>OGU ^
例如: %J
'RO
CNRiK;nQ
SELECT nickname,email [ ]LiL;A&
j}devpO
FROM testtable VJ'bS9/T
<e%~K4KH
3、更改列标题 VdfV5"
IY=CTFQ8lm
在选择列表中,可重新指定列标题。定义格式为: $>M A
&8^1:CcE
列标题=列名 &9*MO
^ 1 P@BRh
列名 列标题 N`Q[OFe
61}hB>TT:
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ::Nhs/B/
Jjgy;*hM
标题: /t<C_lLM
`=B0NC.3
SELECT 昵称=nickname,电子邮件=email V.8pxD5s
aRh1Q=^@(4
FROM testtable )ZP-t!).G#
w&E*{{otJ
4、删除重复行 +#/`4EnI
Wz^M*=,
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 \a|bx4M
bR*/d-v^
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
jRv j:H9
nYv`{0S+m
5、限制返回的行数 Oy `2ccQ#
(fYrb#]!y
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 a=!I(50
n~wNee
表示一百分数,指定返回的行数等于总行数的百分之几。 L9FijF7
F|seBBu
例如: &d8z`amP
=`oQcIkz
SELECT TOP 2 * ,PyA$Z
2'8$I}h
FROM testtable pSLv1d"9{
D#~S<>u@
SELECT TOP 20 PERCENT * <g^!xX<r?
tUp'cG
FROM testtable ]DaC??%w
Y8fahQ#
(二)FROM子句 ZMVQo-=
o@d+<6Um
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, [9O,C-Mk
xzRs;AXOp
它们之间用逗号分隔。 2EdKxw3$]
^6Std
x_
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 *Y@)t*
-a
+-|D$@8S
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 \40d?N#D
M]Y72K^
使用下面语句格式加以限定: 6}RRrYL7I
8#S}.|"?F
SELECT username,citytable.cityid pNHO;N[&
>^ E
FROM usertable,citytable kr_!AW<.tz
njk1x
WHERE usertable.cityid=citytable.cityid y.LJ5K$&a
xGzp}
在FROM子句中可用以下两种格式为表或视图指定别名: ;8G( l
4G%!t`?q
表名 as 别名 <Rl:=(]i~
l u^fKQ
表名 别名 3>`CZ]ip}
2|1s !Q
例如上面语句可用表的别名格式表示为: 0> 6;,pd"
3gn)q>Xj$
SELECT username,b.cityid gyI(O>e
B3P#p^
FROM usertable a,citytable b LE|*Je3a
as{^~8B
WHERE a.cityid=b.cityid 1xJc[q
\I"UW1)B
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 5nGDt~a
8%$Vj
例如: WB=pRC@
Cyb-}l
SELECT a.au_fname+a.au_lname g 36\%L
vlD!YNy
FROM authors a,titleauthor ta D{](5?$`|
Ef1R?<
(SELECT title_id,title \xH#X=J
"\'g2|A
FROM titles ^Fl6-|^~
t ._PS3
WHERE ytd_sales>10000 #>|l"1
,u^S(vxyz
) AS t _/W[=c
|vZ\tQ
WHERE a.au_id=ta.au_id :.-z) C}
hm%'k~
AND ta.title_id=t.title_id GnE%C2L-
a:oZ5PX=
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 fwojFS.K
G36}4
(三)使用WHERE子句设置查询条件 N
F[v/S
OAc*W<Q0
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: _l&`*
2d
{QTrH-C
SELECT * Ty"OJ
Fr}e-a
FROM usertable /`3^?zlu"
%"Y7 b2pPa
WHERE age>20 # $:ddOY
{(7D=\eU
WHERE子句可包括各种条件运算符: ,KlTitJl\+
|5wuYG
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 1Ftl1uf
JD^&d~n_
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… :<OInKE>Cx
?"p:6%GFz
NOT BETWEEN…AND… =?`5n|A*
E6SGK,f0D
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) sW~Z?PFP
`eIX*R
NOT IN (项1,项2……) :\@WY
f:k3j}&
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE w#Y<~W&
)$/Gh&1G
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 2&E1) ^
[?<"SJ,`
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR /3*75
x@F"ZiYD@O
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 G
1{F_
8k$iz@e
2、列表运算符例:country IN ('Germany','China') ,Ty>sZ#/fz
)*@Oz
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 D<[4}og&]
\A\a=A[
varchar、text、ntext、datetime和smalldatetime等类型查询。 xo0",i
f8
,.`";='o
可使用以下通配字符: WV5gH*uUa
4-`C !q
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 =|n NC
DT # 1*&-
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 VVdgNT|}W
G?)vqmJ%
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Eb`U^*A
A6'G%of
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Urhh)i
uG\+`[-{0
例如: ZpPm>|w
,jyNV<dI
限制以Publishing结尾,使用LIKE '%Publishing' br"p D-}
jxL5L[
限制以A开头:LIKE '[A]%' >2gemTy
?lzg )88I
限制以A开头外:LIKE '[^A]%' J<:qzwh
*-bR~
4、空值判断符例WHERE age IS NULL [3s,U4a
$|!VP'VI
5、逻辑运算符:优先级为NOT、AND、OR fmH$1C<
^3QHB1I
(四)查询结果排序 +/q%29-k
od|w)?16
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: "4LYqDe
xtKWh`[&
ORDER BY {column_name [ASC|DESC]} [,…n] >Qc0g(w
PA"xb3@I
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 3e"_R
o@_pV
序。 OqDLb
MJ>9[hs
例如: xaWd\]UF
}U'fPYYi8
SELECT * yqqP7
m~\BkE/[l
FROM usertable ;$(a+?
K z !-w
ORDER BY age desc,userid ASC *J@2A)ZDv0
: L`
另外,可以根据表达式进行排序。 ^r^cMksB*
E/:<9xl
ghJ81
o"t+G/M
二、联合查询 -MoI{3a
RX:\@c&
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 kRnh20I
$lci{D32,
合查询。UNION的语法格式为: 7ZS5u+o
M)6_Tal
select_statement W,YzD&f=uS
v')Fq[H
UNION [ALL] selectstatement t#oY|G3O}
`!5ZF@Q>e
[UNION [ALL] selectstatement][…n] Yd lXMddE
{Q^P<
其中selectstatement为待联合的SELECT查询语句。 ]*U\ gm%
D M{7x77
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 {AqN@i
=jip* E^
行。 +Tde#T&[
1=OXi!G
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 X!,P] G
=)"60R7{
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 0)-l9V
-DhF> 4f
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 +"Ek?
)?
Lp20{R
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 '@RlKMnN
#
SV*6
型,系统将低精度的数据类型转换为高精度的数据类型。 J`;G9'n2
3zY"9KUN
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 4VSIE"8e
cysYjuI i
查询1 UNION (查询2 UNION 查询3) WZdA<<,:o
V:)k@W?P
eI; %/6#
>Be PE(k
<^|8\<J
[oKc<o7)~"
三、连接查询 k
uU,7<o
,d<wEB?\`
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 /!oi`8D
${ad[hs
数据库管理系统的一个标志。 J %jfuj
AnG/A!G
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 _sbZyL
~<Uwumv
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 tx Lo=
KnbT2
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 _;W}_p}q{
m*|3
查询。 {l.) *#O
1$?O5.X:
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 Xoml
;$&&tEh)
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 i ;y<gm"
[zn`vT
SQL-92标准所定义的FROM子句的连接语法格式为: Vd4x!Vk
;"
'`P[
FROM join_table join_type join_table 7&/iuP$.
DoX#+
07u4
[ON (join_condition)] =et=X_3-
]zmY]5
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 G#@o6r
b)(#/}jMkD
个表操作的连接又称做自连接。 @G^]kDFM{
r75,mX
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 {6~v oVkj
c_x6FoE;L
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 F'*y2FC
Tf
Q(f?
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 25t2tj@S
4&!`Yi_1L
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) `Q<hL {AH
@sav8]
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 hZVF72D26
L9Z:>i?
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 0diQfu)Fi
R"];`F(#
数据行。 J1YP-:
h35x'`g7+r
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 }=?kf3k
epJVs0W
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ce.'STm=
y'*^ '
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 he8y
5Z]`n
运算符等构成。 OvX z+C,
aDm$^yP
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 *$Aneq0f
3P\#moJ
连接。例如: |t1D8){!
$^INl0Pg
SELECT p1.pub_id,p2.pub_id,p1.pr_info (zwxrOS
e57}.pF^
FROM pub_info AS p1 INNER JOIN pub_info AS p2 "KcSOjvJ
6{8qATLR
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) fa8vY
ZtlF]k:MV
(一)内连接 B%6>2S=E
1t+]r:{
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 T#DJQ"$
(^ZC8)0i(
三种: ;gcQ9L
ib /B!?/
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ~QJD.'z
!sfOde)$
表中的所有列,包括其中的重复列。 8E H#IiP
/d%&s^M:
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ^DS9D:oE
h$)!eSu
运算符包括>、>=、<=、<、!>、!<和<>。 6k%N\!_TUW
F[ N{7C3
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 %0YwaxXPn7
p~J`}>yo
结果集合中所包括的列,并删除连接表中的重复列。 w")VcAq
RnPJ,Z5s&&
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: -_[n2\|we)
gG1%.q
SELECT * G5|xWeNgA
J_
?;On5
FROM authors AS a INNER JOIN publishers AS p +_|M*%
Vl5}m
ON a.city=p.city B=%cXW,
:J`:Q3@
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): l}j5EWe
oZHsCQ %
SELECT a.*,p.pub_id,p.pub_name,p.country vRp =L54z
V.Dqbv
FROM authors AS a INNER JOIN publishers AS p g05:A0X#
;J Dn1(6
ON a.city=p.city ^*#5iT8/
tj;<Z.
(二)外连接 K%P$#a
iK#5HW{
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 JBtcl#|
~=aD*v<3d
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 h`-aO u
tu#VZAPW@
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 d&&^_0O
s+YQ
:>F
如下面使用左外连接将论坛内容和作者信息连接起来: "1$OPt5
{(U?)4@
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b Li(}_
4`)`%R $
ON a.username=b.username EpB2?XGA
YQ}Rg5o
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ogbLs)&+a
/@gD
8
SELECT a.*,b.* |G&<@8O
_Isju
S
FROM city as a FULL OUTER JOIN user as b SL zL/5s
L,*2tJcC<
ON a.username=b.username tPIT+1. ]z
-'QvUHL|
(三)交叉连接 Ac0C,*|^
mw! D|
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 $YSAD\a<
@G+Hrd6
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 <f%JZ4p*
kngkG|du
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 N%v}$58Z
mjO4GpG3
于6*8=48行。 ;XNe:g.CR
+[:"$?J
SELECT type,pub_name Qz2Yw `
!4\`g?
FROM titles CROSS JOIN publishers vQ>x5\r5O_
0+jR,5|
ORDER BY type