一、简单查询 2/RK
pl &
oJVpNE[3]
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 fw ._
~j" aJ /
表或视图、以及搜索条件等。 jb$sIZ%i
)/PvaL
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ^ ]SS\=7
zh2$U
dZ|M
SELECT nickname,email TKvUBy
yc8FEn!)&
FROM testtable 1 h|cr_
2w)0>Y(_
WHERE name='张三' }P#%aE&-
Mcj4GjV6:"
(一)选择列表 b[$%Wg
wxB?}
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 B3@
$]:I1I
量和全局变量)等构成。 k$y(H;XA
%+|k>?&z7
1、选择所有列 fu}NH\{
@riCR<fF
例如,下面语句显示testtable表中所有列的数据: DKm`
EShc1KPqc
SELECT * 1el?f>
}OJ*o
FROM testtable `sQ\j Nu
@4^5C-
2、选择部分列并指定它们的显示次序 >~_y\
9G` 2t~%
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 h']RP
$TU=^W)X
例如: d?GfT$1
\v44 Vmfz
SELECT nickname,email nS"K
dPM
o<1e-
FROM testtable GBzC<e#
K20n355uE
3、更改列标题 TDBWYppM
BWFl8
!_X
在选择列表中,可重新指定列标题。定义格式为: *>V6KW
D{Y~kV|
列标题=列名 w5gN8ZF3
A9qCaq{
列名 列标题 ^+oi|y
oF,XSd
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 m~1{~'
TC?kuQI
标题: ?{?mAbc
7'S/hV%
SELECT 昵称=nickname,电子邮件=email ^W9[PE#F
w(8q qU+\
FROM testtable 1>jG*tr
`I ,A7b
4、删除重复行
O*d&H;;
~QFD ^SoK
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 C$){H"#
JaKR#Y$+~
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 bYQ h{q
V.)y7B
5、限制返回的行数 @;qC% +^
{S%)GvrT
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 @ \J R xJ
/%po@Pm#I
表示一百分数,指定返回的行数等于总行数的百分之几。 D%(9ot{!e
^c83_93)R
例如: bxyEn'vNvQ
#pBAGm3
SELECT TOP 2 * @g9j+DcU
#bUWF|zfT
FROM testtable ZLyJ
:^0g}8$<
SELECT TOP 20 PERCENT * y$r^UjJEO
MG>g?s'!
FROM testtable Q-F'-@`(C
jV\M`=4IC
(二)FROM子句 Q\z3YUk
E$.|h;i]Q
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, fU@}]&
~'dnrhdme
它们之间用逗号分隔。 <89@k(\ /
(aVsp*E
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 $5GvF1
Jme}{!3m
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 B/q/sC
Odxq ]HlbO
使用下面语句格式加以限定: %\_I%
yF
B, xrZ s
SELECT username,citytable.cityid L$zT`1Hy
W=5+k0Q
FROM usertable,citytable Oh6;o1UI
"8ILV`[
WHERE usertable.cityid=citytable.cityid FI.S?gy0
a[\,K4l
在FROM子句中可用以下两种格式为表或视图指定别名: %=/Y~ml?
vNLf)B
表名 as 别名 8V_
]}W
fpM4q
表名 别名 U(-9xp+
daWmF
例如上面语句可用表的别名格式表示为: >4ebvM
0|
75K~ebRr
SELECT username,b.cityid Vm'ReH
~ i1w,;(
FROM usertable a,citytable b l"}W $3]u$
z~4L=tA(
WHERE a.cityid=b.cityid vxUJ4|Qz
{-^>)
iJqt
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 }E]`ly<Z
aBr%"&Z.MG
例如: , Ot3N\%yn
H`-%)c=
SELECT a.au_fname+a.au_lname BT
98WR"\
t"2WJ-1k}
FROM authors a,titleauthor ta bVtboHlY
4S 2I]d
(SELECT title_id,title 7$x@;%xd
-2v|d]3qG
FROM titles ^wb -s
si=/=h
WHERE ytd_sales>10000 \4K8*`$
b6bmvHD
) AS t Mki(,Y|1~
cy)L%`(7
WHERE a.au_id=ta.au_id fTY @{t
KK(x)(
AND ta.title_id=t.title_id on*?O O'
V?Lf&X?
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 o80pmy7@
x?:WR*5w
(三)使用WHERE子句设置查询条件 ETH`.~%
j!mI9*hP
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: aP8Im1<A
>G'
NI?$
SELECT * g]$>G0E`oD
5Ag]1k{
FROM usertable $msT,$NJ
da\K>An>
WHERE age>20 s?~Abj_
dT/Cn v=
WHERE子句可包括各种条件运算符: uz>s2I}B
m{pL<
g^M
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< (oq(-Wv
@WhcY*R2
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… akm) X0!-}
xVfJ]Y
NOT BETWEEN…AND… QlJCdCSy
"uGJ\
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) J9/9k
s]L`&fY]O
NOT IN (项1,项2……) ?U|~h1
Se"\PxBR
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE IZJV6clM
TUy*wp9
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL UT+\IzL
Yr-,0${m
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR k49CS*I
X%`8h_
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 s<:"rw`
SnQ$
2、列表运算符例:country IN ('Germany','China') d#ld*\|
8k_,Hni
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 SwC,=S
*sAoYx
varchar、text、ntext、datetime和smalldatetime等类型查询。 wjS3ItB
t~5>PS
可使用以下通配字符: xg'0YZ\t
S31:}
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Ug_zyfr
`~@BU
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 LE1&atq
Pl1:d{"d
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 `E!t,*(*E
r}f-.Fo
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 7dPA>5"XD
%=#&\ldPS
例如: hJFQ/(
2Q9s?C
限制以Publishing结尾,使用LIKE '%Publishing' He#+zE;
_<t3~{qUT
限制以A开头:LIKE '[A]%' YLPiK
H@G7oK
限制以A开头外:LIKE '[^A]%' O;H/15j:sK
}{iR+MX
4、空值判断符例WHERE age IS NULL gP/]05$e
IFG`
5、逻辑运算符:优先级为NOT、AND、OR
>kC@7h5)
eWwSD#N#
(四)查询结果排序 kdxs{b"t
>#!n"i;
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: D KK200j
HD=WHT&
ORDER BY {column_name [ASC|DESC]} [,…n] JG/sKOlA
Z]9
)1&
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Dm 'Q&
50_%Tl[
序。 /&kZ)XOi
(6 0,0|s
例如: ? _HTOOa
!o*oT}6n
SELECT * j:<E=[Kl
4+v~{
FROM usertable %#7M~RB[
SvI
ORDER BY age desc,userid ASC zKT \i
N66jFRA;x
另外,可以根据表达式进行排序。 x!I7vs~~zW
%eD&2$q*
4jG@ #
z2"2Xqy<U
二、联合查询 R?l>Vr
$Q47>/CUc^
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 *l7
ojv
Bljh'Qp>C
合查询。UNION的语法格式为: E(u[?
q/4PX
select_statement ^~(bm$4r
X^aujK^@
UNION [ALL] selectstatement QF%@MK0zC
T( ;BEyc?
[UNION [ALL] selectstatement][…n] Oh8;YE-%
|$1j;#h
其中selectstatement为待联合的SELECT查询语句。 g{<3*,
anl?4q3;9
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 !_x-aro3<
xss D2*l
行。 apw8wL2
t`F%$q
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 DK4V/>@8
N18Zsdrp
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 &3u*
zV$
Yt|{l
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 >TL0hBaaR
VaQ}XM
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 *RuUf
Q^mJ _~
型,系统将低精度的数据类型转换为高精度的数据类型。 hTg%T#m
Kx<