一、简单查询 `XDl_E+>l
5#z1bu
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ZYNsHcTY
M
D#jj3y
表或视图、以及搜索条件等。 AQ^u
a$fnh3j[
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 #4;wjcGWw
:Llb< MY2
SELECT nickname,email )Q JUUn#
(**oRwr%
FROM testtable (^>J&[=
B`sAk
%
WHERE name='张三' ?gXp*>Kg[
a,o*=r
(一)选择列表 ue>D7\8
/g.U&oI]D
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 .fs3>@T"#
7uk[Oy<_
量和全局变量)等构成。 f%8C!W]Dm
"ocyK}l.?
1、选择所有列 8RHUeRX
HK%7g
例如,下面语句显示testtable表中所有列的数据: Pc]HP
MpOc
SELECT * V]?R>qhgu
l}P=/#</T
FROM testtable |1Z)E+q*:
3__-nV
2、选择部分列并指定它们的显示次序 /zox$p$?h
`
G
kX
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 {2gwk8
2 ? 4!K.
例如: :~SyL !
.A|@?p[
SELECT nickname,email :Iz8aQ
u]G\H!WkQ
FROM testtable 3iU=c&P
2>59q$|
3、更改列标题 JsS-n'gF'
^kSqsT"
在选择列表中,可重新指定列标题。定义格式为: 0IWf!Sk
]
2t1ZIyv3D
列标题=列名 Kf-JcBsrT
7x8
yxE
列名 列标题 Fs^Mw
go
Y|/ 8up
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 VS|2|n1<6
YHl;flv
标题: J,6yYIq
V G~Vs@c(
SELECT 昵称=nickname,电子邮件=email :MDKC /mC
,iwp,=h=
FROM testtable IUct
EBmt9S
4、删除重复行 nT)vNWT=
/wlEe>i
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Ht&YC<X
-%4,@
x`
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 @[v~y"tE}
-DAlRz#d,
5、限制返回的行数 9Gz=lc[!7
>5SSQ\ 2~a
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 `wU!`\
XB5DPx
表示一百分数,指定返回的行数等于总行数的百分之几。 \.}c9*)
9MqGIOQ${j
例如: hFBe,'3M
]}X
SELECT TOP 2 * Q=dy<kg']
7IM@i>p%
FROM testtable yaV|AB$v
{(?4!rh
SELECT TOP 20 PERCENT * pmYHUj
#
!Xw5<J3L-
FROM testtable A+?`?pOm&
Uoix
(二)FROM子句 2 8u_!f[
h
zn6kbv
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 2I{"XB
pI<f) r
它们之间用逗号分隔。 mB)bcuPv
1m0c|ckb
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 Z<{QaY$"
dUdT7ixo
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 _PR4`C*
)Xyn
q(
使用下面语句格式加以限定: 11;zNjD|
J<lO=
+mg
SELECT username,citytable.cityid r#mx~OVkk
-`6+UkOV[x
FROM usertable,citytable P0jtp7)7
Fv`,3aNB
WHERE usertable.cityid=citytable.cityid 6;5Ss?ep
Ilm^G}GB
在FROM子句中可用以下两种格式为表或视图指定别名: Rbv;?'O$L
"-V"=t'
表名 as 别名 ?!/kZM_ts
Eu04e N
表名 别名 seeBS/%
El"Q'(:/U
例如上面语句可用表的别名格式表示为: R0-j5&^jju
lU8Hd|@-
SELECT username,b.cityid K!l5coM
a7%]Y}$
FROM usertable a,citytable b |]*/R^1>2
;i+#fQO7Q
WHERE a.cityid=b.cityid 8DaL,bi*.
uWE^hz"
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 lks!w/yCF
8, >P
例如: )whA<lC
A&jlizN7
SELECT a.au_fname+a.au_lname E8&TO~"a]e
Ozf@6\/t
FROM authors a,titleauthor ta >b4eL59
0_t!T'jr7
(SELECT title_id,title b>JDH1)
qJUK_6|3
FROM titles y:l\$pGC%
D.XvG _
WHERE ytd_sales>10000 FzC'G57Kl
GWip-wI
) AS t 7Hu3>4<
+=8VTCn?
WHERE a.au_id=ta.au_id l1Fc>:o{
M\Kx'N
AND ta.title_id=t.title_id z2>lI9D4V
iOO)Q\
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 jRV/A!4
v|2T%y_
u
(三)使用WHERE子句设置查询条件 iAU@Yg`pt
>[*qf9$
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: &@YmA1Yu)E
3?
+Hd
SELECT * {Y9q[D'g .
'2^Q1{ :\
FROM usertable H<N,%G
i
K? w6
WHERE age>20 Pgea NK5Y
cYt!n5w~W
WHERE子句可包括各种条件运算符: 6!FQzFCZq
VP]% Hni]
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< I~XSn>-H
S{m%H{A!
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… A^<iL
PwLZkr@4^
NOT BETWEEN…AND… -3Vx76Y
|$b}L7_
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 5XBH$&Td
TRq6NB
NOT IN (项1,项2……) @;RXLq/8
V~5jfcd
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE OI*Xt`
4r}8lpF_(
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL g}',(tPMZ
ixD)VcD-f
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR CzEd8jeh7
sLAQE64\"
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 oILZgNe'
E~oOKQ5W
2、列表运算符例:country IN ('Germany','China') Y0-n\|
@I!0-OjL
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 )Z9>$V$j
,01"SWE
varchar、text、ntext、datetime和smalldatetime等类型查询。 ?.;c$'
e**qF=HCw
可使用以下通配字符: [HZv8HU|
|#
2.Q:&
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Q$Q([Au
,DkNLE
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 6 ~w@PRy
N//KPh
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 <GaS36ZW
y_lU=(%Jd
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 r<^HmpUJ
B_m8{44zM
例如: >I&5j/&}+
81Z) eO#
限制以Publishing结尾,使用LIKE '%Publishing' ^$hH1H+V
hZ
限制以A开头:LIKE '[A]%' v^ VitLC
:G%61x&=Zc
限制以A开头外:LIKE '[^A]%' $ gS>FJ
@2 fg~2M1
4、空值判断符例WHERE age IS NULL E09:E
v
z '&%(
5、逻辑运算符:优先级为NOT、AND、OR 0.k7oB;f(@
W|63Ir67
(四)查询结果排序
7E~;xn;
fS78>*K
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Z}Ft:7
W v+?TEP
ORDER BY {column_name [ASC|DESC]} [,…n] A{D];pE`
]-/VHh
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ?2Py_gkf
wEvVL
序。 Qn)a/w-
bB3powy9
例如: UrEs4R1#
+ @s"zp;F
SELECT *
Qjv}$`M
bAtSV u
FROM usertable 7! INkH]
5taT5?n2
ORDER BY age desc,userid ASC {[?(9u7R
-z%^)VE
另外,可以根据表达式进行排序。 q9r[$%G
ZRU{[4
i6Emhji
CdjI`
二、联合查询 &Ys<@M7E:
C1 GKLl~
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 cB}D^O
Vb]=B~ ^`
合查询。UNION的语法格式为: ={@6{-tl
D7Q$R:6|
select_statement ;,:`1UI
+*/Zu`kzX
UNION [ALL] selectstatement z/@slT
Od,qbU4O
[UNION [ALL] selectstatement][…n] 9N3o-=
p]2128kqx
其中selectstatement为待联合的SELECT查询语句。 >V8-i`
)cMh0SGcM1
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 jLHkOk5{:
Wf>R&o6tr
行。 7}5JDG
68C%B9.b'
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 |"CZ T#
5(Q%XQV*P
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 y,,dCca
-ifFbT+x
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 4yA+h2
0rs"o-s<
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 N]=q|D
j/c&xv7=
型,系统将低精度的数据类型转换为高精度的数据类型。 Sp]0c[37R
eiaFaYe\
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: XW)lDiJl
!Pfr,a
查询1 UNION (查询2 UNION 查询3) c2 C8g1n
2B&