一、简单查询 bUZ_UW
i%-Ld
Ka}"
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 9XLFHV("
S|em[D[Y^
表或视图、以及搜索条件等。 /*$hx @ih
fuUm}N7
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 @*>Sw>oet
C$d>_r
SELECT nickname,email t{dSX?<nt
AQss4[\Dx
FROM testtable }fZ`IOf
u,1}h L
WHERE name='张三' +/rH(Ni
,qQG;w,m
(一)选择列表 #Yuvbb[
geM6G$V&
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ]ikomCg
-r<#rITH"
量和全局变量)等构成。 4-R^/A0
N@xg:xr
1、选择所有列 -.IEgggf
6/Fzco#N
例如,下面语句显示testtable表中所有列的数据: !TKkec8$
1u|V`J)0
SELECT * t*G/]
ka"337H
FROM testtable . ]@=es
f )Z%pgB
2、选择部分列并指定它们的显示次序 t<j^q`;@v
amWD-0V
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 VZy4_v=
?4 S+edX
例如: #]]Su91BA
]y@F8$D!
SELECT nickname,email &fOdlQ?
e:w&(is
FROM testtable F_;DN:
{
l[GOs&D1
3、更改列标题 jS.g]k
\
%=9
在选择列表中,可重新指定列标题。定义格式为: F {+`uG
r?/A?DMe
列标题=列名 <#M`5X.
G:W>I=^DaR
列名 列标题 'heJ"k?
`J0i.0p
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ^|!I+
c{+A J8
标题: }8-\A7T
ZR0r>@M3v<
SELECT 昵称=nickname,电子邮件=email nH|,T%
k S#
CEU7
FROM testtable )B#
,
h#r^teui)
4、删除重复行 \2 y5_;O
kq=V4-a[
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 a:TvWzX,
Kl{>jr8B3
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 zSEs?
)D&M2CUw"f
5、限制返回的行数 8~lIe:F-
~ PWSo%W8
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 xNK1h-t
i_Re*
表示一百分数,指定返回的行数等于总行数的百分之几。 /u%h8!"R
(-77[+2
例如: Ny- [9S-<
YevyN\,}V!
SELECT TOP 2 * M:KbD|
g7V8D
FROM testtable l_'[27
)d\j I
SELECT TOP 20 PERCENT * (>4aibA'P
:~Q!SL N
FROM testtable }R[#?ty;]
$?G"GQ!.
(二)FROM子句 g>rp@M
l%ayI
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, $rF=_D6
)4>2IQ
它们之间用逗号分隔。 s=6}%%q6
f3j{V N
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 GQQ.OvEc
9>zcBG8f
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 j$UV/tp5T
2aw&YZ&Xo
使用下面语句格式加以限定: #`TgZKDg2
TGXa,A{
SELECT username,citytable.cityid B
vo5-P6XY
>(w2GD?
FROM usertable,citytable `afIYXP
U[L9*=P;
WHERE usertable.cityid=citytable.cityid RO;Bl:x4
p(;U@3G
在FROM子句中可用以下两种格式为表或视图指定别名: do*}syQ`O
I:bD~Fb3
表名 as 别名 vu!d)Fy
n79QJl/
表名 别名 ;8WZx
7(M(7}EKA
例如上面语句可用表的别名格式表示为: w=]Ks'C]
%W,D;?lEo>
SELECT username,b.cityid X"gCRn%tn
A[IL
H_w
FROM usertable a,citytable b 8dD2
;*ix~taL%
WHERE a.cityid=b.cityid Jd\apBIf
9)xUA;Qw?z
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 )VL96 did
SG}V[Glk
例如: 5uq3\a
IK,|5] *Ar
SELECT a.au_fname+a.au_lname D|Iur W1f
%75xr9yOP
FROM authors a,titleauthor ta 6S6f\gAM
^ -FX
(SELECT title_id,title aQ^umrj@?9
)"f
N!9,F
FROM titles 4'$g(+z
?D,=37
WHERE ytd_sales>10000 Mb3}7 @/[
Om{l>24i.\
) AS t k#[F`
(b?{xf'G
WHERE a.au_id=ta.au_id +3s%E{
M(#m0xB
AND ta.title_id=t.title_id u2oKH{/z
|KB0P@=a
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 :m86
hBE.
D=:04V}2+
(三)使用WHERE子句设置查询条件 !D!~^\
hA\K</h.
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: [."[pY
8WE{5#oi
SELECT * 0 a]/%y3V
??TMSH
FROM usertable QL6C,#6
Kp+CH7I*
WHERE age>20 Rqwzh@}
,q(&)L$S
WHERE子句可包括各种条件运算符: =@TQ>Qw%b
#r
PP*
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 7+x? "4
]9}HEu;1M
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… tm7u^9]
sr@j$G#uW5
NOT BETWEEN…AND… r{L4]|(utY
QwhRNnE=
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) PoEqurH0
.2J
L$"
NOT IN (项1,项2……) VMoSLFp^R
jx acg^c
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE v]__%_
?+T^O?r|O
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL \{Q?^E
S+TOSjfis
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR \om%Q[F7a
{3N'D2N
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 =^H4 Yck/5
eZ"1gYqy
2、列表运算符例:country IN ('Germany','China') Bgmn2-
iC
iZJ"
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 RwS@I/
Y>jiXl?&
varchar、text、ntext、datetime和smalldatetime等类型查询。 AeAp0cbet
;3_l@dP"
可使用以下通配字符: .z13 =yv
O;7)Hjw t
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 f|u#2!7
e#/E~r&
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 =]3tUD
9&RFO$WH
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 FI"`DMb}
s1?[7yC
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 E( us'9c
vkLC-Mzm<
例如: ;[RZ0Uy=
Mi~(aah
限制以Publishing结尾,使用LIKE '%Publishing' i-yy/y-N
t>8XTqqi
限制以A开头:LIKE '[A]%' Scv#zuv_
k+1|I)z
限制以A开头外:LIKE '[^A]%' ?eV4SH
+a^F\8H
4、空值判断符例WHERE age IS NULL 7)h[Zy,A
?f/n0U4w
5、逻辑运算符:优先级为NOT、AND、OR fib}b?vk
3>
/K0N|$
(四)查询结果排序 5q"ON)x
DWdW, xG
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: _)]CzBRq\6
!x'/9^i~v
ORDER BY {column_name [ASC|DESC]} [,…n] Z,iHy3`
u1xSp<59C
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 A)ipFB
6K
u.rY#cS,-R
序。 yoAfc
|p$spQ
例如: ePIiF_X
1>L(ul(qGF
SELECT * 4Vq%N
\@&_>us
FROM usertable :x_'i_w
A<;SnXm
ORDER BY age desc,userid ASC cyJG8f
}^B6yWUN
另外,可以根据表达式进行排序。 Ytgj|@jsp
|>z3E z
Rb3V^;i
imiR/V>N
二、联合查询 7 I>G{
^]
kF{
o?
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 WOh|U4vt
i*CZV|t US
合查询。UNION的语法格式为: ?.Pg\ur
]r_;dY a
select_statement aM4k *|H?
z2Z^~,i
UNION [ALL] selectstatement 7=(Hy\Q5xH
a'\o7_
[UNION [ALL] selectstatement][…n] Mfv1Os:ST
41SGWAd#:
其中selectstatement为待联合的SELECT查询语句。 q{+_
<2U|
10H)^p%3+
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 <oz!H[!
;NRF=d>
行。 *{+G=d
`O'`eY1f
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 4V~?.
Y3O#Q)-j$
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 -kbg\,PW
%w7]@V Z
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 /a6Xa&(B
U T="2*3gz
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 S]E.KLR?[;
I"KN"v^
型,系统将低精度的数据类型转换为高精度的数据类型。 [|l?2j\
r;m)nRu
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: t'ZWc\
)aX,% yK
查询1 UNION (查询2 UNION 查询3) S6[v;{xJ
>|;aIa@9
EAeqLtFqs
?mlNL/:
h>Hb`G<
-1J[n0O.
三、连接查询 A2|Ud_
)Y)pmjZaG
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 _/O25% l
3N_"rNKD
数据库管理系统的一个标志。 : "1XPr
a+Ac[>
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 : >>@rF ,
-+O
9<3ly
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 `:axzCrCfR
8.[SU
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 *E{2J:`
GQ
|Mr{.;
查询。 t#2(j1
XU"~h64]
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 {GJ@psG*
J(6oL
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 i'\T R|qd
P@FHnh3}Z$
SQL-92标准所定义的FROM子句的连接语法格式为: DY^;EZ!hb
AFAAuFE"
FROM join_table join_type join_table QV\eMuNy
%HJK;
[ON (join_condition)] 9:M`
j
<n#DT
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 *BR ^U$,e
]KmO$4
个表操作的连接又称做自连接。 rdJR 2
s-v
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 H*)NLp
]9@F~)
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 N ,z6y5Lu
>vA2A1WhW
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 G.UI|r/Kz
gg8Uo G
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) h2D>;k
%VnbmoO
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 bcYF\@};
6H7],aMg$A
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 4#lo$#
!@v7Zu43,
数据行。 ynrT a..
F|!){=
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 0vw4?>Jf@
j*vYBGD
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ~Rr~1I&mR,
7"C$pm6
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 gdQvp=v]
c??mL4$'N
运算符等构成。 pJtex^{!:
q*>&^V $M
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接
w.TuoWo>
FIsyiSY<j
连接。例如: BSVxN
c3CWRi`LE
SELECT p1.pub_id,p2.pub_id,p1.pr_info wY_)y
_/tHD]um
FROM pub_info AS p1 INNER JOIN pub_info AS p2 u`RI;KF~F
tw9f%p
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) $A-J,_:T<
B]l)++~
(一)内连接 y9Us n8
5yz(>EVH
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 _BP&n