一、简单查询 ) jvI Nb
l(}L-:@A
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 UL>2gl4s/
@pYC!;n+
表或视图、以及搜索条件等。 .QwB7+V4
(c^ {T)
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 [6_.Y*}N
fiD,HGx
i
SELECT nickname,email lcjOBu
8~s0%%{,M
FROM testtable ]FIIs58IM
1EC;t1.7
WHERE name='张三' gH\>",[
B, H9EX
(一)选择列表 k`|E&+og
xa<KF
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 c_M[>#`
V@b7$z
量和全局变量)等构成。 X"r.*fb;N
WWZ<[[ >
1、选择所有列 Hc8He!X*#
_od /)#
例如,下面语句显示testtable表中所有列的数据: ,Tegrz&G
<*dcl2xS
SELECT * $;Iz7:#jN
eB1NM<V
FROM testtable !k*B-@F
U1E@pDH
2、选择部分列并指定它们的显示次序 5dN>Xjpu
l5&5VC)
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ?<
teHFj
&ZkJ,-
例如: xRhGBb{@s
D6&P9e_5
SELECT nickname,email <#nU 06 fN
.
_|=Btoo
FROM testtable V;"2=)X
Cb? !+U
3、更改列标题 ex1!7A!}g
"5
~{
在选择列表中,可重新指定列标题。定义格式为: &y=OZ
!M
.PVYYhrt
列标题=列名 _|0#
K{/i2^4
列名 列标题 qK#"uU8B
ht ]n*
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 %aK[Yvo6
vfv?QjR
标题: LmqSxHs0Q
DT>`.y%2W
SELECT 昵称=nickname,电子邮件=email \ moLQ
g |?}a]G
FROM testtable xW5 `.^5
#-G@ p
4、删除重复行 C=q&S6/+
*P/A&"i[E
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 A>upT'
50-7L,
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 gL&w:_
3))R91I
5、限制返回的行数 qp6'n&^&
uKM` umE
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 I5l%X{u"N
~(XaXu
表示一百分数,指定返回的行数等于总行数的百分之几。 6O6B8
E=,5%>C0#%
例如: OF']-
z8}QXXa
SELECT TOP 2 * U=
f9b]Y
?;`GCE
FROM testtable >h#juO"
V
)oXJL
SELECT TOP 20 PERCENT * x/M$_E<G
/ZabY
FROM testtable $A{$$8P
)rj!/%
(二)FROM子句 .U|'KCM9m
!9$}1_,is
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, YQd($
yy8BkG(
它们之间用逗号分隔。 exiu;\+j
FO^6c
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 iZdl0;16[
l6w\E=K
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 1<#D3CXK
W?4:sLC#3
使用下面语句格式加以限定: h'h8Mm
`V V>AA5
SELECT username,citytable.cityid O^-QqCZE
5p!{#r6m
FROM usertable,citytable ,JK0N_=
W[)HFh(#
WHERE usertable.cityid=citytable.cityid c)^A|{,G
0Q7<;'m
在FROM子句中可用以下两种格式为表或视图指定别名: H'YK j'
_/>I-\xWA
表名 as 别名 XZ@+aG_%q
l}^ziY!
表名 别名 s,[I_IiPf
Z9 ws{8@_
例如上面语句可用表的别名格式表示为: ]Bf1p
2RNee@!JJP
SELECT username,b.cityid 2oahQ:
}B
ZR3,dW6S
FROM usertable a,citytable b ['\R4H!x
uQ[,^Ee&/
WHERE a.cityid=b.cityid lc5(^~
w]T_%mdk
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 UYZC% $5x
CXoiA"P
例如: 0H +nVR
dPpQCxf
SELECT a.au_fname+a.au_lname !+@70|gFF
|-{ Hy(9
FROM authors a,titleauthor ta @(6i 1Iwu9
ceks~[rP
(SELECT title_id,title Wkk(6gS,
yc7b%T*Y
FROM titles x{w|Hy
"u~` ZV(
WHERE ytd_sales>10000 *(r9c(x a
cL4Go,)w
) AS t :/][ n9J^
3A"TpR4f`
WHERE a.au_id=ta.au_id Jg'#IM
V!]|u ^4I
AND ta.title_id=t.title_id 6 A]a@,PC
qrw*?6mSQ
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 TeZu*c
R7z @y o
(三)使用WHERE子句设置查询条件 ^2rj);{V
*!`&+w
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: F)eP55C6
*<
fJgc"3
SELECT * m !<FlEkN
FG71<}C[K
FROM usertable Wy6a4oY
E3S0u7Es
WHERE age>20 i}>EGmv m
16I[z+RG
WHERE子句可包括各种条件运算符: %|JL=E}%|
$;ny`^8
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< mz<,nR\
RJDk7{(
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… N|)e {|k
@zw&-b:qI
NOT BETWEEN…AND… h|'|n/F
Z&H_+u3j
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) oo]P}ra
3My}u>
NOT IN (项1,项2……) #H~$^L
RlvvO
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE @m`H~]AU
$1s>efP-
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL GYJ j$'
bY,dWNS:
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR k:j?8o3
5HbJE'
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 9'|k@i:
W!9~bBF',
2、列表运算符例:country IN ('Germany','China') 4UW)XLu6T7
Jz&dC
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 }4c$_
n2c(x\DA&
varchar、text、ntext、datetime和smalldatetime等类型查询。 'MyJw*%b]
!_c6 `oW
可使用以下通配字符: EXW?)_pg
D"fjk1
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 gLo&~|=L-
}7fzEo`g
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 X9" T(`
~% ]V,-4
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 f<<$!]\
Ut1s~b1
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 ~Lu,jLKL=[
:=q9ay
例如: Rdd9JJsVd
-biw{
限制以Publishing结尾,使用LIKE '%Publishing' l9y %@7
v )2yR~J
限制以A开头:LIKE '[A]%' \0qFOjVj
JiA1yt
限制以A开头外:LIKE '[^A]%' 1T,Bd!g
FS?1O"_
4、空值判断符例WHERE age IS NULL R
iLqMSq
|VM=:}s&
5、逻辑运算符:优先级为NOT、AND、OR 8|hi2Qeu,c
%$_?%X0=t
(四)查询结果排序 9Y2(.~w6X
dj 6Lf
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ZiH4s|
<P Vmr2Jp"
ORDER BY {column_name [ASC|DESC]} [,…n] -/7@ A
$'a]lR
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 l,b_'
m@
$K|2k7
序。 ]@}@G[e#[
~ :B/`1[m
例如: to\$'2F"q
oye/tEMG
SELECT * GsqO^SV
AZJ|.mV q
FROM usertable ) I.uqG
G6"4JTWO
ORDER BY age desc,userid ASC %+
MYg^
f+c{<fX
另外,可以根据表达式进行排序。 )B5U0iIi
~;wR}s<}(
N,cj[6;T%
MF::At[4
二、联合查询 I=K<%.
lg jY\?
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 z`8>$9
!<>`G0
合查询。UNION的语法格式为: O=Vj*G,
m{6*ae
select_statement (L<G=XC
C[JPohm
UNION [ALL] selectstatement u,@x7a,z
6lxZo_
[UNION [ALL] selectstatement][…n] 3\P/4GK)
/Dk`?
其中selectstatement为待联合的SELECT查询语句。 )q%DRLD'G
V4%7Xj
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 n]wZ7z
As#/ln$nE
行。 _3_o/I
-EU~
%/=m+
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 tpKQ$)ed
YW-Ge
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 DTx>^<Tk
EPeV1$
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Y{m1\s/ o
of.=n
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 D)JI11a<
/vFdhh
型,系统将低精度的数据类型转换为高精度的数据类型。 9'\*Ip^
*IC9))PGJ
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: }Q>??~mVl
%X Wb|-=
查询1 UNION (查询2 UNION 查询3) 8~h.i1L
mv9@Az9
-M?s<R[&
0o&7l%Y/
80O[pf*?
rIF6^?
三、连接查询 0SWec7G
:mz6*0qW
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 09rbu\h
]1n
=O"vE
数据库管理系统的一个标志。 ^T/d34A;SP
^0&
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 .
[\S=K|/
|B.tBt^
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 th(<S
cYp]zn+6
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 AE 2>smp5@
g)#neEA J
查询。 (y!<^Q
3 ]}wZY0
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 J(\f(jh/
3]1uDgfr
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 8yV?l7
aI:G(C?jm
SQL-92标准所定义的FROM子句的连接语法格式为: V8.o}BWY
X8 (,
,>_
FROM join_table join_type join_table nv^nq]4'Dq
&(Ot(.
[ON (join_condition)] )a%kAUNj
EpCsJ08K
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 Hqpw Q
Spossp`|
个表操作的连接又称做自连接。 m:,S1V_jl
({}JvSn1
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 s*k[Fbi
tz&oe
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 w{1DwCLKq
{ ke}W
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 2O^7zW
2/K38t'-
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) i+)9ItZr
rG _T!']~
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 i,DnXgmz@
M}]E,[
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 ppjS|l*`
#&A)%Qbg
数据行。 U=4tJb
3(De> gs$
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 &"(xd@V)]A
2aef[TY
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 lC8DhRd0_
[/B$cH
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 &>
Myf@
9%i|_c}
运算符等构成。 bnb:4?d]
/T53"+7:0
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 {G:dhi
o&
g01t
连接。例如: :`~;~gW<
^h}xFiAV#
SELECT p1.pub_id,p2.pub_id,p1.pr_info 2WK]I1_
Cpm&w?6
FROM pub_info AS p1 INNER JOIN pub_info AS p2 KiXRBFo
tnv @`xBn
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 8<gYB$* S
?pS,?>J f
(一)内连接 8reis1]2S
KCE5Z?k
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 +K6j p
`Ap<xT0H
三种: ^Jv$Wx
Y8c#"vm(
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 P4&3jQ[o
T$p!IRPt
表中的所有列,包括其中的重复列。 *]
H8X=[x
6:Fb>|]*PY
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 cym<uh-Wg^
7Nu.2q E
运算符包括>、>=、<=、<、!>、!<和<>。 yK1@`3@?
Oz3JMZe
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 #@rvoi
zEHX:-f8
结果集合中所包括的列,并删除连接表中的重复列。 7gX#^YkE+k
uq.!{3)8
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: &7K 4tL
sbeS9vE
SELECT * Z1 7=g@
aR- ?t14
FROM authors AS a INNER JOIN publishers AS p jN[P$}#b`
v(|Arm?
ON a.city=p.city wFe?0u
r]sNI[
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): +D3w2C
<5 ?
SELECT a.*,p.pub_id,p.pub_name,p.country >cTSX
AmyZ9r#{
FROM authors AS a INNER JOIN publishers AS p 4r+@7hnK
[}mx4i
ON a.city=p.city Y8 % bk2
k_o$ Ci
(二)外连接 K *QRi/O
wr) \GJ#>
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ~x-"?K
QC,LHt?6
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 }x A Eu,n^
j;7:aM"BQW
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 -/g<A~+i]$
OsrHA
如下面使用左外连接将论坛内容和作者信息连接起来: -4;$NiB?
PwC9@c%c
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b p.ks
jD
S/2lK*F
ON a.username=b.username ZL7#44
ja-,6*"k
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: x@p1(V.
6)h~9iK
SELECT a.*,b.* 59l9^<{A
nu6p{_M
FROM city as a FULL OUTER JOIN user as b * YR>u@
l:.q1UV
ON a.username=b.username _kZ&t_]
sqv!,@*q
(三)交叉连接 ~p!=w#/
d%~OEq1i"
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 h`@z61UI
M/abd 7q
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 sPP(>y( \
[W8"Mc|ve
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 O4g2s8k
Jwtt&" c0.
于6*8=48行。 2)\gIMt%
*km!<L7Y
SELECT type,pub_name e`eh;@9p
ZWb\^N
FROM titles CROSS JOIN publishers GTocN1,Z~a
g@Z7f y7
ORDER BY type