一、简单查询 [Ur\^wS
D"J',YN$
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 g5
T
0z'GN#mT5
表或视图、以及搜索条件等。 S=(<m%f
Y=p!xr>
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 m8ts!6C
DmpT<SI+!
SELECT nickname,email H1I^Vij
-8xf}v~u
FROM testtable Wl |5EY
y{S8?$dU$:
WHERE name='张三' d2V X\
y(o)}m*0
(一)选择列表 p}^5ru
RFMPh<Ac
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 3V<@Vkf5
.4p3~r?=S
量和全局变量)等构成。 AH|gI2
@^A5{qQ\
1、选择所有列 =hkYQq`Q
'`3#FCg
例如,下面语句显示testtable表中所有列的数据: |RFBhB/u
odCt6Du
SELECT * MfP)Pk5
yEq7ueJ'
FROM testtable TG%B:^Yz!
;%9]G|*{
2、选择部分列并指定它们的显示次序 $P=C7;
*!%lBt{2
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 U}LW8886
=eDIvNps
例如: =j62tDS
_p^"l2%D/
SELECT nickname,email {uj_4Ft
J0?kEr
FROM testtable |M7cB$y
P(hGkY=(
3、更改列标题 X_]rtG
xSm;~')g
在选择列表中,可重新指定列标题。定义格式为: &3BoK/y3
h q)1YO
列标题=列名 d'RvpoM
D7;9D*o\
列名 列标题 $@D a|d4
64<;6*
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 8NWo)y49H
Snx!^4+MF
标题: aYWWln
}(oeNPM8
SELECT 昵称=nickname,电子邮件=email s
V_(9@b
"j@\a)a
FROM testtable flsejj$
)h8}{*
4、删除重复行 Fl-\{vOn
)S
caT1I
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 CIjc5^Y2
98>GHl'lM
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 T$I_nxh[)L
xG9Sk
5、限制返回的行数 6qWUo3
;]u9o}[
2
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 VPe0\?!d
FEaT}/h;
表示一百分数,指定返回的行数等于总行数的百分之几。 ?, S/>SP
DN*5q9.
例如: =~B"8@B
CMXF[X)%
SELECT TOP 2 * AcC &Q:g
aQCu3T
FROM testtable ieFl4hh[G
8]ZzO(=@{
SELECT TOP 20 PERCENT * .T|
}rB<c
UEU/505
FROM testtable =dmr,WE
#c^V%
(二)FROM子句 *m~-8_ >;
+$h
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, [_,as
*doNPp)m
它们之间用逗号分隔。 [9 W@<p
e$# *t
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 |A8@r&
2cR[~\_9.
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 "& ,ov#
IS2cU'
使用下面语句格式加以限定: CSO'``16
&{}Mds
SELECT username,citytable.cityid (W
~K1]
ZK5nN9`
FROM usertable,citytable ZJYn[\]
Qp>leEs]+6
WHERE usertable.cityid=citytable.cityid Wg']a/m
J ^'El^F
在FROM子句中可用以下两种格式为表或视图指定别名: Zxa.x?:?n
Zh"m;l/]
表名 as 别名 [#PE'i4
a=iupXre9
表名 别名 eb62(:=N6
?=VvFfv%
例如上面语句可用表的别名格式表示为: (_T{Z>C/J
A,}M ^$@
SELECT username,b.cityid o).deP
s-
J|`0GDSn
FROM usertable a,citytable b #b/qR^2qW
v}G^+-?
WHERE a.cityid=b.cityid '![oLy
*g/klK
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 b;k+N`
YW7W6mWspS
例如: xa>| k>I
=>jp\A
SELECT a.au_fname+a.au_lname ;]{ee?Q^ld
B,%Vy!o
FROM authors a,titleauthor ta yvAO"43
[q<'ty
(SELECT title_id,title BR,-:?z
}qNc `8h
FROM titles _yg_?GH
^L[:DB{Z
WHERE ytd_sales>10000 1F@k9[d~
=BJe)!b
) AS t +r:g }iR
iUx\3d,
WHERE a.au_id=ta.au_id .tngN<f
~zVxprEf_
AND ta.title_id=t.title_id
hAGHb+:
XzUGlrp:Y#
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 (]|h6aI'}
x9_mlZ
(三)使用WHERE子句设置查询条件 bc)>h!'Y
C|'DKT4M&
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: "yWw3(V2>
PRKZg]?
SELECT * )!T~l(g
ex3Qbr
FROM usertable 6TtB3;5
La4S/.
WHERE age>20 U{U"%XdO
} M#e\neii
WHERE子句可包括各种条件运算符: ?,} u6tH
$3-vW{<
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ys[Li.s:
}F`|_8L*v)
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… R.~[$G!
odRiCiMH
NOT BETWEEN…AND… 9!FX*}dC
!jCgTo
y
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) dP5x]'"x
jc^QWK*q
NOT IN (项1,项2……) Lb*KEF% s
^ Ltho`
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE Q8p6n
.Y)[c.,j
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL |)-kUu
j8Z, :op
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR @Nu2
:~JO
91-bz^=xO
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Up9{aX
Bo 35L:r|
2、列表运算符例:country IN ('Germany','China') L@}PW)#
'ofj1%c
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 v^|U?
,:_c-d#
varchar、text、ntext、datetime和smalldatetime等类型查询。 $=aO*i
@6u/)>rI
可使用以下通配字符: 5&]5*;Bv J
mH*ldf;J;=
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 %,>z`D,Hg
20:F$d
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Lvk}% ,S8t
.sMs_ 5D
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 s**<=M GK
36d nS>4
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 j\>LJai"
h2l;xt
例如: ~9X^3.nI
0;Z|:\P\=
限制以Publishing结尾,使用LIKE '%Publishing' <izQ]\kL
&2'-v@kK
限制以A开头:LIKE '[A]%' tvkdNMyX%9
-m@o\9Ic
限制以A开头外:LIKE '[^A]%' h`[$
Bp
.*O*@)}Ud
4、空值判断符例WHERE age IS NULL L/3A g*
]
B#sCB&(
5、逻辑运算符:优先级为NOT、AND、OR )6|L]'dsZ
N Ob`)qb
(四)查询结果排序 "oP^2|${
z;OYPGvkw
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: !avol/*
+WX/4_STV
ORDER BY {column_name [ASC|DESC]} [,…n] bO~y=Pa\
mHD_cgKN
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 eP{srP3 9
J-W9B amx
序。 ou,[0B3n0
oXPA<ef o
例如: l|5 h
xtV+Le%
SELECT * e`*}?N4d
j"W>fC/u
FROM usertable +UzQJt/>>
Y&|Z*s+
+}
ORDER BY age desc,userid ASC 6FS%9.Ws
bR\7j+*&
另外,可以根据表达式进行排序。 XS<>0YM
]5%0EE64
sdp&D@
Psb !Z(
二、联合查询 Pt]>AW;i
Zxk~X}K\P
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 iL/c^(1
UG| /Px ]
合查询。UNION的语法格式为: s t'T._
U(&c@u%
select_statement 05UN
<l]
F^!D[:;jK
UNION [ALL] selectstatement TnW`#.f
G gO5=|
[UNION [ALL] selectstatement][…n] 6BE,L
ep>!jMhJa
其中selectstatement为待联合的SELECT查询语句。 kpOdyn(
5LeZ?'"c
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 *k?:k78L
01kRe
行。 rPxRGoR
''17(%
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 woI5a ee|
Ee>VA_ss
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 dQ:,pe7A
?hoOSur+
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 A(Ct^/x-
+Y;P*U}Qg[
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Mz+I
YP`L
h>Kx
型,系统将低精度的数据类型转换为高精度的数据类型。 1"
'3/MFQ8
*v<f#hB"
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: kk4 |4
#G9
W65 f
查询1 UNION (查询2 UNION 查询3) CEfqFn3^
ew;;e|24
r6<;bO(
S
?Zh#`(*
s{^98*
}D1x%L
三、连接查询 G?Et$r7:R
iFIGJS
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 w\C1Bh!
j?T'N:Qd
数据库管理系统的一个标志。 7UTfafOGX
uWS]l[Ga
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 )Q2Ap&
[@$ SLl^Y
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ]:%DDlRb
>a3m!`lq
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 q~`hn(S
2mY!gVi
查询。 eqtZU\GI>
s.1F=u9a
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 dCx63rF`G
uYW4$6S3
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 &1\/B
,GOIg|51
SQL-92标准所定义的FROM子句的连接语法格式为: m:BzIcW<\
]2zM~
FROM join_table join_type join_table Jv~R/qaaD
_|~Dj)z
[ON (join_condition)] =<\22d5L
'h$:~C
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 }i9:k kfq2
@52#ZWy
个表操作的连接又称做自连接。 w4
yrAj
2
FgdnX2s J
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 cXXZ'y>FP
-"-.Z
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 TE`5i~R*
Va!G4_OT
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ^[hAj>7_8$
74^v('-2
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) Iv6 lE:)
n"iS[uj,
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 <Bo\a3Z
U~
X
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 E}wT5t;u
a\sK{`|X*
数据行。 DJGafX^
*QK)
1Y1W
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 r3V1l8MV
5(~Lr3v0
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 !~
o%KQt
[$3+5K#
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 z|s(D<*w
@$slGY
运算符等构成。 ^y,h0?Z9
aEf3hB* ~
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 eKLvBa-{@
}6Pbjm *
连接。例如: AA\)BNM
e'b*_Ps'
SELECT p1.pub_id,p2.pub_id,p1.pr_info lxd{T3LU
z ]f(lwo{
FROM pub_info AS p1 INNER JOIN pub_info AS p2 #-|fdcb
|JkfAnrN$I
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 9hr7+fW]t
*eg0^ByeD
(一)内连接 "DN,1Q
lCp
_2KIe(,;
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 'Agw~
&$
w|dfl *
三种: ss-W[|cHU
(]w6q&,
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 j$T12
AojL4H|
表中的所有列,包括其中的重复列。 y\v#qFVOZ
~\=D@G,9
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 7U7!'xU
8#!g;`~ D
运算符包括>、>=、<=、<、!>、!<和<>。 A%#M#hD/
sOqFEvzo1%
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ^i@anbH
S(@kdL
结果集合中所包括的列,并删除连接表中的重复列。 =
#-zK:4
>5O~SF.
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: aOvqk ^
cfmLErkp
SELECT * ,h=a+ja8
,^bgk
-x-
FROM authors AS a INNER JOIN publishers AS p :2lpl%/
<M9NyD`
ON a.city=p.city 2hV -h
:uo)-9_
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): =`x }9|[
4dixHpq'
SELECT a.*,p.pub_id,p.pub_name,p.country :]:)c8!6
iw#~xel<ez
FROM authors AS a INNER JOIN publishers AS p !h1:AW_iz
Bq$IBAot
ON a.city=p.city f?d5Ltg
=]%,&Se
(二)外连接 /KvJjt'8
_Q:z -si
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 :G>w MMv&z
I^EZ s6~
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 =r+K2]z,L
x8aOXN#w}
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 LZ wCe$1
}$i"t8"s
如下面使用左外连接将论坛内容和作者信息连接起来: mr7Oi `dE
D>k(#vYKB
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b XQ~Xls%]
U4*u|A
ON a.username=b.username YE@yts
e-*@R#x8+
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: r 10VFaly
j-d&4,a:c
SELECT a.*,b.* 1\}XL=BE
Z,"4f*2
FROM city as a FULL OUTER JOIN user as b .Wt3|?\=nd
%%ouf06.|
ON a.username=b.username (Yz[SK=U}
a0hBF4+6
(三)交叉连接 Sm<*TH!\n_
j^=Eu r/
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 NWh1u`
frUs'j/bZ
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 zG$5g^J
N!c FUZ5]
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 e".=E;o`
S3M!"l
于6*8=48行。 #OPEYJ;*9d
gy@=)R/~
SELECT type,pub_name eP"B3Jw
@_f^AQ
FROM titles CROSS JOIN publishers s! 2[zJ19p
hZfj$|<
ORDER BY type