一、简单查询 O -p^S
b"w2 2%
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 B <HD
Y8fel2;
表或视图、以及搜索条件等。
!NKPy+v
w2`JFxQ^x
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 g( S4i%\
|uRYejj#j
SELECT nickname,email ZLf(m35
>{rD3X"d
FROM testtable r-[YJzf@P
z_y@4B6>}
WHERE name='张三' 'k<~HQr
Z%SDN"+'g
(一)选择列表 ?fpI,WFu
%T;VS-f
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 |+<o(Q(
[W dxMU
量和全局变量)等构成。 k4^!"~<+0
S6_dmTV*
1、选择所有列 0nR_I^
w'mn O'%
例如,下面语句显示testtable表中所有列的数据: 78]( ZYJV
'(3|hh)Tl
SELECT * fnFIw=d
1=~ ##/at
FROM testtable `YBHBTG'o!
`#j;\
2、选择部分列并指定它们的显示次序 PBwKR D[I
nQfSQMg
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ytfr'sr/
9~l8QaK
例如: Of<Vr.m{R
A2`Xh#o
SELECT nickname,email <bywi2]z
-t125)6 I
FROM testtable ;M*G
1ZWr@,\L
3、更改列标题 i*+N[#yp
XNl!?*l5?l
在选择列表中,可重新指定列标题。定义格式为: nfE4rIE4
Dd)L~`k{)
列标题=列名 o4aFgal1
_o>?\ :A
列名 列标题 ;4`%?6%
T@r%~z
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 QKt{XB6Y
Cg^1(dBd[9
标题: KM-7w66V
XIp>PcU^
SELECT 昵称=nickname,电子邮件=email pJ@->V_
ksAu=X:
FROM testtable sz4;hSTy
>T^BD'z@'
4、删除重复行 O[9A} g2~
In#m~nE[M
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 [*Vo`WgbD
V%FWZn^
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ]sB%j@G
d{]2Q9g
5、限制返回的行数 ?T'a{~]R
ey
U*20
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 .wQM_RZJ
lfLLk?g3k
表示一百分数,指定返回的行数等于总行数的百分之几。 v-B&"XGy:
,T+.xB;Q@
例如: [|L~" BB
v)v`896S`
SELECT TOP 2 * 3lefB
A7
vUJQ<D
FROM testtable [-3x *?Ju
kY~o3p<
SELECT TOP 20 PERCENT * 6CNxb
Mqmy*m[U
FROM testtable 7KV0g1GQ
\U HI%1^
(二)FROM子句 xG,L*3c{o
OH` |aqN
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, zj#8@gbh+
c7 O$< F
它们之间用逗号分隔。 Q::_i"?c
_Xfn
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 h09fU5l
S&Sa~Oq<o
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 CVGQ<,KVW
-Dr)+Y
使用下面语句格式加以限定: aq.Lnbi/X
g6;a2
SELECT username,citytable.cityid 2U'Vq
E~c>LF_]Q
FROM usertable,citytable
dm{/
RjGJfN{
WHERE usertable.cityid=citytable.cityid &MP +
T^
RYN
在FROM子句中可用以下两种格式为表或视图指定别名: rL6Y4u0e%
MtBoX*"
表名 as 别名 RJ$x{$r[
U^9#uK6GM
表名 别名 3TNj*jo
#Dl=K<I
例如上面语句可用表的别名格式表示为: '/<f'R^
Hni?r!8r
SELECT username,b.cityid
_'U(q\ri
s)7sgP
FROM usertable a,citytable b 3;wOA4ur
bA(-7l?
WHERE a.cityid=b.cityid @[hD;xO
~L=? F
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 ge$ p/
lQf38u||
例如: ~_|ZUb
crr#tad.
SELECT a.au_fname+a.au_lname .=/TT|eMS
>VB*Xt\C&
FROM authors a,titleauthor ta !2]'S=Y
})5I/
(SELECT title_id,title Ydh+iLjhx
DM3 %+ xY
FROM titles 7H_*1_%ZQ
*T0!q#R
WHERE ytd_sales>10000 3KN})*1
nb #)$l
) AS t KDJ-IXoU
fH?s~X]
WHERE a.au_id=ta.au_id [?moS!
Kb*X2#;*
AND ta.title_id=t.title_id A%%Vyz
ZRj&k9D^U
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 Pfl8x
,g{Ob{qT
(三)使用WHERE子句设置查询条件 1ac;6`
G
q2@37U
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: i'uSu8$'*
vALH!Kh
SELECT * x\'95qU
i5Dq'wp
FROM usertable ]O+W+h{]
EOzw&M];r
WHERE age>20 Ks\\2$Cm7
xA]}/*
WHERE子句可包括各种条件运算符: O
<"\G!y~
N:&EFfg3
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< >\ x!a:}
{*AYhZ
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ! ^TCe8
tY!GJusd
NOT BETWEEN…AND… {# Vp`ji
G^qt@,n$;
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) XywsjeI4
l1ViUY&Z
NOT IN (项1,项2……) ^#)]ICV
tQmuok4"d
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 7s}Eq~
hmr 2(f%U
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL G?5Vj_n
NRDXWscb
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR -~WDv[[
J6RzN'j
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ,^uQw/
Q>
J9M`a
2、列表运算符例:country IN ('Germany','China') wlw`%z-B2
yp"h$
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 _j}jh[M
t lpTq\;
varchar、text、ntext、datetime和smalldatetime等类型查询。 JbXd9AMh2
^H~g7&f9?N
可使用以下通配字符: ISi^BFU
GVld]ioycG
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 f7oJ6'K
],l\HHQ
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
} @4by<
TWSx9ii!M:
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 JbLHW26pl
!6*m<#Qm
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 W>y&
}5]7lGR
例如: 9oTtH7%
/#g
P#Z%
限制以Publishing结尾,使用LIKE '%Publishing'
B*AB@
o3(:R0
限制以A开头:LIKE '[A]%' JXF0}T)C
Tga%-xr+
限制以A开头外:LIKE '[^A]%' %ZM"c
1}ws@hU
4、空值判断符例WHERE age IS NULL nUf0TkA
>Q[3t79^
5、逻辑运算符:优先级为NOT、AND、OR ^:Fj+d
F-%Hw
(四)查询结果排序 -SUK [<=X
aXh~w<5F
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: h8hyQd$!
<N,:w`g#
ORDER BY {column_name [ASC|DESC]} [,…n] L-[A1#n
uo-1.[9ds
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 }0AoV&75
@|EWif|
序。 DAf0bh"
jhH&}d9
例如: ) m(!lDz3
g+3_ $qIQ+
SELECT * A\ r}V-
j] J-#J
FROM usertable *NCkC
~4
R^&.:;Wi>
ORDER BY age desc,userid ASC tui5?\
Hd57Iw
另外,可以根据表达式进行排序。 L'u*WHj|v
,Rdw]O
!24PJ\~I
/Csk"IfuO
二、联合查询 Nj=0bg"Qg5
z^u*e
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 p9![8VU
cyBm,!
合查询。UNION的语法格式为: !nL>Ly
KpC!C9
select_statement Of
m0{c=
/p$+oA+
UNION [ALL] selectstatement TGHyBPJb
`APeS=<
&
[UNION [ALL] selectstatement][…n] G.]'pn
!3`X Gg
其中selectstatement为待联合的SELECT查询语句。 jx14/E+^
qW`DCZu
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 $
D.*r*c6
u4|)A4n
行。 jM:|%o
*JF7 B
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 `Gh J)WA<
pU1miA '
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ;e6L@)dp9
>!bw8lVV
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 3v~[kVhoG
Q'rgh+6
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 lP*p7Y '
Vp&"[rC_z
型,系统将低精度的数据类型转换为高精度的数据类型。 M}]4tAyT
N"s"^}M\
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: Jw0I$W/
wizLA0W
查询1 UNION (查询2 UNION 查询3) eI98J"h%?
@*BVS'\
z||FmL{
lC@wCgc
`*3;sq%`
x27$h)R0v
三、连接查询 ;$3epP
XbIxGL
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 `6<Qb=
<Vl`EfA(
数据库管理系统的一个标志。 <l5s[
Cd|rDa
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 9r>iP L2H
%E[ $np>
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 8ib e#jlg
SB,#y>Zv?
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ce:wF#Qs
>Se-5QtLcf
查询。 Kx02 2rgDU
EQ]>^VE2B
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 j\iNag(
ySHpN>U
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 gfiFRwC`v
w|f@sB>j
SQL-92标准所定义的FROM子句的连接语法格式为: Hi^Z`97c
1BSn#Dnj
FROM join_table join_type join_table C!Jy;Z=+u
m[ER~]L/C
[ON (join_condition)] BmaY&?
hPuF:iiQ4
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 a:KL{e[
x>+sqFd\
个表操作的连接又称做自连接。 2M)E1q|a
`yh][gqVE~
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 q8MyEoc:n
3gYtu-1
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 <?h(Dchq
1n[wk'}qf4
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 a:s$[+'Y
@6*eS+t\
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ' pIC~
{LT2^gy=
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 f# -\*
B<ZCuVWH:
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 D;z!C
ys
qe/5'dw
数据行。 u qA!#E
zXk^ugFy
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 / 2MhP=,
$."Fz
x
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 #<G:&
,{_56j^d,
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 -`$J& YU
!&5|:96o
运算符等构成。 89t"2|9 u
/Mj|Px%
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 8( Q[A
5 BeU/
连接。例如: {\X$vaF
TN<"X :x9
SELECT p1.pub_id,p2.pub_id,p1.pr_info 0^)~p{Zh
Jl|^^?
FROM pub_info AS p1 INNER JOIN pub_info AS p2 8mt#S
%S^:5#9
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) AC!yc(^<
`JyI`@,!
(一)内连接
^CD?SP"i
^S 45!mSb
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 n8JM
0 U-
aSI%!Vg.
三种: MRT<hB
]Bs{9=2
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 FGeKhA 8jT
aGAr24]y
表中的所有列,包括其中的重复列。 r.c:QY$
;p87^:
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 x6ayFq=
)~`UDaj_
运算符包括>、>=、<=、<、!>、!<和<>。 _Ud! tK*H
+pQ3bX
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 A)&CI6(
w|NI d,#f
结果集合中所包括的列,并删除连接表中的重复列。 0Qy L}y2
*;Cpz[N
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 3J8M0W
/. H(&
SELECT * Ucz=\dO1
}PM7CZSq
FROM authors AS a INNER JOIN publishers AS p 5W=Jn?y2
m -0EcA/
ON a.city=p.city #99 =wn
7~;)N$d\
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): xrI9t?QaCb
d%K{JkD-
SELECT a.*,p.pub_id,p.pub_name,p.country ca5;Z@t$S
`i+2YCk
FROM authors AS a INNER JOIN publishers AS p )`6OSB
[.6bxK
ON a.city=p.city B
]sVlbt
M.bkFuh
(二)外连接 PDLps[a
/2MZH
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 h")7kjM
\7%wJIeyx
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 h iK}&
P@%L.y
B
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 jy_4W!4a
C0/G1\
如下面使用左外连接将论坛内容和作者信息连接起来: ^ >
?C
^/#8 "
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b h"'}Z^
)1$H7|
ON a.username=b.username wWSE[S$V
G[u{! 2RS
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: : %uaaFl
d[nz0LI|mk
SELECT a.*,b.* 'I:_}q
Bwu?DK
FROM city as a FULL OUTER JOIN user as b IkxoW:L
`$FB[Z} &
ON a.username=b.username DghqSL^s
ej1WkaR8
(三)交叉连接 B?Rkz
:_`Yrx5
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 fwh/#V-i
R<%{I)
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 `cIeqp
E,cQ9}/
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 yU"#2 *C
P%
8U
于6*8=48行。 3,#v0 #
ZI8@ 6 L\
SELECT type,pub_name /!y;h-
P#
U|
FROM titles CROSS JOIN publishers lHHx D
px(~ZZB"
ORDER BY type