一、简单查询 <uUQ-]QOIh
5=tvB,Ux4
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 3TqC.S5+
'HTr02riY
表或视图、以及搜索条件等。 sHD8#t^{
u
Jy1 vI
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 /%9D$\
K:
g_M
SELECT nickname,email Nq1la8oQ3
zWpJ\/k~
FROM testtable zbK=yOIOd
=; Gw=m(
WHERE name='张三' Gm;)Om_
o&P}GcEIw
(一)选择列表 $&/JY
n/#zx:d?
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 Y-\hV6v6
&Oc^LV$6
量和全局变量)等构成。 z+I'N4*^
G 'IqAKJ
1、选择所有列 1ael{b!
rF:C({y
例如,下面语句显示testtable表中所有列的数据: }&D~P>1
h\\fb[``
SELECT * qd#?8
RY'f%c
FROM testtable _@9[c9bO
B.CUk.
2、选择部分列并指定它们的显示次序 xF:
O6KL
E^w2IIw
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ifj%!*
0"7%*n."2
例如: H"czF
K}"xZy Tm1
SELECT nickname,email Qb<i,`SN
Qd;P?W6
FROM testtable a5=8zO#%g
D ]Q,~Y&'
3、更改列标题 xY9#ouF
zWKnkIit,
在选择列表中,可重新指定列标题。定义格式为: 1BT]_ cP
*I6z;.#
列标题=列名 n%zW6}
OE' ?3S
列名 列标题 u(l[~r>8W;
rx2?y3pv
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 3qJOE6[}%
hw! l{yv
标题: /ivcqVu]
_R&mN\ey5
SELECT 昵称=nickname,电子邮件=email `i5U&K. 7
NRu_6~^^
FROM testtable i
,Cvnp6Lv
[8|Y2Z\N
4、删除重复行 ~!UC:&UKo
Ie{98
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Qt` hUyL
/jl{~R#1
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ]&6# {I-
HS> (y2}'
5、限制返回的行数 xIu#
Py*( %
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是
Fj Rt'
/(IV+
表示一百分数,指定返回的行数等于总行数的百分之几。 J1OZG6|e
G8=2=/ !
例如: ^mxOQc !
ZoX24C'
SELECT TOP 2 * 9A_{*E(wd
S3#NGBZ/
FROM testtable xC N6?
Xi$( U8J_
SELECT TOP 20 PERCENT * 2gM=vaiH=
_CqVH5U?
FROM testtable _8t5rF
@>`+eg][?P
(二)FROM子句 <vMna< /d
K$v
SdpC
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, rEz-\jLD~
$pW6a %7
它们之间用逗号分隔。 iV9wqUkMv
j>jZg<}J
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 J{>9ctN
)9/.K'o,dy
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 p3tu_If
h OYm
=r
使用下面语句格式加以限定: ?bFP'.
k1tJ$}
SELECT username,citytable.cityid %smQ`u|
^(z7?T
FROM usertable,citytable *+(t2!yFmE
.OhpItn
WHERE usertable.cityid=citytable.cityid lGrp^
fH#yJd2?f
在FROM子句中可用以下两种格式为表或视图指定别名: |;xm-AM4r
A/5??3H
表名 as 别名 ZEY="pf
8A q [@i
表名 别名 5)h#NkA\J
V{!fag
例如上面语句可用表的别名格式表示为: #yNSQd
Br/qOO:n$}
SELECT username,b.cityid u.v
5!G
_N8Tu~lqV
FROM usertable a,citytable b ?%RAX CK
be&5vl
WHERE a.cityid=b.cityid ;+v5li
Vb{5 -v
;a
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 [zXKS|
%8c
<C
例如: V11(EZJ/j
++ O
L&n
SELECT a.au_fname+a.au_lname OJ#ehw <
2P\k;T(
FROM authors a,titleauthor ta hxG=g6:G
R&oC9<
(SELECT title_id,title #'`!*VI
MZYh44
FROM titles tG8)!
Ah^0FU%!g
WHERE ytd_sales>10000 5x$/.U
`O~NT'Ed8
) AS t 5>9KW7^L
`Fn"%P!
WHERE a.au_id=ta.au_id Q`?+w+y7
'iQ
AND ta.title_id=t.title_id &d,chb(
b\6)whh
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 . <xzf4C
&[u>^VO8
(三)使用WHERE子句设置查询条件 3[q&%Z.
0cYd6u@
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: s*'L^>iZ
W&M=%
SELECT *
|gXtP-
N$'/J-^
FROM usertable 2!-?
Q1ox<-
WHERE age>20 (CUrFZT$
1Yr&E_5/
WHERE子句可包括各种条件运算符: N5W;Zx]
yH`4sd
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< !-G'8a|7
bx!uHL=
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 4Vv~
\R"} =7
NOT BETWEEN…AND… L >*
F8|g
+SM&_b
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 9gu$vF]9!
|X}H&wBWo
NOT IN (项1,项2……) j[E8C$lW
[cJQ"G '
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE U2Uf69R
7CKpt.Sz6
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL CMQlxX?
!WT Z=|
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR x"N{5
|aAu4
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 oAnNdo
j@w+>h
2、列表运算符例:country IN ('Germany','China') 3HtLD5%Q
:S['hBMN
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 ioIOyj
Drn{ucIs
varchar、text、ntext、datetime和smalldatetime等类型查询。 7!-3jU@m
kzky{0yKk=
可使用以下通配字符: %:jVx
2X];zY
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 +&AKDVmx
W|~Jl7hs8Q
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 #=}dv8
4blw9x N
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 It5U=PU
)^Ha?;TS
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 iTX:*$~I
tQ:g#EqL9B
例如: tVAWc$3T
C(=$0FIR
限制以Publishing结尾,使用LIKE '%Publishing' h;q=<[h\
]1 V,_^D
限制以A开头:LIKE '[A]%' ;q=0NtCS=4
^[UWG^d
限制以A开头外:LIKE '[^A]%' $q"/q*ys
B #[URZ9S
4、空值判断符例WHERE age IS NULL AD$$S.zoD<
|3Fo4K%+
5、逻辑运算符:优先级为NOT、AND、OR 0n FEPMO
73n|G/9n[
(四)查询结果排序 xgdS]Sz
EnM }H9A
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 9S<87sO
dz3KBiq
ORDER BY {column_name [ASC|DESC]} [,…n] xH,D
bAC;
9+z5$
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 RFsd/K; Zp
[RAzKzC\M
序。 %VV\biO]
rNi]|)-ET
例如: 4$5d*7
t:NYsL
SELECT * tQ,,krw~
(31ia"i%
FROM usertable c
`[,>
|"K<
ORDER BY age desc,userid ASC *Ce8(
"v,
gY\g+df-
另外,可以根据表达式进行排序。 yN'<iTh
V`ODX>\
cWNZ +Q8Y
`6R.*hq
二、联合查询 #
1 #zIAN>
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 =up!lg^M
\d"uR@$3mG
合查询。UNION的语法格式为: Y)Os]<N1
h20<X;
select_statement KA[8NPhzZ
I.4o9Z[?
UNION [ALL] selectstatement P#0U[`ltK
Moldv
x=M
[UNION [ALL] selectstatement][…n] P!6v0ezN
(0wQ [(
其中selectstatement为待联合的SELECT查询语句。 "e3T;M+
S=
NG J0
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 31y>/*}
nnzfKn:J
行。 jfLkp>2E'
Mu1H*;_8
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 #hKaH - j
(Xak;Xum1
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 46yq F
[Iwb7a0p
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 m
L#%H(
xr;:gz!h
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 _`oP*g =
hc2AGeZr
型,系统将低精度的数据类型转换为高精度的数据类型。 k=nN#SMn
*y}<7R
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: $]
gwaJ:
3d1$w
查询1 UNION (查询2 UNION 查询3) @4O;dFOQ)
HsF8$C$z
!R
b
(plsL
E43Gk!/|(
\*wQ%_N5
三、连接查询 ~ z< &vQ=
(TX\vI&
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 u|.c?fW'3
+zl2|'
数据库管理系统的一个标志。 h/LlH9S:!
MrW*6jY@
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 <FkoWN
!1X^lFf;~
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 z PW [GkD
KTmduf7DL
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 Ar;uq7c,G
6Mh;ld@
查询。 F2N)|C<
$ ]fautQlt
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 GKk>;X-
J{69iQ
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 Yn~N;VUA
RaT_5P H~g
SQL-92标准所定义的FROM子句的连接语法格式为: hja;d1yH
y^ij u(
FROM join_table join_type join_table LH@xr\^
(
!THd
[ON (join_condition)] 'XbrO|%
E7CeE6U
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 I6.!0.G
bV3az/U
个表操作的连接又称做自连接。 =V[ey
"3?N*,U_
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 8V08>M
8Qo~zO
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 nt5x[xa
m|CB')
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 Qf'%".*=~8
q^I/
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) q!qOy/}D
./KXElvQ%
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 e7$ZA#A_5v
6m\MYay
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 4/Mi-ls_
IAlX^6s*
数据行。 1KI,/ H"SY
gZg5On
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 iC.k8r+~
'g@Yra&09
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 @[=K`n:n_
(b*PDhl`+
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ,$,c<M
KJs/4oR;
运算符等构成。 `w;8xD(
9_4bw9A
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 nYvx[
zq?^
MB"TwtW
连接。例如: y$Y*%D^w
c*@#0B
SELECT p1.pub_id,p2.pub_id,p1.pr_info "R!)"B==
^W*T~V*8
FROM pub_info AS p1 INNER JOIN pub_info AS p2 &yabxl_
} vzNh_
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) C3hQT8~
>Av[`1a2F
(一)内连接 p-S&Wq
C 7a$>#%
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分
G9YfJ?I
01_*^iCf5
三种: CD"D^\z
O,c}T7A'?w
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ;Pd nE~
&hSABtr}
表中的所有列,包括其中的重复列。 - Mubq
5j{jbo=!
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 r2xXS&9!|
C-:lM1
运算符包括>、>=、<=、<、!>、!<和<>。 N}/|B}
#J):N
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 +%'!+r
l
)
u(Gf*t
结果集合中所包括的列,并删除连接表中的重复列。 5L!cS+QNU
:ot^bAyt|
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: !%lcn
O
uexm|5|
SELECT * ]}za
JK/VIu&!
FROM authors AS a INNER JOIN publishers AS p }iE!(
l
w{$X
:Z
ON a.city=p.city zF([{5r[!)
o]jPG
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ?B5934X
<j<V{Wc
SELECT a.*,p.pub_id,p.pub_name,p.country gAPD
y/wM
8=T[Y`;x
FROM authors AS a INNER JOIN publishers AS p
#sRkKl|
|RS(QU<QE
ON a.city=p.city F^/b!)4X
f7y3BWOi]
(二)外连接 L#>^R
4]P5k6nV
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ToXgl4:kd
!VoAN5#;
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 R2`-*PZ_
#=81`u
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ]aDU* tk
?\.DG`Zxc
如下面使用左外连接将论坛内容和作者信息连接起来: D00v"yp%%
Xk]:]pl4W
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b oj'a%mx
=mQdM]A)2
ON a.username=b.username *)|EWT?,
IBn+42V
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: Hdxon@,+cd
jY|fP!?[
SELECT a.*,b.* m5'nqy F
7J6D wh{
FROM city as a FULL OUTER JOIN user as b m(0c|-
+~{Honj[
ON a.username=b.username d>wpG^"w
u6lcl}'
(三)交叉连接 9!u&8#i
=K:)%Qh
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ~_GW
|~d8j'rt
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 TaqqEL
vS1#ien#
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 OciPd/6
M!D&a)\
于6*8=48行。 XN Gw@$
j-%@A`j;
SELECT type,pub_name RO!em~{D*
g-8D1.U
FROM titles CROSS JOIN publishers $uj3W<iw3E
>&Ios<67g
ORDER BY type