一、简单查询 4$mtc*tzT
?I+$KjE+
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 A42!%>PB
u|\?6fz
表或视图、以及搜索条件等。 VMo:pV
uvR l`"Y
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 b5.]}>]t
cdGBo4
SELECT nickname,email Y]`o-dV
e_l|32#/
FROM testtable De{ZQg)
4MzPm~Ct
WHERE name='张三' 8}AWU
tv~Y5e&8
(一)选择列表 PRBlf
eR`Q7]j] -
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 OTAe#]#
&sYxe:H
量和全局变量)等构成。 z6,E}Y
)J+A2>
1、选择所有列 %\}5u[V
M0?%r`
例如,下面语句显示testtable表中所有列的数据: ([^f1;ncm
Akws I@@
SELECT * Jf#-OlEQ
n0EW
U,1
FROM testtable rz`"$g+#
D#`>p
2、选择部分列并指定它们的显示次序 zMO#CZ t
f+1'Ah0'E
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 .LnknjC
Z.x]6
例如: Aeo=m}C;
{Xr 9]g`
SELECT nickname,email u~JR]T
IDpx_
FROM testtable gq4X(rsyD
\D]9:BNJ
3、更改列标题 jaavh6h)
gNDMJ^`
在选择列表中,可重新指定列标题。定义格式为: =FiO{Aw`N
{9Ok^O
列标题=列名 jffNA^e
wuk\__f4
列名 列标题 cW"DDm
g
<$a-.C5
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 $A/?evJi8R
%q9"2]
cR
标题: OQKc_z'"
agkKm?xIL
SELECT 昵称=nickname,电子邮件=email ;KEie@Ry
!;d>}iE
FROM testtable I36%oA
v9KsE2Ei
4、删除重复行 %3"U|Za+
R?tjobk!
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 1,]FLsuy
mI:^lp
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 -xN/H,xok
fBz|-I:k
+
5、限制返回的行数 Q00v(6V46
T(]*jaB
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Ai^0{kF6
R?2HnJh
表示一百分数,指定返回的行数等于总行数的百分之几。 Q"c/]Sk)
UWK|_RT6SA
例如: y9LO;{(
q"DHMZB
SELECT TOP 2 * WSv%Rxr8L
^Oeixi@f
FROM testtable Br42Qo2"T>
>LN*3&W
SELECT TOP 20 PERCENT * ^,5%fl
G)M! ,
Q
FROM testtable /` nkz
T\=#y
(二)FROM子句 H!OX1F
njO~^Hl7
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, _'X
4i}nk
T
它们之间用逗号分隔。 ;cPPx`0$9
V}7)>i$A
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 .n4{xQo,EJ
PlK3;
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ?,+&NX3m
fR+{gazk
n
使用下面语句格式加以限定: 4GG>n
~Z*7:bPN!^
SELECT username,citytable.cityid mW+5I-~
+xsGa{`
FROM usertable,citytable _8F;-7Sz
~-uf%=
WHERE usertable.cityid=citytable.cityid |!7leL
@'GPZpbvZ
在FROM子句中可用以下两种格式为表或视图指定别名: :F#^Q%-IS
.O(9\3q\
表名 as 别名 /me ]sOkn
*PB /I4>{
表名 别名 7N@[Rtv
Bg zq
例如上面语句可用表的别名格式表示为: "!7Hu7
5} ur,0{
SELECT username,b.cityid XP:fL
NpQ
3 |LRb/|
FROM usertable a,citytable b #w \x-i|
f\Hw Y)^>
WHERE a.cityid=b.cityid }LQV2 hKTG
&)JoB
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 vWrTB
?EPHq,
E
例如: WS(m#WFQr
0R`>F">
SELECT a.au_fname+a.au_lname G(Hr*T%
-"a(<JC^NI
FROM authors a,titleauthor ta ,F`1VpTd8
Soe2Gq
(SELECT title_id,title f7!48,(fB
&V SZ
FROM titles Kb;Pd!Q
`d4xX@
WHERE ytd_sales>10000 x
_d
I.|b:c
xN
) AS t ;L#RFdh
B]}gfVO
WHERE a.au_id=ta.au_id 8'bZR]
JC~4B3!
AND ta.title_id=t.title_id iC^G^ ~V+H
9 BU#THDm
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 Eyk:pnKJb
/YU8L
(三)使用WHERE子句设置查询条件 -%P}LaC<
h8Oj
E$
H
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: J(maJuY
9=/4}!.
SELECT * =OV5DmVmQ
HINk&)FC
FROM usertable \-{$IC-L
7bRfkKD
WHERE age>20 l,(:~KH|
V>Xg\9B_
WHERE子句可包括各种条件运算符: k\*?<g
n5BD0q
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< V=5*)i/
CyHHV
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… +/kOUz/]
G|-RscPe
NOT BETWEEN…AND… r|\{!;7
-e_TJA
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) =5fY3%^b{
YO?o$Hv16
NOT IN (项1,项2……) ht>/7.p]
x>BFK@#
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE )b=vBs`%
K3h7gY| .
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL O'#;Ge/,
,,80nW9E
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR LikCIO
matm>3n
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 4x4[
h)j#?\KYm9
2、列表运算符例:country IN ('Germany','China') *b0z/6
z
j#<X
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 AFvv+
ss
_1Ne+"V
varchar、text、ntext、datetime和smalldatetime等类型查询。 TvT>UBqj=
3B,dL|q(@J
可使用以下通配字符: Bz>f
,3MHZPJ?k]
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 6@FhDj2X
0Bkz)4R
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Cc`-34/%
K^tc]ZQ
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 tQUKw@@Q
upZc~k!1\
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 #*"V'dj;e
5=p<"*zJ
例如: /uDcJ1u66
gM]E8%;{
限制以Publishing结尾,使用LIKE '%Publishing' B^zg#x#8
Lyn{Uag
限制以A开头:LIKE '[A]%' hgE:2@
SK@ p0:
限制以A开头外:LIKE '[^A]%' |]?W`KN0
%Ny1H/@Q1+
4、空值判断符例WHERE age IS NULL H_x}-
L ed{#+
5、逻辑运算符:优先级为NOT、AND、OR `/N={
t:P]bp^#
(四)查询结果排序 uW/>c$*)
[P ;fv
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: BzWkZAX
QkHG`yW
ORDER BY {column_name [ASC|DESC]} [,…n] %_B2/~
QXL .4r%
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ggM~Chr
h4hp5M
序。 S*J\YcqSC
S>*i\OnI'
例如: o]qwN:8^
EK0~3HSZ
SELECT * V\r{6-%XiW
4t/ ?b
FROM usertable r%X
M`;bQX
h?B1Emlq
ORDER BY age desc,userid ASC l. l)w
EowzEGq!a5
另外,可以根据表达式进行排序。 =OPX9oG
! os@G
kv+^U^WoU
Lw(tO0b2H
二、联合查询 %0}}Qt
\{~CO{II
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 o~"Y_dLsW
K{@xZ)
合查询。UNION的语法格式为: VGxab;#,:3
.j|uf[?h
select_statement /Qef[$!(
.Z"`:4O
UNION [ALL] selectstatement 9(z) ^G
[E6ceX0
[UNION [ALL] selectstatement][…n] e00}YWf%
_G.!^+)kEm
其中selectstatement为待联合的SELECT查询语句。 Ef?|0Gm
lVd-{m)
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ;
2V$`k
\*b
.f
行。 YN<vOv
!dh:jPpKq
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 5=<KA
~$j;@4
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 A<TYt
M
~ QohP`_
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 T:2f*!r
/'_<~A
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 m8R=wb
:
j)YX=r;xM
型,系统将低精度的数据类型转换为高精度的数据类型。 EfpMzD7/(
Ij =NcP
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: /cUu]#h
+_bxza(ma{
查询1 UNION (查询2 UNION 查询3) JEWc{)4QD
aot2F60J,
@V5i
@H~oOf
[UC_
Iu`S0#+
三、连接查询 g.%} +5
s3Zt)xQ3
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 v#<{Y'K
.sM,U
数据库管理系统的一个标志。 x{K"z4xbI
dtfOFag4_
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 *_#2|96)
M
l@F
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 6\I1J=
C
6J}Yr5oD
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 6vps`k$,~
=>evkaj
查询。 mXS]SE
XK@&$~iA3
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 jV%=YapF
)S`[ gK
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 WvfM.D!
g"kI1^[nj
SQL-92标准所定义的FROM子句的连接语法格式为: tu* uQ:Ipk
F.1u9)
FROM join_table join_type join_table e?B}^Dk0i
rKFnivGT
[ON (join_condition)] 3"v>y]$U
$U9]v5
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 q+*\'H>
N|>JLZ>
个表操作的连接又称做自连接。 .QZjJ9pvK
B]()
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 _O'!C!K6
ePJ_O~c
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 qq<T~^
(U#
Oj"
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 42 lw>gzr!
@|wU
@by{
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 4KR`
#ley3rJW]
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 !!V1#?0jw
-Q
JP J.
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 v7KBYN
{7]maOg>7J
数据行。 *)
T"-}F
v@q&B|0
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 .|hsn6i/-
|3T2}oh rr
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 [+R_3'aK
X;UEq]kcmn
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 8zlvzp
G7v<Q,s
运算符等构成。
_(8#
Yk?q \1
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 B&B:P
.s,04xW\
连接。例如: "-X8
s2|.LmC3|B
SELECT p1.pub_id,p2.pub_id,p1.pr_info S1Od&v[R
K?!W9lUq
FROM pub_info AS p1 INNER JOIN pub_info AS p2 _E'}8.#{
V]+y*b.60
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) cHT\sJo`l
y {Bajil
(一)内连接
+PADy8
"9QZX[J|*
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 \ ~+b&
8OV=;aM?{
三种: vWM&4|Q1~
0,0Z!-Y
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 'Q :%s
uYg Q?*Z
表中的所有列,包括其中的重复列。 4
?PB
Fbd
Kb{&a
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 U5~aG!E
6S3D#SY
运算符包括>、>=、<=、<、!>、!<和<>。 AzZhIhWl">
:Rv+Bm
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 D]}~` SO
^gp]tAf
结果集合中所包括的列,并删除连接表中的重复列。 p3mZw lO
p_&B+
<z
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: sZr \mQ~
v^s?=9
SELECT * 0|j44e}
V59!}kel1%
FROM authors AS a INNER JOIN publishers AS p Db*b"/]
Y,}h{*9Kd
ON a.city=p.city cNmAr8^}
quaRVD>s +
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): '<<@@.(f
{^N,$,Ab.
SELECT a.*,p.pub_id,p.pub_name,p.country O#18a,o@
DeNWh2
FROM authors AS a INNER JOIN publishers AS p Fv
%@k{
?6&G:Uz/
ON a.city=p.city KGo^>us
8,[ *BgeX
(二)外连接 .JB1#&B+
F*Hovxez
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Vjt7X"_/
tx9%.)M:n
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 tKLeq(
HpIi- Es7C
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ILH[q>
5EI"5&`*
如下面使用左外连接将论坛内容和作者信息连接起来: @d|Sv1d%
cl&?'`
)
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b a*D<J}xe
U;
<{P
ON a.username=b.username uuF~+=.|
W% Lrp{
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: =EA @
{Ke
IYjE
SELECT a.*,b.* +$(y2F7|u-
wA/!A$v(
FROM city as a FULL OUTER JOIN user as b uuD2O )v
\I4Uj.'>\
ON a.username=b.username W?E,"z
g4Dck4^!4
(三)交叉连接 2W_[|.;'
BCz4
s{F
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 _ eBNbO_J
JLo E)\Mi
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 R[v<mo[s
L&:A59)1k
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 Vraz}JV
nFG X2|d
于6*8=48行。 4 Sk@ v
c1+z(NQ3
SELECT type,pub_name *dBmb
P{`fav
FROM titles CROSS JOIN publishers l$c/!V[3
iWr
#H
ORDER BY type