一、简单查询 2=_gf
vv=VRhwF
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 +o9":dl
85GKymz$P
表或视图、以及搜索条件等。 ~}<DG1!
yBI'djL~>
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 rylzcN9RM$
%RDI!e<e}
SELECT nickname,email jRL<JZ1N
2,*M|+W~
FROM testtable 4rrSb*
o*J3C>
WHERE name='张三' &iV,W4
a1@Y3MQ;i
(一)选择列表 |DsnNk0c
^_m9KA
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 v;)..X30
#t+d iR
量和全局变量)等构成。 _8E/)M
Z4\=*ic@
1、选择所有列 =W'Ae,&
rEF0oJ.
例如,下面语句显示testtable表中所有列的数据: [Vma^B$7Vj
%Z1N;g0
SELECT * ow]053:i
Bi{$@n&?f
FROM testtable Sm5H_m!
~sXcnxLz
2、选择部分列并指定它们的显示次序 ^U!0-y
6AhM=C
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 8e(\%bX
rh^mJUh
例如: r
>nG@A
aca=yDs2
SELECT nickname,email 9B9(8PVG
tdu$pC6
FROM testtable c??mL4$'N
S.f5v8
3、更改列标题 _D+J!f^
f=9|b
在选择列表中,可重新指定列标题。定义格式为: N}t
2Nu-
Dg?:/=,=9r
列标题=列名 PAM}*'
:\o {_
列名 列标题 .P"D
mVpMh#zw
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 lx7Q.su'
?)ONf#4Y
标题: k-^mIJo}
^\S~?0^m
SELECT 昵称=nickname,电子邮件=email H|HYo\@F#
e(<str>
FROM testtable 6l:qD` _
?o|f':
4、删除重复行 V6,H}k
mUikA9u5=
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Rw0qcM\>|
CTZ8Da^
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Y<%@s}zc
LHo3
Niy.
5、限制返回的行数 wLnf@&jQ%
,1+y/{S
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是
t!_<~
2$ze=
/ l
表示一百分数,指定返回的行数等于总行数的百分之几。 S;286[oq@
.E8_Oz
例如: /~$WUAh
KJaXg;,H
SELECT TOP 2 * waj0"u^#
~yW4)4k;b
FROM testtable S(*sw
0O@+
i\rDu^VQ
SELECT TOP 20 PERCENT * 2Tp1n8FV
[R^iF
FROM testtable {ix?Brq/
>8#X;0\Kj
(二)FROM子句 FW G6uKv
NRIG 1v>
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, S p;G'*g
AW!?"xdZ
它们之间用逗号分隔。 6"J?
#
'6cWS'9"
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 nz=GlO'[
#(N+(():
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 I%j|D#qY:T
afuOeZP
使用下面语句格式加以限定: iW%I|&
?IqQ-C)6D
SELECT username,citytable.cityid '}Z~JYa0
F`XP@Xx
FROM usertable,citytable ?R$F)g7<
RL@VSHXc
WHERE usertable.cityid=citytable.cityid aJbO((%$|u
xy/`ZS2WPq
在FROM子句中可用以下两种格式为表或视图指定别名: WrxP
:~tAUy":_*
表名 as 别名 0zlb0[
CUBEW~X}M
表名 别名 .ps-4eXF
t4zkt!`B
例如上面语句可用表的别名格式表示为: 8hOk{xs8
D%OQ e#!
SELECT username,b.cityid 7vrl'^ 1
+eK"-u~K
FROM usertable a,citytable b 'MUv5Th
\IV1j)I"u
WHERE a.cityid=b.cityid s
E2D#D
}@'$b<!B
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Zw5Ni Xj
?(Dq ?-.
例如: c[wla<dO*
|ef7bKU8
SELECT a.au_fname+a.au_lname :cem,#(=
hV8[@&Sx3
FROM authors a,titleauthor ta |:nOp(A\*
1PVtxL?1P
(SELECT title_id,title u~7hWiY<2
_~IR6dKE
FROM titles )t0$qd ]
S;3R S;
WHERE ytd_sales>10000 QdH\LL^8R4
eL10Q(;P`
) AS t z&#SPH*
R]c+?4J
WHERE a.au_id=ta.au_id [842&5Pd?
c}Ft^Il
AND ta.title_id=t.title_id a
oD`=I*<
p4.wh|n
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 m[?E
>kj`7GA
(三)使用WHERE子句设置查询条件 D.B.7-_8
R}
eN@#"D
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: >Ea8G,
nhB1D-
SELECT * Y;dz,}re
GY6`JWk
FROM usertable Qi,j+xBp
\\r)Ue]
WHERE age>20 ?i7%x,g(Z
\rx3aJl
WHERE子句可包括各种条件运算符: Y}t \4 di
FOv=!'So
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< kw>v:F<M
7`-Zuf
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 6Z>FTz_
!o5
W
NOT BETWEEN…AND… 2 Wt> Mi
|4)>:d
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) MW! srTQ_
PlU*X8
NOT IN (项1,项2……) s1MErd
Ye"o6_U"
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 1t:Q_j0Ym
**w!CaqvY
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL r54&XE]O
09X01X[
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR oz,np@f)J
}6p@lla,%]
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ?x$"+,
^Ew]uN>,
2、列表运算符例:country IN ('Germany','China') *"+=K,#D
3AHlSX
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 ;+e}aER&9
NTdixfR
varchar、text、ntext、datetime和smalldatetime等类型查询。 Upc+Ukw
>QjAoDVX?
可使用以下通配字符: <>dT64R|
3VsW@SG7N
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 <L mIK
%z/hf
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 _K`wG}YIE
J}htu
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 *i\Qo
h hG4-HD
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 _g+JA3sIJ
aH 4c02s$
例如: 7FzA*
I(]}XZq
限制以Publishing结尾,使用LIKE '%Publishing' xO$lsZPG
D2<fw#
限制以A开头:LIKE '[A]%' sR(9IW-
"8c@sHk(w
限制以A开头外:LIKE '[^A]%' %@wJ`F2a_
)2pbpbWX>
4、空值判断符例WHERE age IS NULL `s"'r !
a;rdQ>
5、逻辑运算符:优先级为NOT、AND、OR _76PIR{an
#Vl 0.l3
(四)查询结果排序 ^M3~^lV
DQNnNsP:M-
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: o]+z)5zC
~"!]
3C,L
ORDER BY {column_name [ASC|DESC]} [,…n] Wl;.%.]>
D!Q">6_"z
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 " W!M[qBW
Fgk ajig
序。 m`IC6*
~Fe${2
例如: ~res V
d_AK`wR
SELECT * FqkDKTS\&
K\>tA)IPSV
FROM usertable {s)+R[?m<o
nIAx2dh?
ORDER BY age desc,userid ASC BHd&yIyI
_9faBrzd
另外,可以根据表达式进行排序。 ZtV9&rd7
CEXyrs<
M^MdRu
mYxuA0/k
二、联合查询 T:t]"d}}
h"Xg;(K
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 y#>,+a#5
VOKZ dC-
合查询。UNION的语法格式为: $@sEn4h
WzAb|&?
select_statement 0T@ Zb={
>C7r:%
UNION [ALL] selectstatement $h^wG)s2P
K2he4<
[UNION [ALL] selectstatement][…n] &/mA7Vf>eR
-c(F 1l
其中selectstatement为待联合的SELECT查询语句。 xHoKo
y@ ML/9X8q
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 |w_7_J2
i7]4W
行。 r9X?PA0f
Kpb#K[(]&
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 M54j@_81pX
Q&MZN);.
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 cS>e?
SPN5dE.@
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 W"):-Wq
X'%E\/~u
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 {8 8 )~
/[O(ea$U
型,系统将低精度的数据类型转换为高精度的数据类型。 Fkvl%n
JmPHAUd
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: b}0,\B%
W`K7 QWV4
查询1 UNION (查询2 UNION 查询3) 0QPH}Vi5}
}Mo=PWI1?
9[1`jtm
lCAIK
OC1I&",Ai|
$"0M U
三、连接查询 8d?g]DEN)6
A6GE,FhsG
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 mu?Eco`~
;FBUwR}
数据库管理系统的一个标志。 ,
FhekaA
w:s]$:MA8
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 (ohq0Y
hJwC~HG5
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 U"q/rcA
At flf2 K
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 8CnRi
8#(Q_
查询。 @kk4]:,w
{LX.iH9}l
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 \cC%!4
9;Itqe{8w
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ._8KsuJG
qtiz a~u
SQL-92标准所定义的FROM子句的连接语法格式为: &07]LF$]
V6t,BJjS
FROM join_table join_type join_table uwa~-xX6
a;QMAd!
[ON (join_condition)]
Vm(1G8 a
>tO`r.5u9
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 g)s{IAVx
)t$,e2FY
个表操作的连接又称做自连接。 zunV<2~(2}
\"CZI<=TB
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 *g y{]
58%#DX34M
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 uHAT#\m:
_Qh
z3'I1
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 -8r
Qtbbb3m;
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) .A-]_98Z
GP&vLt51
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ([-|}
,z;ky5Ct
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 YqPQ%
oqLfesV~
数据行。 Si_%Rr&jW
$/=nU*pd
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 @+9<O0
0
;b[QRmy
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 v^ zu:Z*
;9~6_@,@o
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 E2cB U{x
u0#}9UKQ
运算符等构成。 +hE(Ra#
Wx~k&[&E
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 2gzou|Y
HsnLm67'
连接。例如: Ma8_:7`>O
0pJ
":Q/2)
SELECT p1.pub_id,p2.pub_id,p1.pr_info v.:3"<ur}
;Ra+=z}>
FROM pub_info AS p1 INNER JOIN pub_info AS p2 "Kc>dJ@W
H|ER
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) $KLD2BAL
c%[#~;E
(一)内连接 iJZ/jCI
Mz1G5xcl
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 B Ce|is0
K-f1{ 0
三种: :.?gHF.?
?gPKcjgoH!
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Gg~QAsks
j6
表中的所有列,包括其中的重复列。 ^{xeij/
?Q-h n:F)
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 E[O<S B
I
52b*[tZ
运算符包括>、>=、<=、<、!>、!<和<>。 !A>z(eIsv`
'Fs)Rx}\0
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 G NS`.fS
f)g7
3=
结果集合中所包括的列,并删除连接表中的重复列。 (u]N
Iw<j T|y)
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: H)aQ3T4N5
Q 2A7mGN
SELECT * /sr 2mt-Q
E;d7ch
FROM authors AS a INNER JOIN publishers AS p P\]B<
R-Z~V
ON a.city=p.city fM #7 y [
CH
fVQ|!\
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 7T"XPV|W6
dB+N\HBY
SELECT a.*,p.pub_id,p.pub_name,p.country 4J?t_)
K9vIm4::d$
FROM authors AS a INNER JOIN publishers AS p dgDy5{_
<BO)E(
ON a.city=p.city {CR 5K9
oW^*l#v
(二)外连接 `\X+ Ud|
wHIj<"2
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 `+t.!tv!
CiR%Ujf
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 <$N"q
J*l4|^i<
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 bsd99-_(4
wBQF~WY
如下面使用左外连接将论坛内容和作者信息连接起来: }<z_Q_b+e
i/b'4o=8
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b @Kf_z5tm:
|7B!^
K
ON a.username=b.username $7QoMV 8V
$5L0.$Tj
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ZhNdB
\m=?xb8
f
SELECT a.*,b.* A~Xq,BxCV
vA)O{W\o
FROM city as a FULL OUTER JOIN user as b :L_BG)dM
*jMk/9oa<N
ON a.username=b.username #q3l!3\mW
eUl/o1~mXa
(三)交叉连接 _SACqamo5s
m^_6:Q0F!8
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ^E6d`2w-
5j0{p$'9
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 cECi')
Y~)T
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 q8:{Nk
CC;! <km
于6*8=48行。 Qp2I[Ioz3
"4H8A=
SELECT type,pub_name hh~n#7w~IR
r}u%#G+K,
FROM titles CROSS JOIN publishers +%N
KQ'49I
{FN;'Uc
ORDER BY type