一、简单查询 /`H{n$
D]B;5f
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 a&)4Dv0
%5-
表或视图、以及搜索条件等。 _]q%H ve
c8}jO=/5+
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 *R8qnvE\()
:(Uz`k7
SELECT nickname,email F2WMts
1WJ%n;
FROM testtable :!WKD@]
snti*e4"V
WHERE name='张三' :j[a X7Sq2
v3Xt<I=4y
(一)选择列表 %LZ-i?DL4Q
(rB?@:zN
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 YM4njkI7
t#sw{RO
量和全局变量)等构成。 {q^?Rw
8B"my\
1、选择所有列 kO'_g1f<[
_;8+L\
例如,下面语句显示testtable表中所有列的数据: d_w^u|(K
8iKupaaOX
SELECT * +x:-W0C:
3X]\p}]z
FROM testtable IP-}J$$1
01AzM)U3"m
2、选择部分列并指定它们的显示次序 lgei<\6~n5
a]nyZdt`
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 M-+pYv#&P
;y%C\YB#
例如: x39n7+j4
Yh9fIRR
SELECT nickname,email I15g G.)
_?J:Z*z?
FROM testtable 8j%hxAV$
3GUJlFj
3、更改列标题 xK;WJm"
L7 f'
在选择列表中,可重新指定列标题。定义格式为: mIUpAOC`"Z
dX>l"))yR
列标题=列名 itmQH\9 8
+ jIE,N
列名 列标题 *3r{s'm
dab[x@#r>
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ^d[s*,i?
?iQA>P9B
标题: r-SQk>Y}
d/3
k3HdL
SELECT 昵称=nickname,电子邮件=email '.&z y#
8`j;v>2
FROM testtable 1XvB,DhJ
? W`?F
4、删除重复行 +ysP#uAA
TRSR5D[
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Mk"V%)1k
<D!\"C
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 <u9U%Vsi
_8G
5、限制返回的行数 ?a]uyw,
5
LZ+~!2+
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 hc4W|Ofj
B U^3U x$
表示一百分数,指定返回的行数等于总行数的百分之几。 Z*Qra4GBl]
QX$i
]y%S
例如: R0v5mD$:G
&bO0Rn1F
SELECT TOP 2 * (!^(74
E'J| p7
FROM testtable ou[_ y
X(;,-7Jw
SELECT TOP 20 PERCENT * i1#\S0jN
/o19/Pvwm
FROM testtable YLfZ;W|6u
LOkNDmj
(二)FROM子句 .CL\``
h6dVT9
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, PB :Lj
p7A&r:qq#
它们之间用逗号分隔。 Y M_\ ZK:
K]
^kUN_
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 0O,l
rF0 '
#.(6.Li
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 o!3 -=<^
h>6'M
使用下面语句格式加以限定: GCUzKf&
&a>fZ^Y=k
SELECT username,citytable.cityid Vc!;O9dP
IR+dGqIjZb
FROM usertable,citytable yB7=8 Pcx
SY`
U]-h
WHERE usertable.cityid=citytable.cityid Xw=>L#Q
8/;q~:v
在FROM子句中可用以下两种格式为表或视图指定别名: (= H%VXQH
Yd4J:
表名 as 别名 O/9 dPod
3+<}Hm+
表名 别名 1Z +3=$P
@LS*WJ< w-
例如上面语句可用表的别名格式表示为: af61!?K
c]>s(/}T
SELECT username,b.cityid gp:,DC?(
a{7>7%[
FROM usertable a,citytable b :!M/9D*}0
4+od N.
WHERE a.cityid=b.cityid jmbwV,@Q2
+-=w`
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 ysV0Ed
G}d-L!YbE'
例如: M1^?_;B
O+Fu zCWj
SELECT a.au_fname+a.au_lname :=BFx"Y
,BCtNt(
FROM authors a,titleauthor ta {H+~4XG
m]8rljo
(SELECT title_id,title wuCiO;w
XYtDovbv&
FROM titles Kv'2^B
66*/"dBwm
WHERE ytd_sales>10000 G[1:<Vg8
:b[
[}'
) AS t Amf
gc>eJ
?(el6 J}
WHERE a.au_id=ta.au_id W3s>+yU
=B g
AND ta.title_id=t.title_id <(dHh9$~
TT3GFP
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 )-q#hY
n=#AH;42
(三)使用WHERE子句设置查询条件 I@a y&NNh
A*jU&3#
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: q~68)D(
ct+ ;W
SELECT * ?IR]y-r
f 4CS
FROM usertable duCxYhh|
3 f=_F
WHERE age>20 vt@5Hb)
q(sEN!^L`
WHERE子句可包括各种条件运算符: FES_:?.0
k%|7H,7
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< R57>z`;
JBLh4c3
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 8==_43
rfr]bq5
NOT BETWEEN…AND… QiJ
MN:LL
<
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) Q5sJ|]Bc
ToD_9i
}6
NOT IN (项1,项2……) %7?Z|'\
VSh&Y_%
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE N:Ir63X*#
"98j-L=F+
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL >gz8,&
+*aC
\4w
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Q\btl/?
>5D;uTy
u
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 JC;&]S.
Py?Q::
2、列表运算符例:country IN ('Germany','China') #q xo1uV(c
,lFp4 C
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 9\0$YY%
wxT(ktE
varchar、text、ntext、datetime和smalldatetime等类型查询。 tk>J
mcTw
Yb1Q6[!
可使用以下通配字符: @rF|WT
X}g3[
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 O=^/58(m
ff~1>=^
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 IaU%L6Q]
Z9Z\2t
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 BO%'/2eV
QX-n l~
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 }]JHY P\
)ybF@emc
例如: '}"&JO~vPj
e^$JGh2
限制以Publishing结尾,使用LIKE '%Publishing' xn,9Wj-
ExeZj8U
限制以A开头:LIKE '[A]%' 1+YqdDqQ
9PMIF9"
限制以A开头外:LIKE '[^A]%' 'g3T'2"`5
mkl^2V13~
4、空值判断符例WHERE age IS NULL \N$)Q.M
A~ _2"
5、逻辑运算符:优先级为NOT、AND、OR sV\K[4HG
!Lw]aHb
(四)查询结果排序 ia_lP
vo%"(!
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: S5d
c] t@3 m
ORDER BY {column_name [ASC|DESC]} [,…n] OkfxX&n
[^^ Pl:+
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 .t/@d(R
1Kd6tnX
序。 Ivj=?[c|
r4<aEj;l
例如: DuIXv7"[
Hmnxmgx
SELECT * VqxK5
.J O1kt
FROM usertable _uXb>V*8
c*\;!dbP
ORDER BY age desc,userid ASC -Mz [S
HrfS^B
另外,可以根据表达式进行排序。 w~ON861
x":o*(rSQ
SD<a#S\o
y%spI/(
二、联合查询 ~"NuYM#@
h9#)Eo
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 t,IOq[Vtk
PB?2{Cj
合查询。UNION的语法格式为: 7D4tuXUq2
0!7p5
select_statement (<8}un
yMTO 5~U{
UNION [ALL] selectstatement VpSpj/\m)'
4e#$-V
[UNION [ALL] selectstatement][…n] A.dbb'^
k~ByICE
其中selectstatement为待联合的SELECT查询语句。 4^M"V5tDx
RHMXPsj
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ^_<|~
h /^bRs`;
行。 ~BX=n9
G\TO]c
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 _B&Lyg!J
%W)pZN}
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 (QJe-)0_y
e,MsF4'
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Y)+q[MZ R
T'@+MA) ~
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 l
$"hhI8
lg~7[=%k#
型,系统将低精度的数据类型转换为高精度的数据类型。 mbGma
l-l7jq]R
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: -!:5jfT"
mPk'a
查询1 UNION (查询2 UNION 查询3)
%0N
HU`j
9|#cjHf
]L7A$sTUQ
;'= cNj
<.B+&3')
=@?[.`
三、连接查询 S!.sc
~~Ezt*lH
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 y{>f^S<
!NkCki"W
数据库管理系统的一个标志。 |f#hGk6
Es%f@$0uy
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 kzDN(_<1
'2H?c<Y3
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 &|~7`
]myRYb5Z
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 8Auek#[
;*M@LP{*L
查询。 yXJ25Axb
ExS5RV@v'
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 {;c'@U
.qO4ceW2-~
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 (`4&