一、简单查询 b$-e\XB!
JhX=l-?
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 !'0S0a8
Qh`:<KI
表或视图、以及搜索条件等。 *>."V5{;S
= yXs?y"
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 x0Z5zV9
S$[k Q|Am
SELECT nickname,email ~?U*6P)o
2R.2D'4)`
FROM testtable J|~26lG
q_t4OrLr=
WHERE name='张三' @i%YNI5*
.p&Yr%~
(一)选择列表 51xk>_Hm}|
uk7'K 0j
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 m,_d^
jirbUl
量和全局变量)等构成。 :}q\tNY<
%2l7Hmp4H
1、选择所有列 *xs!5|n+
!GK$[9
例如,下面语句显示testtable表中所有列的数据: :`Az/U[
*}!MOqP
SELECT * C)RBkcb
S h4wqf
FROM testtable NAr1[{^E,
C"w
{\
&R
2、选择部分列并指定它们的显示次序 o>lmst%<
\%A%s*1
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 C>QIrZu
-yx/7B5@
例如: s0W2?!>)
0$vj!-Mb^j
SELECT nickname,email 2+"r~#K*
q6q1\YB
FROM testtable fI|[Z+"
=XY]x
3、更改列标题 5#JJ?
+cB&Mi5
在选择列表中,可重新指定列标题。定义格式为: ~H6;I$e[
m"/g7w4N
列标题=列名 2#5,MP~r
LMl~yqM
列名 列标题 /SR^C$h'I
z; }6f
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 H7g<
p"
+a+`Z>
标题: N2,D:m\
uGJ"!K
SELECT 昵称=nickname,电子邮件=email %i0\1hhV<
,^s
FROM testtable yJ2B3i@T4
Q9?t[ir
4、删除重复行 WE!vSZ3R
z(HaRB3l
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 "HIXm
tiaR4PB
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 -8Ti*:
2XSHZ|;
5、限制返回的行数 f@V3\Z/6E
.0y%5wz8j
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 o|8`>!hF
h3G.EM:eG
表示一百分数,指定返回的行数等于总行数的百分之几。 _D!g4"
hkL5HzWn
例如: E+xuWdp.*
^HA
%q8| n
SELECT TOP 2 * c+' =hR[
[J#1Ff;
FROM testtable l}g;'9ZB
2z0n<`
SELECT TOP 20 PERCENT * P&A|PY,P
kJK,6mN
FROM testtable
u=l1s1>
+Ezgn/bS&
(二)FROM子句 <9A@`_';Aq
QBJ3iQs1
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 7S^""*Q^
%:C ]7gQ
它们之间用逗号分隔。 ZU2laqa_
jx`QB')kX
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 n-;y*kD
~%y @Xsot>
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 b`mj_b
0lk;F
使用下面语句格式加以限定: 8cg`7(a
b3$k9dmxV+
SELECT username,citytable.cityid ,w)p"[^b
in%;Eqk
FROM usertable,citytable alFjc.~}
R!x:
C!{
WHERE usertable.cityid=citytable.cityid 2(YPz|~W
V9 }t0$LN
在FROM子句中可用以下两种格式为表或视图指定别名: -`c:}m
&lc8G
表名 as 别名 `m~syKz4A
CZ{k@z`r
表名 别名 ?:rx1}:F
mz7l'4']+
例如上面语句可用表的别名格式表示为: -\$`ic$"1
M~
h8Crz
SELECT username,b.cityid ,2[ra9n
[\ )Ge
FROM usertable a,citytable b @]CF&: P A
N1EezC'^
WHERE a.cityid=b.cityid =H]F`[B=
'md0] R|
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 USML~]G
z
S9sR#
例如: ;-mdi/*g
7hNb/O004
SELECT a.au_fname+a.au_lname Xo5$X7m
yYJY;".H
FROM authors a,titleauthor ta !%L,*'
E;\M1(\u
(SELECT title_id,title MLVB^<qkeH
2h~-
FROM titles %uESrc-;
SqPtWEq@P
WHERE ytd_sales>10000 B uQ|~V
Q%=YM4;
) AS t X~T/qFS
haSM=;uPM
WHERE a.au_id=ta.au_id LC69td&
?2J?XS>
AND ta.title_id=t.title_id n$+M%}/f
H-t|i
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 +",S2Qmo
@|-OJ4[5
(三)使用WHERE子句设置查询条件 $Rtgr{ {;"
+=@ ^i'
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:
.jg0a
?H|T&66
SELECT * 3 x*z\VJ
-e -e9uP
FROM usertable u</8w&!
LgqGVh3\s
WHERE age>20 *7gT}O;p 5
GuQRn
WHERE子句可包括各种条件运算符: "PWl4a&
Q
s(Bnb;
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< |hzT;
_2Zp1h,
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… %CH6lY=lI
6F0(aGs
NOT BETWEEN…AND… [[L-jq.'
o
\L!(hm
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) n]? WCG}cd
4*H"Z(HP
NOT IN (项1,项2……) I<\
'%
_^!vCa7f
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE v"lf-c
UsW5d]i}Y
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ur%$aX)
h SV@TL
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR F@W*\3)
,Qc.;4s-
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 1=GI&f2I
/XpSe<3
2、列表运算符例:country IN ('Germany','China') Lk,+Tfk"
D!3{gV#
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 &y.dmW
)C]x?R([m
varchar、text、ntext、datetime和smalldatetime等类型查询。 fj']?a!m
n~r 9!m$<
可使用以下通配字符: !q/5yEJ>h
s;.=5wcvi?
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 bg7n
]|oJ)5P
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ;)/@Xx
`lCuU~~ag
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 fEqC] *s
lgD]{\O$ip
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 W'/>et
\9m*(_Qf
例如: Ie_I7YJ
4<gJ2a3
限制以Publishing结尾,使用LIKE '%Publishing' %v=!'?VT
*g7DPN$aQ
限制以A开头:LIKE '[A]%' ,x#ztdvr
h}Ygb-uZ
限制以A开头外:LIKE '[^A]%' d<T%`:s<
(cV
4、空值判断符例WHERE age IS NULL wh6&>m#r
Wc4vCVw
5、逻辑运算符:优先级为NOT、AND、OR 3 wt
7'j9rmTXs
(四)查询结果排序 8&(-8
aqL<v94wX
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: L#j/0IHD
CT"Fk'B'
ORDER BY {column_name [ASC|DESC]} [,…n] @YZ
4AC
azGnP3_
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 xs1bxJ_R
Q_}n%P:u
序。 "$@,n7k
|5ONFde"0
例如: U$J5r+>
-Bv12ymLG
SELECT * mw+j|{[
CA^.?&CH^O
FROM usertable
`]>on`n?
9ECS,r*B
ORDER BY age desc,userid ASC chLeq
\(u@F<s-
另外,可以根据表达式进行排序。 n~%}Z[5D
7^wE$7hS
^x3EotQ\
HD00J]y_
二、联合查询 rw*M&qg!z
EXHR(t}e
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 -tP.S1D
%EIUAG
合查询。UNION的语法格式为: .zwVCW,u
5"2@NL
select_statement *`.LA@bHU
T{HfP
UNION [ALL] selectstatement )@$
&FFIu
ua:9`+Dff
[UNION [ALL] selectstatement][…n] dqz1xQ1
3_U\VGm
其中selectstatement为待联合的SELECT查询语句。 }K;iJ~kD1
%&1$~m0
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 .b~OMTHuvM
\7DCwu[0M
行。 Ou!)1UFI
`skH-lk,
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 @?M;'xMbB
ir+8:./6
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 H<z30r/-w
k!vHO
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 %&2B
<G}m #
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 8xgc[#
$~ VcQ
型,系统将低精度的数据类型转换为高精度的数据类型。 2_I+mQ
7_7xL(F/
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 9Q=>MOB-
<L%HG
查询1 UNION (查询2 UNION 查询3) ^@Y9!G=
'N|2vbi<
w&9F>`VET
W
n6,U=$3
DbQBVy
Iw*C*%}[Z
三、连接查询 V"BVvSNu
|&(H^<+Xp
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 Ho>p ^p
i(z+a6^@|
数据库管理系统的一个标志。 jigbeHRy
z(jU|va{_1
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 j}"]s/= 6
)v};C<
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ud.poh~|
c.\:peDk
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 >*Sv0#
?3n=m%W,J*
查询。 j#CuR7m
^?#@[4?"
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 &8zk3
~xP
Szf
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 z=u~]:.1O
fO0-N>W'P
SQL-92标准所定义的FROM子句的连接语法格式为: Bk@bN~B4
Cx$9#3\
FROM join_table join_type join_table zkH<aLRB
ws#hhW3qK
[ON (join_condition)] LZbRQ"!!o
T..-)kL+p
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 hcj{%^p
:U7;M}0
个表操作的连接又称做自连接。 {|G&W^`
//VG1@vaVX
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 cPx66Dh&
Ty)gPh6O
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 *{HGLl|=
|L*6x
S[
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 9c#L{in
.0rJIO
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 77)OW$G
^Z#<tN;
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 h]G6~TYI5
&p