一、简单查询 ElAJR4'{*i
LB%_FT5
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Zy@35;r
%Q"zU9
表或视图、以及搜索条件等。 0?l|A1I%
Y9~;6fg
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 k9UmTvX
pWH8ex+
SELECT nickname,email j~c7nWfX
d$)'?Sf]h
FROM testtable (WiA
!OM9aITv[
WHERE name='张三' \lHi=}0
="
K;3a`GI
(一)选择列表 5P{dey!
K
!8+~[
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 8yax.N
j
qT#+DDEAL
量和全局变量)等构成。 @8C^[fDL
At%g^
1、选择所有列 JbzYr]k
Taxi79cH
例如,下面语句显示testtable表中所有列的数据: kbBD+*
^ cN-
SELECT * _m;cX!+~_
XG<J'3
FROM testtable `
_()R`=
q:#,b0|bv
2、选择部分列并指定它们的显示次序 -_'M
*-
$1oU^VY
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ]+)z}lr8 C
N%6jZmKip
例如: %*OKhrM
E*IkI))X0
SELECT nickname,email mJewUc!<5
V S2p"0$3D
FROM testtable ,HS\(Z
1YR;dn
3、更改列标题 ^ef:cS$;
]7zDdI|
在选择列表中,可重新指定列标题。定义格式为: &q1(v3cOO
cRz7.9-<
列标题=列名 5R4h9D5
x(3E#7>1
列名 列标题 /MTS>[E
=Y|TShKk
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 U6FM`w<
hbR;zV|US
标题: ~ $#DB@b
f[ GH
SELECT 昵称=nickname,电子邮件=email MUz.-YRt
]tH/87qJ
FROM testtable btw_k+Fh
+^<CJNDL9
4、删除重复行 iKV;>gF,)v
)z3mS2
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 oe`oUnN
T2Cdw\
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 '1ff| c!x9
fMwJwMT8
5、限制返回的行数 8kAG EiC
h3aHCr E
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 9?gLi!rd
m\U@L+L
表示一百分数,指定返回的行数等于总行数的百分之几。 ?nrd$,
~^"
cNv
例如: ;E:ra_l
?v#t{e0eQ
SELECT TOP 2 * MR%M[SK1
Rb<aCX
FROM testtable fS-#dJC";`
!40{1U&@a`
SELECT TOP 20 PERCENT * LYGFEjS[
V!c{%zd
FROM testtable {"y{V
j9%u&
(二)FROM子句 .qy._C2(
M]jzbJ3Q
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ?A(=%c|,g
)HS|pS:
它们之间用逗号分隔。 wGd8q xa
({Fus@/
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 RoM'+1nP:#
Y {Klwn
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 +
}(
z|}Anc[\
使用下面语句格式加以限定: CY)Wuv ^
~t<BZu
SELECT username,citytable.cityid c G?RisSZ
ex $d~
FROM usertable,citytable &xr?yd
&k&tkE
WHERE usertable.cityid=citytable.cityid nE]R0|4h
$k@reN9
在FROM子句中可用以下两种格式为表或视图指定别名: 9XF+?
x
:CSys62
表名 as 别名 mn*.z!N=
q ]rsp0P2
表名 别名 +F&w~UT
|GL#E"[&'
例如上面语句可用表的别名格式表示为: {\`#,[
|=l;UqB
SELECT username,b.cityid -DX|[70
Y!i4P#4+q
FROM usertable a,citytable b tAP~
QtkyKR
WHERE a.cityid=b.cityid |g> K$m^
[@#P3g\:>W
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 I6YN&9Y
],>Z'W
例如: `"I^nD^t>Y
R2x(8k"LPU
SELECT a.au_fname+a.au_lname
NJs )2
\M="R-&b
FROM authors a,titleauthor ta ff-9NvW4v
n0O- Bxhl
(SELECT title_id,title 0Vh|UJ'&7
+?*,J=/
FROM titles h:"<x$F
.2!'6;K
WHERE ytd_sales>10000 /V46:`V
cc.zC3Hs3
) AS t 8NPt[*
Z?G-~3]e
WHERE a.au_id=ta.au_id ocAoqjlT[
d
'4c?vC
AND ta.title_id=t.title_id h<6@&yzp
?t'O\n)M
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 j9) Z'L
:v
Pzw!
(三)使用WHERE子句设置查询条件 F_zs"ex/
`t{aN|3V[
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: +MGEO+
+aEE(u6%E@
SELECT * vxZvK0b620
'RTz*CSZ
FROM usertable ZR6KE_
&0K
H00l
WHERE age>20 ,;O+2TX
4punJg~1
WHERE子句可包括各种条件运算符: ;wp)E nF
>7@F4a
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ,X+mXtg.
j*q]-$ 2E
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… fJd!;ur)0
!R[o6V5T
NOT BETWEEN…AND… 6@ET3v
PZf^r
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) jToA"udW/
(lwkg8WC
NOT IN (项1,项2……) qdL;Ii<Y0
)e4nKh],
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ?#rDoYt/Sx
$wdIOfaH
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL :a0qm.EN
hCc_+/j|
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR CcLP/
x>!#8?-h
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Av_1cvR:
o\g",O4-
2、列表运算符例:country IN ('Germany','China') p(v+j_ak
^E{~{
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 \H*"UgS
y%cg
varchar、text、ntext、datetime和smalldatetime等类型查询。 z./u;/:
#Ji&.T^U/
可使用以下通配字符: ]GJIrtS4
71@V|$Dy
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 +smPR
+K;
X$kB
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 tegLGp@_
RnIL>Akp
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 n>+M4Zb
*t3fbD
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 2J|Wbey
_Sosw|A
例如: P,j)m\|
=sG C
限制以Publishing结尾,使用LIKE '%Publishing' B7fURL
Rqr
Z<0M_q9?MO
限制以A开头:LIKE '[A]%' 'eLO#1Ipf
U9SByqa1
限制以A开头外:LIKE '[^A]%' |*fGG?}
WDP$w(M
4、空值判断符例WHERE age IS NULL t1 OnA#]/_
TC<_I0jCh
5、逻辑运算符:优先级为NOT、AND、OR $eCxpb..
{Ymn_
(四)查询结果排序 *FQrmdwb]L
D+ 9xI
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: }(hx$G^M
2x"&8Bg3
ORDER BY {column_name [ASC|DESC]} [,…n] <JuP+\JAm
,l_"%xYx
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Cz+`C9#
}~:`9PV)Z%
序。 ) 'j7Ra
pyq~_Bng
例如: cD YKvrPY
^$FHI_
SELECT * AcwLs%'sx
^GD"aerNr
FROM usertable O8wR#(/
_Q t
ORDER BY age desc,userid ASC VWj]X7v
&j<B22t!
另外,可以根据表达式进行排序。 mcP]k8?C
,j:`yB]4,
0/6f9A
~dkS-6q~Q
二、联合查询 Z]@my,+Z;
k^w!|%a[
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 nVoL7ew+
#e}Q|pF
合查询。UNION的语法格式为: $>hPB[ [
(OLj E]9;
select_statement J2f}{! b+I
sy.FMy+
UNION [ALL] selectstatement etMQy6E\
FMc$?mm
[UNION [ALL] selectstatement][…n] I%ivY
}u5/
其中selectstatement为待联合的SELECT查询语句。 hbl:~O&a/
Bk_23ygO_
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 j_H9l,V
w<!F& kQB
行。 V8@VR`!'
4QARrG%
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 z\]]d?d?;
7y5`YJ}!
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 G|H+
,B
Cvry8B
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 -y|>#`T/
tBd-?+~7
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 0Dv r:]R
pZ,=iqr
型,系统将低精度的数据类型转换为高精度的数据类型。 uZL,+Ce|
J: vq)G\F
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: f~%|Iu1ob
}F!tM"X\
查询1 UNION (查询2 UNION 查询3) iH<:wLY&J
J&CA#Bg:w
Ngi]I#Vz
oJ734v [X
Xia4I*
*
O`j1~o<{
三、连接查询 Lp.dF)C\
/'' |bIPa
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 t1}R#NB
"
R!,5HQF;
数据库管理系统的一个标志。 Q"7vzri
Y&!-VW
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 MKPxF@N(
NX%"_W/W
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 NOM6},rp
'i+j;.
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 \NU^Jc_k7
Tsg;i;
查询。 +txFdc
!k@(}CN_*
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 GVR/p
3V=wW{;x
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 >!sxX = <
h*d1G9%Q1
SQL-92标准所定义的FROM子句的连接语法格式为: ~ES6Qw`Oe
ywQ[>itMa
FROM join_table join_type join_table S9RH&/^H
;O8'vp
[ON (join_condition)] O/Cwm;&t
|`eHUtjH
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 dyWj+N5(
^x2zMB\t
个表操作的连接又称做自连接。 /M!b3bmA
m&vuBb3
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 RwKnNIp
0OCmyy
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 PtsQV!
RGEgYOO
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 +*uaB
9UDanj P
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 42$ pvw<
8k +^jj
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 |ht:_l
8
{$qE>ic
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 M/?eDW/
&~=FXe0S
数据行。 +xNV1bM
sE^ee2]OI@
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 B703{k
sU Er?TZ
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ]QC9y:3
&fofFVQnW
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 W{Uz#o
q7z`oK5
运算符等构成。 boS=
GHNw.<`l?
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ?_ 476A
w.VjGPp
连接。例如: hk+8s\%-
9*Q6/?v
SELECT p1.pub_id,p2.pub_id,p1.pr_info [[$dPa9
uwl_TDc>%
FROM pub_info AS p1 INNER JOIN pub_info AS p2 JAx0(MZO
8+i=u"<
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) fHK.q({Qc
&R5zt]4d&
(一)内连接 )Cu2xRr^`
hsB3zqotF
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 &NKb},~
Z_U4Yy'NNw
三种: D*&#}c,*
E$.f AIt
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 s<>d&W 0=
`^ZhxFX
表中的所有列,包括其中的重复列。 r=-b@U.fk>
D%}rQ,*
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 {oSdVRI
j(A>M_f;
运算符包括>、>=、<=、<、!>、!<和<>。 VBUrtx:
nz|6CP
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 |\2>n!
8eVy*h2:=
结果集合中所包括的列,并删除连接表中的重复列。 A+|bJ>q
0qINa:Ori
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: r]@T9\9
~R&rQJJeJ
SELECT * jW]"Um-]
<Drm#2x!E
FROM authors AS a INNER JOIN publishers AS p $DXO7;#
E{0e5. {
ON a.city=p.city Mz.C`Z>o
#{*5rKiL
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): CBO*2?]s
uI$n7\G!
SELECT a.*,p.pub_id,p.pub_name,p.country -AD@wn!wCJ
Zs(BViTb|
FROM authors AS a INNER JOIN publishers AS p Nw9@E R
eR4ib-nS
ON a.city=p.city R?zlZS.~
wmww7
(二)外连接 8 :WN@
Ni8%K6]z
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 k-H6c
v4Wq0>o
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 [O<F `u"a
<THwl/a
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 T$`m!mQ4
,ss"s3
如下面使用左外连接将论坛内容和作者信息连接起来: /O<~n%< G
v-N4&9)%9
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b "b402"&
<o9AjASv\,
ON a.username=b.username [
:)F-
CuK>1_Dq
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: Fm=jgt3wv8
ia3Q1 9r
SELECT a.*,b.* (u^8=#
r&Nh>6<&/
FROM city as a FULL OUTER JOIN user as b YO-B|f
e,{k!BXU#'
ON a.username=b.username 6/#+#T
sVr|kvn2
(三)交叉连接 ^mjU3q{;
)Nqx=ms[(!
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 |$6Ten[B#
`*[\b9>
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Y#I8gzv
yZ{N$ch5b
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 p:4-b"O
?A;RTM
于6*8=48行。 ZB|s/
w_o+;B|I
SELECT type,pub_name bl&9O
hxj\
FROM titles CROSS JOIN publishers &"WgO!pzD
*^Zt)U1$|
ORDER BY type