一、简单查询 A_2oQ*
:bu]gj4e
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 v6KRE3:V
U flS`
表或视图、以及搜索条件等。 .?)gn]#
6 B*,Mu4A
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 v&Oc,W
Z^O_7I<5E
SELECT nickname,email wOF";0EN
rLp (}^
FROM testtable F-PQ`@ZNW
vY2^*3\<D
WHERE name='张三' m.w.h^f$&
U$7]*#@&
(一)选择列表 ?V' zG&n@
V~fPp"F
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 pd}Cg'}X
4N8(WI"4S
量和全局变量)等构成。 N'~l,{
uc]`^,`2/
1、选择所有列 `]j:''K
~ ^*;#[<
例如,下面语句显示testtable表中所有列的数据: nj6|WJ
.^V9XN{'a
SELECT * R_2T"
J4#rOS
FROM testtable Qz`v0"'w
giORc
2、选择部分列并指定它们的显示次序 -^$`5Rk
Cnv?0to2l
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ^]X\boWlI
' ?uwUBi
例如:
q.!<GqSgb
qaiR329fx
SELECT nickname,email ,_z"3B)]
]i
Yp
FROM testtable #H.DnW
A^vvw~!d
3、更改列标题 xP-\)d-.aN
1fqJtP6
在选择列表中,可重新指定列标题。定义格式为: pYz\GSd
N;R I
A
列标题=列名 T7?cnK"
S,vh
列名 列标题 a~&euT2
ZK5
wZU
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 #D-Ttla
HUalD3
\
标题: 'g:.&4x_w
0bl 8J5Ar5
SELECT 昵称=nickname,电子邮件=email D.*o^{w|
GS+Z(,J>=
FROM testtable 74fE%;F
"ifv1KZ#
4、删除重复行 C9^C4
NM+(ss'
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 >>%E?'9A
3gs!ojG
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 `Jn2(+
y&6 pc
5、限制返回的行数 (D2N_l(`<
2x!cblo
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 s2"<<P[q'
HpIWH*
表示一百分数,指定返回的行数等于总行数的百分之几。 =fK6P6'B
yR1v3D4E
例如: `Ha<t. v(
c]68$;Z7
SELECT TOP 2 * 'a G`qPB
N2.Ym;^
FROM testtable xjh(;S'
WB 5M![
SELECT TOP 20 PERCENT * zI"1.^Trn
JKA%$l0
FROM testtable 97vQM
S!h=HE
(二)FROM子句 K)W:@,*
ZKt`>KZ
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, Yht |^ =a
:gTtWJ04]
它们之间用逗号分隔。 `X%Qt~
Ynl Zyw!
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 S|r,RBeZ
=w ! 6un
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 +%R{j|8#
t6Nkv;)>@
使用下面语句格式加以限定: [Gc9
3PA7q
z[WdJN{
SELECT username,citytable.cityid /kAbGjp0
6[Wv g
FROM usertable,citytable DLO2$d
h^'+y1
WHERE usertable.cityid=citytable.cityid _b9>ZF~
rA /T>ZM
在FROM子句中可用以下两种格式为表或视图指定别名: &] O^d4/
X#Hl<d2
表名 as 别名 $S/EIN c
ZuT5}XxF
表名 别名 7 )*q@
q9(Z9$a(\
例如上面语句可用表的别名格式表示为: BHt9$$Z|
@#"6_{!j_X
SELECT username,b.cityid BMb0Pu8
g}$B4_sY
FROM usertable a,citytable b xwojjiV
oZ>2Tt%
WHERE a.cityid=b.cityid xu.TS
O% 8>siU
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 #6@4c5{2=4
dy4~~~^A
例如: #N'bhs
:{%~L4$HI
SELECT a.au_fname+a.au_lname ('+C $
Q2"K!u]
FROM authors a,titleauthor ta S3^(L
")9jt^
(SELECT title_id,title H3+P;2{
465?,EpS
FROM titles vF9fXY=
V^< Zs//7
WHERE ytd_sales>10000 pYh\l.@qf
!d&SVS^mo
) AS t y>0Gmr
Jk57| )/
WHERE a.au_id=ta.au_id T@d4NF#
O@a7MzJ
AND ta.title_id=t.title_id O+t'E9Fa
{Rq5=/b
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 G%>M@nYUE
|xrnLdng0R
(三)使用WHERE子句设置查询条件 \lF-]vz*
Bw>)gSB5$k
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: ?8YbTn1f)
as"@E>a
SELECT * @b{$s
wZt2%+$6m
FROM usertable \hP.Q;"MtO
2FQTu*p&B
WHERE age>20 >aT~G!y
JZ/T:Hsh4
WHERE子句可包括各种条件运算符: *fI\|%K
M/kBAxNIC|
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< iUlSRfrC$#
q^6l`JJ
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 8|tnhA]~
uP.dCs9-
NOT BETWEEN…AND… bycnh
Zou;o9Ww
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) a~Yq0 d?`D
%v[KLMo'(
NOT IN (项1,项2……) 9>=S@hVMd
bT`et*]
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ^GNL:D%6d
36}&{A
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL V0xO:7G^
EAoq2_(`a
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR j:U6q,f]
=nv/
r
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 \pXo~;E\
*mn"GK6
2、列表运算符例:country IN ('Germany','China') 7=a
e^GKo
_% i!LyG
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 E+J +fi
(?ZS9&y}
varchar、text、ntext、datetime和smalldatetime等类型查询。 Tj6kCB
Se>v|6
可使用以下通配字符: h]&o)%{4
_7
^:1i~:.
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 <(l`zLf4p
YwZ]J
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 [= Xb*~
IGo+O*dMw
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Jt3*(+J>/
8d(l)[GZt
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Dlz1"|SF
}j{Z
&(K
例如: "p[3^<~uQ
Y)7\h:LIg
限制以Publishing结尾,使用LIKE '%Publishing' I2z6iT4nB
XW:%YTv
限制以A开头:LIKE '[A]%' BOv ^L?)*Z
WQMoAPfqL
限制以A开头外:LIKE '[^A]%' zN/nKj: Q
B^/(wHBp
4、空值判断符例WHERE age IS NULL R,8Tt!n
PsBLAr\ah
5、逻辑运算符:优先级为NOT、AND、OR u24XuSe$
-m$2"_
(四)查询结果排序 .dj}y
jd]f
m`n#Q#6
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: o90[,
N'Vj& DWC
ORDER BY {column_name [ASC|DESC]} [,…n] r`e6B!p
?=b#H6vs
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 )NO,G
W
Haf}.V
序。 FBa-gm<9
L$^)QxH7
例如: >J{e_C2ZS
zICrp
SELECT * *vT Abk$
tv5N
wM
FROM usertable |Rz}bsrZ
#I#_gjJkx
ORDER BY age desc,userid ASC +1c[!;'
%DKC/%
另外,可以根据表达式进行排序。 8F/zrPG
YTg8Zg-Z
A-u!{F
XpPcQIM*
二、联合查询 n(_wt##wE~
Z8Tb43?
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 Yn>FSq^Wp-
u]P9ip"Z
合查询。UNION的语法格式为: $?On,U
%yK- Q,'O
select_statement \W|ymV_Ki
r(<91~Ww
UNION [ALL] selectstatement 3gv?rJV
r9p ((ir
[UNION [ALL] selectstatement][…n] ;rl61d}NH#
~I]aUN
其中selectstatement为待联合的SELECT查询语句。 fONycXM]
?gCP"~
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 57EL&V%j
X$eR RSW
行。 B[5<&
[K1z/ea)V
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 /as+ TU`A
_5o5/@
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 )"%J~:`h}
**c"}S6:mC
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 dJ~Occ 1~r
xPJ@!ks9
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 10_>EY`
sTvw@o*
型,系统将低精度的数据类型转换为高精度的数据类型。 uEkGo5
U"Y/PBs,
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 'tt4"z2
n{=Ot^
";
查询1 UNION (查询2 UNION 查询3) /< Dtu UM
?y,KN}s_
k<RaC=
`:d\L
H
A2.4#Qb'
bL|$\'S
三、连接查询 pxCQ=0k
z }Vg4\x&
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 0|,Ij$
67U6`9d
数据库管理系统的一个标志。 3pyE'9"f6
4W=fQx]
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 WUb] 8$n
NKiWt
Z"
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 _jaB[Q=By
E`|vu*l7
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 3S
@)Ans
M]xfH *
查询。 z~/e\
.>2]m[53
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 >|mZu)HIY;
8Ep!
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 (Mw+SM3<
w,t !<i
SQL-92标准所定义的FROM子句的连接语法格式为: gO/\Yi
NzS`s,N4/0
FROM join_table join_type join_table uW4.Q_O!H
'Jd*r(2d
[ON (join_condition)] W9S6
SO^\
.u]d5z
BR
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 v=DC3oh-
Q~` {^fo1
个表操作的连接又称做自连接。 P!lfk:M^;
KLjvPT\
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比
|{MXDx
V/RV,K1/
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 NMzq10M=6
PoLk{{l3
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 wGWv<<Qw"
|3>%(4
OS
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) r-a0XNS*
{9{PU&?(
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 t(}g;O-
7v}(R:*
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 'f8'|o)
;_0frX
数据行。 c7nbHJi
LtV,djk
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 B?4Iu)bCxI
Q'YakEv >=
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 z6|kEc"{
n*9nzx#q
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 Y/
%XkDC~
TY?O$d2b3
运算符等构成。 m=a^t
a'O-0]g,
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 0qW"b`9R
,o}CBB! k
连接。例如: AuY*x;~
\uZ1Sl
SELECT p1.pub_id,p2.pub_id,p1.pr_info EXR6Vb,
u(8dsgR
FROM pub_info AS p1 INNER JOIN pub_info AS p2 6#ktw)e
MjK<n[.
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 4~2 9,
t_+owiF)M
(一)内连接 B_RF)meux
&ViK9
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 lHE \Z`
R0K{wY58
三种: cH707?p/I
yE;S6 O
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 :k2J
&@8
0qm CIcg
表中的所有列,包括其中的重复列。 h-U]?De5\
5x!rT&!G
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ):fu]s"
<v?2p{U%
运算符包括>、>=、<=、<、!>、!<和<>。 =Z..&H5i
x@D>JG
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 "BIhd*K[~
]`|;ZQiD
结果集合中所包括的列,并删除连接表中的重复列。 bD?gwhAKA
Q]OR0-6<.
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: WkV0,_(P
ft~QVe!
SELECT * 'r1X6?dJ
:_Iz(
2hV
FROM authors AS a INNER JOIN publishers AS p u/xP$
2iC BF-,
ON a.city=p.city T
"#DhEM
?QtM|e
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ]C{N4Ni^Z
.N7&Jy
SELECT a.*,p.pub_id,p.pub_name,p.country %vUUx+
8"rK
FROM authors AS a INNER JOIN publishers AS p -![{Zb@
V0n8fez
b
ON a.city=p.city
$QwzL/a
O2xqNQ`d
(二)外连接 n^nQrRIp
(%G>TV
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 _qH]OSo
JURg=r]LI
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外
iF_u/#
YoZd,} i
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 C~PP}|<~V
%&J`mq
如下面使用左外连接将论坛内容和作者信息连接起来: #%{
%}unlSTPP
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 5i'KGL
"2 D{X
ON a.username=b.username h;mOfF
'-#gQxIpD
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: *z]P|_:&G
@6-3D/=
SELECT a.*,b.* S_s;foT
L!fIAd`
FROM city as a FULL OUTER JOIN user as b @P h'!
]qx!51S
ON a.username=b.username ^;$9>yi1
v7v>
(三)交叉连接 q?8#D
[q^pMH#U"
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 !e~d,NIy
IvI;Q0E-3
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Z/:W.*u
?.ofs}
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ;zSV~G6-
ebLt:gGo
于6*8=48行。 )iZhE"?z
zLPCWP.u
SELECT type,pub_name c~d*SDca
yr)e."#S
FROM titles CROSS JOIN publishers '=d y
=
Mb97S]878I
ORDER BY type