一、简单查询 $b`~K MO
{N'<_%cu
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 u )kQ*&
'j'G4P_G
表或视图、以及搜索条件等。 -n~%v0D8c
<gu>06
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 mJ JF
z2IKd'Wy
SELECT nickname,email 5\.w\
a_U[!`/w
FROM testtable m,^UD{
X-j3=8wPM
WHERE name='张三' @@"abhT
EPd
(一)选择列表 0;Z] vl/|
`L7Cf&W\l8
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 cxpG6c
-s&7zqW
量和全局变量)等构成。 -h%1rw
4gh`
>
1、选择所有列 x9 i^_3Z
TxvvCV^
例如,下面语句显示testtable表中所有列的数据: 6L, "gF<n
s7"5NU-
SELECT * s}g3*_"
|oX1J<LM
FROM testtable o[B"J96b
\%Lj !\
2、选择部分列并指定它们的显示次序 @YHt[>*S
Hd89./v`:
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 Mt\.?V:
`9mc+
例如: L17{W4
w On*QO[
SELECT nickname,email }dpE>
h)h%y)1
FROM testtable 4MPR
0;tu}]jnN
3、更改列标题 ;YYnIb(
sfzDE&>'
在选择列表中,可重新指定列标题。定义格式为: 0`$fs.4c
Z=9gok\
列标题=列名 &}!AjA)
SlI
wLv^
列名 列标题 2U&+K2
x<1t/o
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 yM#
%UeZ\
O PJ(ub
标题: ?e2G{0V
\JDxN
SELECT 昵称=nickname,电子邮件=email $%.,=~W7
j026CVL
FROM testtable
[
@9a
@BMuov
4、删除重复行 =F/ EzS
/5y _ <
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 V>& 1;n
Yd]
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 a^7QHYJ6
b]g#mQ
5、限制返回的行数 ccwz:7r
g4&f2D5
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 FXh*!%"*
SS!b`
表示一百分数,指定返回的行数等于总行数的百分之几。 iM M s3
?\_vqW
例如: lY[\eQ
1:
Qb8Z+7
SELECT TOP 2 * o ]@'R<F(u
?G 'sb}.
FROM testtable K&BaGrR
R{UZCFZ
SELECT TOP 20 PERCENT * Zx^R -9
gdkHaLL"
FROM testtable A@jBn6
ta0 ;:o?/d
(二)FROM子句 qJ[wVNHh!
Y}e3:\
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, dpcU`$kt
\d-9Ndp
nf
它们之间用逗号分隔。 ";TqYk=-
k,LaFe`W
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 7ea%mg\
TecWv@.
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 TGuCIc0B{
OmZK~$K_
使用下面语句格式加以限定: S^{tRPF%d
c3(0BSv
SELECT username,citytable.cityid A`1-c
&'u%|A@
FROM usertable,citytable ';LsEI[
{EJ+
WHERE usertable.cityid=citytable.cityid FTu<$`!1L
+>Pq]{Uf1j
在FROM子句中可用以下两种格式为表或视图指定别名: j-zWckT{
'j;i4ie>*x
表名 as 别名 ?dmwz4k0
)3^#CD
表名 别名 d(^3S>V|q
BiA^]h/|
例如上面语句可用表的别名格式表示为: nPhREn!
*i V#_
SELECT username,b.cityid c=aVYQ"2
,.AXQ#~&`
FROM usertable a,citytable b ?ZYj5[op,H
2=$ F*B>9
WHERE a.cityid=b.cityid )h1 `?q:5
(zw.?ADPCT
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 tR(L>ZG{
\zzPsnFIg
例如: c
6/lfgN
cd] X5)$h
SELECT a.au_fname+a.au_lname dTqL[?wH?
xP &@|Ag
FROM authors a,titleauthor ta W?0u_F
Hk?E0.
(SELECT title_id,title y1#QP3'Z1
2[Xe:)d
FROM titles syk,e4:oA
JqtOoR
WHERE ytd_sales>10000 ;Bat--K7+
:@S=0|:j
) AS t 02C;
mV}eMw
WHERE a.au_id=ta.au_id L08"8\
n6{nx[%7N7
AND ta.title_id=t.title_id 5;A=8bryU
;0}C2Cz'
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 2ZKy7p0/
,.V=y%
(三)使用WHERE子句设置查询条件 aZCxyoh +
D!D}mPi[
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: }3R:7N`,|
be'&tsZ9
SELECT * $it>*%
GuQ#
FROM usertable M] W5%3do
LP) IL~
WHERE age>20 wV'_{/WM
V,eH E5C
WHERE子句可包括各种条件运算符: e)oi3d.wJf
\oO&c
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Z$S0X$q}
B|S X?X
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Yy_mX}\x
:s|xa u=
NOT BETWEEN…AND… m^4O jik
Ps~)l#gue
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ar@ysBy
Q]-r'pYr
NOT IN (项1,项2……) jxnb<!|?H@
tfjb G;R
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ,J'@e+jV
||.Ve,<:
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ;o.,vQF*
> u=nGeO
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR k_1oj[O
#DcK{|ty
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 cQh=Mri]
yJw4!A 1!
2、列表运算符例:country IN ('Germany','China') cQ/T:E7$`
s=n_(}{ q
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 <@=w4\5j9
x2+M0 }g
varchar、text、ntext、datetime和smalldatetime等类型查询。 -ha[xM05
M:w]g` LKl
可使用以下通配字符: ~T&X#i
u!cA_,
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 T\L
LOx\
p fg>H
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 IeBb#Qedz
:#UN^ "(m}
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 q|e<b
b!g8NG
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 I)4NCjcCw
[Kd"M[1[<
例如: 5@~5RNrq2
LU@+ O12
限制以Publishing结尾,使用LIKE '%Publishing' n:YA4t7S
'w}/o+x@
限制以A开头:LIKE '[A]%' znd fIt^
@fSqGsSk
限制以A开头外:LIKE '[^A]%' ,YmTx
[RHji47
4、空值判断符例WHERE age IS NULL YCNpJGM
,y/N^^\
5、逻辑运算符:优先级为NOT、AND、OR H/O v8|
}C&kzJBEF
(四)查询结果排序 .gd'<l
j(\jYH>
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: SL>0 _
O)G^VD s
ORDER BY {column_name [ASC|DESC]} [,…n] U+g<lgH1J
vjD||!g'
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 !,PoH
a5%IjgQ&z
序。 T8a!"lPP7
PWs=0.Wj
例如: R~(_m#6`:
>]WQ1E[=
SELECT * 5K?%Eo72!=
h:'wtn@l(
FROM usertable o^~KAB7
u<
.N\/
ORDER BY age desc,userid ASC X3rvM8
O.+X,CQG*
另外,可以根据表达式进行排序。 04R-}
C?%Oi:Gi&
x)o`w"]al
,]-A~ ^|
二、联合查询 j0[9Cj^%c
KR/SMwy
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 *7 >K" j
XxE>KeP
合查询。UNION的语法格式为: n7K\\|X
OAtn.LU
select_statement *|k/l I
@60/IE{-v
UNION [ALL] selectstatement -m>ng
E~q
qW:\6aEG
[UNION [ALL] selectstatement][…n] x$aFJCL
/|{~GD +A&
其中selectstatement为待联合的SELECT查询语句。 9`sIE _%+
.(2ui~ed
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 $qj||zA
Md ,KW#
行。 o9uir"=
(.B+U'6
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 ?]u=5gqUU
{H%1sI
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 0CRk&_ht
~b.e9FhdA
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ZtqN8$[6n
Nb@zn0A(;
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 2s:$4]K D
>0qe*4n|M
型,系统将低精度的数据类型转换为高精度的数据类型。 iu6NIy7D
$N)b6(}F10
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: O*7`Waag
Vy[ m%sEP
查询1 UNION (查询2 UNION 查询3) |#=4]]>m
knJoVo]
9N]V F'
2DTBL:?`
,,[pc
:IlJQ{=W
三、连接查询 'VTLp.~G~
rfS kQT
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 &%4*~;o
*(sFr E
数据库管理系统的一个标志。 w*"h#^1z
E<XrXxS1O
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 T.p:`}Ma
<rpXhcR
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 \zPcnDB
D/-$~u_o
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 L cpz(W^
Xi!`+N4
查询。 G(1y_t
|SF5'\d'
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ]DO"2r
sAz]8(Fi0
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ]#VNZ#("
,HE +|y#
SQL-92标准所定义的FROM子句的连接语法格式为: 5b^`M
mlD 1 o
FROM join_table join_type join_table d=_Wgz,d
S*-/#j
[ON (join_condition)] ir ^XZVR
wNgS0{}&`
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 *N#{~
k)l^;x-
个表操作的连接又称做自连接。 VU[4 W8f
ry%Fs&V*>
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 #n8jn#
Wa|lWIMK
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 %"0g}tK6
-O?}-6,_Z
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 9G@
J#vsqr
z_LN*u
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) &