一、简单查询 QpJIDM/
#:I^&~:
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 2;}xN! 8
&m4f1ZO*
表或视图、以及搜索条件等。 l]>!`'sJL
-s33m]a;
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ZR2\dH*
m&ZJqsZIL
SELECT nickname,email R/rcXX7%
9Q=>MOB-
FROM testtable ^T+<!k
1sMV`qv>
WHERE name='张三' !,R
8z0Hx
(一)选择列表 /t5g"n3
9?!u2 o
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 F*.
/D~K
\CDAFu#
量和全局变量)等构成。 P 4H*jy@?
`43vxcMg
1、选择所有列 uzO{{S-
% dYI5U89
例如,下面语句显示testtable表中所有列的数据: k|fh\F+$
Q>V?w gZ
SELECT * VAt>ji7c
TftOYY.hQ
FROM testtable i(z+a6^@|
iPz1eUj
2、选择部分列并指定它们的显示次序 R'r|E_
R rxRa[{Z
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ^|r`"gOJ3
{#0Tl
例如: t3K>\ :
2-P I JO
SELECT nickname,email @_(nd57oSs
EI<"DB
FROM testtable R:BBF9sK?
KZi+j#7O
3、更改列标题 H]U"+52h
$=7H1 w
在选择列表中,可重新指定列标题。定义格式为: j#CuR7m
s^obJl3
列标题=列名 I?A~zigO
7/4~>D&-b
列名 列标题 RlPjki"Mg
l(.7t'
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 :S#eg1y.w]
ADTU{6UPS
标题: W;5N04ko
TjT](?'o
SELECT 昵称=nickname,电子邮件=email
I8:"h
"[Yip5
FROM testtable 1o(+rR<h9
,I("x2
4、删除重复行 bL+sN"Km
NuHL5C?To
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 LZbRQ"!!o
gq=0L:
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Ni&,g
So0`c,D
5、限制返回的行数 _Wq7U1v`
4;08n|C
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ='KPT1dW*
bn5"dxV
表示一百分数,指定返回的行数等于总行数的百分之几。 9tW3!O^_
(69kvA&|q
例如: O2/%mFS.
H 3W_}f
SELECT TOP 2 * x/pC%25
gX/|aG$a!U
FROM testtable [''=><
Mf!owpW
T
SELECT TOP 20 PERCENT * ,^Ex}Z
))c*_n
FROM testtable bBd *}"v^"
RJQ/y3
(二)FROM子句 rD_Ss.\^g
ytg7p 5{!i
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, .0rJIO
c"6Kd$?M
它们之间用逗号分隔。 $XU-[OF%:9
^!N;F"
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 Vx0MG{vG1
A)= X?x
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 @oUf}rMiDa
Lx9hq7<
使用下面语句格式加以限定: tW'qO:y+
'&rw=.cU
SELECT username,citytable.cityid "-G.V#zI
NHst7$Y<
FROM usertable,citytable >?H_A
:0i#=ODR
WHERE usertable.cityid=citytable.cityid wI|bBfd(
\UVT_=Y
在FROM子句中可用以下两种格式为表或视图指定别名: F0DPS:c
b#bO=T$e-
表名 as 别名 89 _&X[X
#MmmwPB_
表名 别名 J$o[$G_Z
JI28}Cxs0
例如上面语句可用表的别名格式表示为: {'cs![U
FZ;YvdX6
SELECT username,b.cityid h+\$Z]
Ke'YM{
FROM usertable a,citytable b EfMG(oI
`K1PGibV
WHERE a.cityid=b.cityid U`},)$
',v0vyO8
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 h9@gs,'
s2,`eV
例如: Py( w T%w
sIP6GWK$
SELECT a.au_fname+a.au_lname D|
3AjzW
?#');`
FROM authors a,titleauthor ta oZ|{J
w+:+r/!g
(SELECT title_id,title #)IdJ]
f?oI'5R41
FROM titles B$iMU?B3
fh/)di
WHERE ytd_sales>10000 ~cWLu5
y0W`E/1t
) AS t 0hEF$d6U
-M(58/y
WHERE a.au_id=ta.au_id @DjG?yLK$
~XN]?5GQf
AND ta.title_id=t.title_id !YuON6{)
qX}dbuDE"P
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 `0/gs
c;A
ew!
(三)使用WHERE子句设置查询条件 O;.d4pO(tC
I+-Rs2wb
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: IrVM|8vT3
vwSX$OZ
SELECT * iyHp$~,q?t
vM$#m1L?
FROM usertable Xqq?S
9 ;! uV>-H
WHERE age>20 pD)/-Dgdm
W"DxIy
WHERE子句可包括各种条件运算符: JN9H T0
w^vK7Z
1$
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 0o\=0bH&s
J0{WqA.P
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… a-o
hS=W
2gNBPd )I
NOT BETWEEN…AND… tF) k6*+
~=aI2(b
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) s;=J'x)~%
%E=,H?9&>
NOT IN (项1,项2……) c9F[pfi(
3vEjf
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ~S~x@&yR
ESXU,
qK]v
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ui: >eYv
ff2.|20
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR kgib$t_7
aF_ZV bS
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 y0Q/B|&[
CMD`b
2、列表运算符例:country IN ('Germany','China') x#!{5;V&K
:D)&>{?
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 tue%L]hc
bU@>1>b6lE
varchar、text、ntext、datetime和smalldatetime等类型查询。 RI<Yg#
~P.-3
可使用以下通配字符: 4h0jX9
88X*:Kf?:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 )QJU]G
}][|]/s?42
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 "#"Fp&Z7
0zkT8'v
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 d}A2I
vo^9qSX
f
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 "Ezr- 4
Ny&Fjzl
例如: %.Q2r ?j
sfBjA
限制以Publishing结尾,使用LIKE '%Publishing' + xu/RY_
w[n>4?"{
限制以A开头:LIKE '[A]%' |<o>$;mZ
8;dbU*
限制以A开头外:LIKE '[^A]%' \/e*quxx
wh[:wE]eX
4、空值判断符例WHERE age IS NULL 8Nl|\3nl-
J7aK3he
5、逻辑运算符:优先级为NOT、AND、OR ^_"q`71Dk
hSf#;=9'
(四)查询结果排序 $9u
xWI 0s;k
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: s9Q)6=mE
%BP)m(S7
ORDER BY {column_name [ASC|DESC]} [,…n] OrqJo!FEg{
2$/gg"g+
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 dJ"xW;"
{83He@
序。 1*Fvx-U'
X
+
例如: ;ZW}47:BS6
m">
=QP
SELECT * 7XI4=O};&%
5@r Zm4U
FROM usertable fbbl92p
i)^ZH#Gp
ORDER BY age desc,userid ASC |
3/p8
Bv|9{:1%X}
另外,可以根据表达式进行排序。 -JW6@L@
.j$bCKXGx
M:q;z(
""KN?qh9
二、联合查询 Xcpm?aTo
}(7QJk5 j
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 2\8\D^
g(F*Y>hk
合查询。UNION的语法格式为: h],%va[
7)8}8tY^{
select_statement /8-VC"
2dlV'U_g
UNION [ALL] selectstatement 4I[FE;^
E3C[o! 5
[UNION [ALL] selectstatement][…n] `:
g"AfI
其中selectstatement为待联合的SELECT查询语句。 blkJm9]v
^+l\YB7pD
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ?01""Om
>WS&w;G
行。 wk7_(gT`0
h+d;`7Z>
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 g.sV$.T2K
cg5{o|x
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 uNGxz*e
'|R@k_nx
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 xWZcSIH!
80"=Qu{s
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Br$PL&e~
u! FSXX<
型,系统将低精度的数据类型转换为高精度的数据类型。 )h!l%72
gd,%H@3
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: !rqR]nd
l,2z5p
查询1 UNION (查询2 UNION 查询3) 9@a;1Wr/f
~O7(0RsCN
U@AfRUF&
w+(wvNmNEK
NjyIwo0
<;Z3
5{
三、连接查询 ( #"s!!b
m8A_P:MQq
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 aw~EK0yU
ZvKMRW
数据库管理系统的一个标志。 /'_ RI
/6*.%M>r
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 #\["y%;W
^<Tp-,J$EN
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 G&H"8REm
QYb?;Z
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 e%Xf*64
j7 3@Yi%
查询。 PGhZ`nl
!27]1%Aw
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 U:jf9L2
k0uwG'(z9
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 oKJ7i,xT
<|G~S<y}
SQL-92标准所定义的FROM子句的连接语法格式为: J0! E@
#iDFGkK/
FROM join_table join_type join_table ! HC<aWb
|;-r};
[ON (join_condition)] L2$L.@
sYP@>tHC
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 MW>28
j]D = \
个表操作的连接又称做自连接。 ,FVy:"FR
W+S; Do
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 0l@+xS;
lM%fgyX
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 -B(K Q T,J
>D#}B1(!
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 X1dG'PQ
PCfs6.*5Mf
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) X($SBUS6
zL}hFmh
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 1y;zPJ<ntm
"A+F&C>
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Y@Y(;C"SW
;O11)u?/s|
数据行。 u.FDe2|[)
_?c.3+;s
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 r2'rfpQ
n"Vd"}sU.
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 T$;XJx
Q0_W<+`
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 = lD]sk
34:EpZO@
运算符等构成。 0M98y!A 5^
a $%[!vF
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 uy:=V}p
<J`xCm K
连接。例如: elB 8
Zw{tuO7}K
SELECT p1.pub_id,p2.pub_id,p1.pr_info ptQ(7N
p2(_YN;s
FROM pub_info AS p1 INNER JOIN pub_info AS p2 LTct0Gh
db~ :5#*
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) /vMyf),2
XCriZ|s
(一)内连接 3~la/$?p0
b15qy? `y
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 j #YFwX4.
J@iN':l-
三种: 3Q)>gh*
V5r7eC
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 6Qu*'
FM[To
表中的所有列,包括其中的重复列。 RY<b]|
?Fpl.t~
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 18`%WUPnT
E%B Gf}h
运算符包括>、>=、<=、<、!>、!<和<>。 SqB|(~S
D0i30p`
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询
+Bfi/ >
}C.{+U
结果集合中所包括的列,并删除连接表中的重复列。 =rF8[Q0K
[+z:^a1?V
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: V}-o):dI|
-~f.>@Wb
SELECT * Y cpO;md
1}*;
FROM authors AS a INNER JOIN publishers AS p jRAL(r|
0g-ESf``{n
ON a.city=p.city q(Q9FonU
1bkUT_
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): T@.D5[q0:
"mK (?U!A
SELECT a.*,p.pub_id,p.pub_name,p.country S I5QdX
Bx4GFCdifC
FROM authors AS a INNER JOIN publishers AS p ]E^f8s0#V
n`xh/vGm#
ON a.city=p.city E2D8s=r
qw1J{xoHW
(二)外连接 AAgA]OD,
>oDP(]YGg
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 xS1|Z|&
e]?S-J' z
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 f*Js= hvO
_9r{W65s
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ^j}sS!p
{m:R v&T
如下面使用左外连接将论坛内容和作者信息连接起来: /
u6$M/Cf>
926oM77
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b a*ymBGF
yfQE8v+
ON a.username=b.username *'-^R9dN.S
H_nJST<v`
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ts>}>}@vc
"s9gQAoaO
SELECT a.*,b.* V}+;bbUc-
Y'1V(5/&
FROM city as a FULL OUTER JOIN user as b yG$@!*|
?Nql7F4
ON a.username=b.username FoCkTp+/
%$| k3[4V
(三)交叉连接 ZRGZ'+hw
7!wnx.
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 8Oh3iO
I3Xh[% -!
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 v"~I( kf$
XtdLKYET
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 S]O Hv6
,>v9 Y#U
于6*8=48行。 %[m1\h"1
_!p3M3"$B
SELECT type,pub_name ~1sl.8tF
A"iD4Q
FROM titles CROSS JOIN publishers $uynW3h
u6T?oK9j
ORDER BY type