一、简单查询 Y4+]5;B8
rp4{lHw>C/
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 aCJ-T8?'
dlA0&;}z
表或视图、以及搜索条件等。 Xf{9rZ+
OnH3Ss$
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 )gD2wk(
F|G v
SELECT nickname,email k[}WYs+r
iL!4r]~H
FROM testtable vQG v4
LM(r3sonb
WHERE name='张三' W7c
B
@
M4m!;rM
(一)选择列表 PC\p>6xT
jrxq558
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 wA"d?x
v$xurj:v#i
量和全局变量)等构成。 =4sx(<
/x)i}M)
1、选择所有列 IEd?-L
]9~Il#
例如,下面语句显示testtable表中所有列的数据: P+y XC^ ,
\mTi@T!&
SELECT *
7|yEf
BnfuI
FROM testtable %O!TS_~9
kT]jJbb"
2、选择部分列并指定它们的显示次序 ]0O3kiVQ
Q{5.;{/eC
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 %QQ 2u$
>4q6
例如: Bt#'6::
"%bU74>
SELECT nickname,email t%O)Ti
E3(o}O
FROM testtable D+jE{v'
?p/}eRgi
3、更改列标题 EM@EB<pRX
ll[&O4.F
在选择列表中,可重新指定列标题。定义格式为: cq 5^7.
yJ`{\7Uqg
列标题=列名 y>:U&P^
`A5n6*A7
列名 列标题 CbXSJDs
[c -|`d^
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 s(ap~UCOw
h6IO ;:P)
标题: 2.=G
>$yA
,N
SELECT 昵称=nickname,电子邮件=email cW_l |
(74y2U6
FROM testtable sxS%1hp3
a#G3 dY>
4、删除重复行 6xAxLZz<
jse!EtB:
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 (`_fP.Ogb
u.G aMl4 (
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 FhPCFmmUT
p-lFzNPc0
5、限制返回的行数 ]d~{8h!G
DUH DFG
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 wW8[t8%43
,j9? 9Z7R
表示一百分数,指定返回的行数等于总行数的百分之几。 ._t1eb`m{
4\nGWi{2
例如: `8tstWYa]Y
y<wd~!>Ubu
SELECT TOP 2 * 717G
CL@
_yX.Apv]
FROM testtable fP6.
QC!SgV
SELECT TOP 20 PERCENT * X h}D_c
fYzP4
FROM testtable X$@qs9?)^
Ryygq,>VD.
(二)FROM子句 )FmIL(vu
@H3x51PT(m
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, kwqY~@W
ADVS}d!;]
它们之间用逗号分隔。 k4!_(X%8
V1GkX=H},
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 4*9t:D|}
s[dIWYs#
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 [k(b<'
ASrRMH[
使用下面语句格式加以限定: qJf\,7mi
h{H*k#>
SELECT username,citytable.cityid -'L~Y~'.
~R~.D
FROM usertable,citytable ~)`\j
@$ju Qm
WHERE usertable.cityid=citytable.cityid GD'Z"rhI
qX; F+~
在FROM子句中可用以下两种格式为表或视图指定别名: l(-"rE
`@WJ_-$#
表名 as 别名 lN8l71N^
1
?Zw
表名 别名 ~IWdFUKk
'ey62-^r6
例如上面语句可用表的别名格式表示为: nHH
FHnFf
9$U4x|n
SELECT username,b.cityid ggitUQ+t;G
/#&jF:h
FROM usertable a,citytable b ;Zj(**#H
_Gaem"k|
WHERE a.cityid=b.cityid m[iQ7/
md?
cvGDE
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 #$W0%7
6Z' K1
例如: ?G!~&
?8?vBkz~
SELECT a.au_fname+a.au_lname sKsMF:|OT
osdoL
FROM authors a,titleauthor ta a
j$& 9][
Q-F$Ryj^
(SELECT title_id,title *h=>*t?I2
QtXiUx^ k<
FROM titles vD:J!|hs(
:ir3u
WHERE ytd_sales>10000 n f<I
)8eb(!}7
) AS t @Tq-3Um
Lj#xZ!mQS
WHERE a.au_id=ta.au_id qO8:|q1%;\
r}^1dO
AND ta.title_id=t.title_id afna7TlS
5 r_Z3/%
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 SdYbT)y
/'E[03I~
(三)使用WHERE子句设置查询条件 =<m!%/I
QxxPImubB
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: ?6nB=B)/
QT73=>^B
SELECT * =Ry8E2NuM
+kEM%z
FROM usertable Yb_HvP
D)DD 6
WHERE age>20 S@S4<R1{\
ys>n%24qP
WHERE子句可包括各种条件运算符:
bKK'U4
%eW7AO>
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< jb,a>9]p
4b;*:C4?
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… >3B{sn}
s]0 J'UN
NOT BETWEEN…AND… :@"o.8p
Hm!"%
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ;~djbo0,X
Uf]$I`T#
NOT IN (项1,项2……) GYiL}itD=3
3!/J!X3L
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE $d])>4eQ
g\8B;
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL t']/2m.&p
%t!r
pyD
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR (Fuu V{x|
WAR!#E#J7
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 $'_Q@ZBq
xgj'um
2、列表运算符例:country IN ('Germany','China') T+zhj++
TbT/ 5W3
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 8-7Ml3G*
EW vhT]<0
varchar、text、ntext、datetime和smalldatetime等类型查询。 +HRtuRv0T
=q)+_@24>d
可使用以下通配字符: UR=s=G|
W2h4ej\s
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 m9MYd
l;A '^
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 \v\ONp"
);TB(PQsBT
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 dY0W=,X$7T
5pDE!6gQ
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 2-N7%]h
mwsBj)
例如: 9xq3>(
:<{15:1
限制以Publishing结尾,使用LIKE '%Publishing' qxAh8RR;/
n7~4*B
限制以A开头:LIKE '[A]%' B[EOz\?=m
;r~1TUKb
限制以A开头外:LIKE '[^A]%' %saP>]o
eN
</H.bm]
4、空值判断符例WHERE age IS NULL nvLdgu4P>
<pa-C2Ky
5、逻辑运算符:优先级为NOT、AND、OR d}Guj/cx,
-AD`(b7q
(四)查询结果排序 '%ZKvZ-
_Li.}g@Bd
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: He4HIZ
0-{E% k
ORDER BY {column_name [ASC|DESC]} [,…n] islHtX
VE
\o2l;1~
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 I+.U.e^gx
LEtGrA/%@b
序。 ~,KrL(jC
%3TioM[B
例如: tWzB Qx
$uFvZ?w&
SELECT * 2Og5e
,xrA2
FROM usertable cT@|
$A
7A'E+>1d
ORDER BY age desc,userid ASC e&:%Rr]x
L'`Au/%S}
另外,可以根据表达式进行排序。 LJb=9tp~
d*04[5`
$|&<cenMT
O/ItN5B
;
二、联合查询 "s]
XRQ1Uh6
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 [_3&
Zos.WS#
合查询。UNION的语法格式为: M=95E$6
O`%F{&;29
select_statement -bdWG]w"
m;rr7{7X
UNION [ALL] selectstatement 8tv4_Lbx
C@]D*k
[UNION [ALL] selectstatement][…n] Bfo#N31F}
Whp`\E<<
其中selectstatement为待联合的SELECT查询语句。 jck(cc=R
{g`!2"
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 +]-'{%-zK
ik)u/r DW
行。 [N~-9
YqWNp
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 0m.`$nlV-
<*^|Aj|#
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ;r6YIS4@
;~$Q;m1
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 "x$L2>9
M[O22wFs
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 eAI|zk6
N TDmOS\,
型,系统将低精度的数据类型转换为高精度的数据类型。 _yH">x<
=?+w5oI0
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: T95FoA
_7';1 D
查询1 UNION (查询2 UNION 查询3) !ii(2U
B=^M& {
n{~&^Nby*I
{jR3D!hK
jr.{M
d_&pxy?
>
三、连接查询 o+{i26%
'~f*O0_
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 HOH5_E>d
}aa]1X(u
数据库管理系统的一个标志。 /g9^g(
R)$]r>YZF
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 <Z_\2
YWA
;@gI*i
N"
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 bJ"2|VNH(
{E)tzBI;^
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 }QQl.'
lH/"47
查询。 [N%InsA9k
Ez-AQ'
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ;g+fY6
'-I\G6w9
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 tBZ?UAe;
lFIaC}
SQL-92标准所定义的FROM子句的连接语法格式为: =HIKn6C<
K%/\XnCY
FROM join_table join_type join_table gN(kRhp
N.]~%)K:{
[ON (join_condition)] roG<2i F
5&L*'kV@
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 'x?|tKzd
8dt=@pwx&
个表操作的连接又称做自连接。 mRyf+O[
+jq@!P"}d
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 5\}Y=Pa
Zs3xoIW7Ai
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ;QCGl$8A
=u0a/2u|
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 VJW8%s[
@V1FBw9S!@
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) Ygg(qB1q
QKvaTy#
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 A(BjU:D(Oj
?aBAmyxm
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 [5-IkT0
g26_#4 P
数据行。 H|j]uLZ
'|v<^EH
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 zT/woiyB`
=c#mR" 1
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 |t3}>+"?z
g}hNsU=$5~
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 +gBDE:
u|"YS-dH
运算符等构成。 `O.pT{Lf
.),9a,
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 'zMmJl}\vd
F/tRyq`D
连接。例如: Wie0r@5E
F8tMZ,:
SELECT p1.pub_id,p2.pub_id,p1.pr_info .ty2! .
gwg~4:W
FROM pub_info AS p1 INNER JOIN pub_info AS p2 &\6(iL
SLN OOEN
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ]0%{IgB
3&c'3y:b
(一)内连接 ^:f)XZ
}> C?Zx*
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 t)k;5B`> &
egfd=z=2un
三种: 4PU@W o
D0S^Msk9L
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ~WV1t][
k@n L(2
表中的所有列,包括其中的重复列。 "OkZ
[E)
ix?Z:pIS0
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 :l
Z\=2D
8/,s8u
运算符包括>、>=、<=、<、!>、!<和<>。 }
MP_
U%VFr#
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 hmb=_W
?,hGKSC
结果集合中所包括的列,并删除连接表中的重复列。 a #p`l>rx
X
)
=-a
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: l 8GAZ*+
7+[L6q/K
SELECT * YLSDJ$K6
/9P7;1?
FROM authors AS a INNER JOIN publishers AS p n36@&q+B&
tLdQO"
ON a.city=p.city NP~3!b
^$oEM0h
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): fG.6S"|M
+>a(9r|:
SELECT a.*,p.pub_id,p.pub_name,p.country Z%3)w.
NJoHrhC='
FROM authors AS a INNER JOIN publishers AS p QOJ5
|
ObA=[j
ON a.city=p.city Q4N0j' QA
wn<k"6x
(二)外连接 gMZrtK`<
+= gU`<\
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 we*E}U4
7eZwpg?K
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 Tn>L?
=G'J@[d{d
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 1mfB6p1Z(
'Q*lp!2>
如下面使用左外连接将论坛内容和作者信息连接起来: XwU1CejP0
nvodP"iV
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b iZ ;562Mo
({C|(v9C7
ON a.username=b.username iE{VmHp=
/B{cL`<
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ('=Q[ua7-(
poqNiOm4%
SELECT a.*,b.* ?#ywUEY* i
"Vwk&~B%
FROM city as a FULL OUTER JOIN user as b [>QzT"=
V`feUFw3
ON a.username=b.username a'my0m
Q b5vyV `
(三)交叉连接 $KGRpI
MP
Q?Q]'
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 LN'})CI8m
WO+>W+|N
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 cI<T/~P
c+1<3)Q<
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 U\YzE.G1]S
g9=O<u#
于6*8=48行。 #'y^@90R
D;DI8.4`N
SELECT type,pub_name P2U [PO
;,B $lgF
FROM titles CROSS JOIN publishers 0qN?4h)7
Thp!X/2O`
ORDER BY type