一、简单查询 EwQae(PpA
9"ugz^uKt
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Q#pnj thM
h<% U["
表或视图、以及搜索条件等。 ~<,Sh~Ana.
H&bh<KPMh
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 7/"@yVBW
6m[9b*s7
SELECT nickname,email P}@*Z>j:#
a#y{pT2 b
FROM testtable dB3N%pB^
%S`ik!K"I
WHERE name='张三' 7Z0/(V.-
E>}q2
(一)选择列表 S+ebO/$>
b_vTGl1_6
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 3dG4pl~
g1@wf
量和全局变量)等构成。 bS rZ{l
k[9A,N^lZB
1、选择所有列 x=Mm6}/
s;1e0n
例如,下面语句显示testtable表中所有列的数据: z0Xa_w=
m*oc)x7'
SELECT * rzu
s
G),db%,X2
FROM testtable Yy
h=G
Hk u=pr3Gn
2、选择部分列并指定它们的显示次序 4RQ5(YTTuR
Y<Q\d[3^F
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 qq;b~ 3kW
k1fRj_@WPT
例如: !ZrB^?sO
|$e:*
SELECT nickname,email /U*yw5
4j3oT)+8
FROM testtable rk,p!}FqL
H]Wp%"L
3、更改列标题
$Nu)E
^i`*Wm@!
在选择列表中,可重新指定列标题。定义格式为: h|p[OecG
R1'`F{56
列标题=列名 ?N>pZR
:;4SQN{2
O
列名 列标题 yvxl_*Ds8
^>m^\MuZ
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 V;93).-$
r)b<{u=]
标题: {?i)K X^
D{C:d\ e)$
SELECT 昵称=nickname,电子邮件=email J^ ={}
cy1jZ1)
FROM testtable doD>m?rig3
><Uk*mwL
4、删除重复行 T"!EK&
l!IGc:
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ``9 GY
^,V[nfQR
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Q4wc-s4RN
q#vlBL
5、限制返回的行数 ,%hj cGX11
w^o}E)O
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 :3?|VE F
~ E *d G
表示一百分数,指定返回的行数等于总行数的百分之几。 z+3 9ee
;&,.TC?l
例如: Bq!cY Wj
xo
WT*f
SELECT TOP 2 * wPnybb{
*{5>XH{
x
FROM testtable c3k|G<C2
NHkL24ve
SELECT TOP 20 PERCENT * 1q]c7"
AuCWQ~
FROM testtable
}B ff,q
Z;b+>2oL
(二)FROM子句 #J$qa Ul
(
v@jc8y
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, VJ{pN ~_1
SI*^f\lu
它们之间用逗号分隔。 <y>:B}9'
)i!^]| $
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 PayV,8
7>-yaL{
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 %j{.0H
:'*DMW~
使用下面语句格式加以限定: *^h_z;{,
)}-$A-p#
SELECT username,citytable.cityid Q%5F ]`VN
k^%_V|&W/(
FROM usertable,citytable j>'B[
l4ouZR
WHERE usertable.cityid=citytable.cityid 8#f$rs(}
k'+}92
o
在FROM子句中可用以下两种格式为表或视图指定别名: ,
Oli
@vs@>CYdz
表名 as 别名 -x'e+zT
aqr!oxn?t
表名 别名 uD)-V;}P@;
yP\Up
例如上面语句可用表的别名格式表示为: ("Dv>&w9
ZBc|438[
SELECT username,b.cityid 8D~x\!(p\
]k+m=OR{/
FROM usertable a,citytable b _;e\:7<m
Q$=*aUU%G
WHERE a.cityid=b.cityid }<[Db}?9
+LzovC@^
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 LSkk;)'2K
XDLEVSly7
例如: i_U}{|j
kh?. K#
SELECT a.au_fname+a.au_lname 9P"iuU
2)\vj5<~$
FROM authors a,titleauthor ta Vxh.<b6&'
[Ox(.
(SELECT title_id,title Y<LNQ]8\G
h&'=F)5
FROM titles AcC8)xRpk4
O&$0&dhc
WHERE ytd_sales>10000 #`/QOTnm2c
=!
mJG
) AS t P5URvEnz:
3] 76fF\^[
WHERE a.au_id=ta.au_id {XnPx?V
Lk.h.ST
AND ta.title_id=t.title_id 7BFN|S_l
QN
G&
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 *fhX*e8y
J22r v(
(三)使用WHERE子句设置查询条件 '29WscU
cY{Nos
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: +1@AGJU3
=A n`D
SELECT * b5 Q NEi
\Ph7(ik
FROM usertable jA`a/vWu
W_<4WG
WHERE age>20 |.w;r
arj$dAW
WHERE子句可包括各种条件运算符: uO'/|[`8
,sDr9h/'C3
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< - L~Uu^o
;~/4d-
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… -p8e
~A >oO-0K
NOT BETWEEN…AND… )H+kB<n
$G[KT):N
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ,")F[%v
\4s;!R!
NOT IN (项1,项2……) +,_c/(P
mk= #\>
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE S< x:t(
4/MNqit+
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 1xTTJyoq
YIOR$
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR pP\h6b+B
r/AHJU3&eY
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 _T]>/}}p
:s*>W$Wp4
2、列表运算符例:country IN ('Germany','China') [ud|dwP"
.,mPdVof
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 (hf zM+2
~ hm`uP
varchar、text、ntext、datetime和smalldatetime等类型查询。 sv=H~wce
qG9qN.|dC
可使用以下通配字符: ma]?
)1<{
treXOC9^B8
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 cyMs(21
cU+>|'f&
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 d8:C3R
Gah lS*W
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 M 9"-WIG@h
hTw}X.<4
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 %dmfBf Ev
Uu5C%9^s
例如: pUL sGb
Ae3,^
限制以Publishing结尾,使用LIKE '%Publishing' e2Jp'93o'
8^X]z|[d2
限制以A开头:LIKE '[A]%' },PBqWe
UC|JAZL
限制以A开头外:LIKE '[^A]%' fn1pa@P
G(\Ckf:
4、空值判断符例WHERE age IS NULL RgGA$HN/
p
>aw
5、逻辑运算符:优先级为NOT、AND、OR 8]C1K
Zs
7) 0q--B
(四)查询结果排序 2U%qCfh6|
}n95< {
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: [TCRB`nTQF
_,Q[2gQ5N
ORDER BY {column_name [ASC|DESC]} [,…n] !$r9C/k
3bts7<K=
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ^s*\Qw{Ii
-S$$/sR
序。 ,}<RrUfD
76cEKHa<
例如: -+P7:4/
/f&By
p
SELECT * b *9-}g:
`a'`$'j
FROM usertable !!+Da>
t/ eo]
ORDER BY age desc,userid ASC PYieD}'
RbAt3k;y
另外,可以根据表达式进行排序。 IJIQ"
s
S'@=3)
ND*]gM
BD'NuI
二、联合查询 *w 21U!
!KDr`CV&
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 +H}e)1^I
D3.VXuKn6
合查询。UNION的语法格式为: V}:'Xgp*N
;+/NjC1
select_statement 1;`Fe":;vC
CJA+v-
UNION [ALL] selectstatement %uuH^ A
?9S+Cj`
[UNION [ALL] selectstatement][…n] `[@VxGy_
yFO)<GLk
其中selectstatement为待联合的SELECT查询语句。 2 `&<bt[g
dXO=ZU/N
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 KpGUq0d@
TkT-$=i
行。 %~\
gvo?([j-m
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 v= 8VvT8
6ZEdihBei
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 8m7;x/0ld
LE|<O
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 f9F2U
)
,D8&q?a
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 >Bx8IO1_\d
h--45`cE
型,系统将低精度的数据类型转换为高精度的数据类型。 >[P%Ty);
l/F!Bq[*g
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: -lnevrl
+"Ub/[J{G1
查询1 UNION (查询2 UNION 查询3) + !xu{2 !
V4\560
sDAK\#z
k}<<bm*f
2_N/wR#=&
w&C1=v -h
三、连接查询 #%WCL'6B
tj0Qr-/
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ifHU|0_=
sW'6}^Q
数据库管理系统的一个标志。 !l"tI#?6W%
f?5A"-NS
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 TZBVU&,{Z
0V7 _n
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ~4+8p9f
p}BGw:=
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 -xTKdm
D
f| =# q
查询。 b-4dsz'ai
m:"+J
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 1x;@~yU
Pv[ykrm/
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 HSC6;~U
Tplg2p%k
SQL-92标准所定义的FROM子句的连接语法格式为: `Jqf**t
F;W'
FROM join_table join_type join_table qzHU)Ns(_
R Y9.n
[ON (join_condition)]
Z:TFOnJ
lfRH`u
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 gtMw3D`FL
4`6< {
个表操作的连接又称做自连接。 ExqM1&zpK
dXDXRY.FMQ
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 6qf-Y!D5
=tHD 4I
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 yH+c#w
o
Fi) d[`
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 IF
e+B"
IE}Sdeqi)
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) P]-#wz=S
~Q0&P!k
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 V4Qz*z%
DEcGFRgN~
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 g kn)V~ij
p_;r%o=
数据行。 D>S8$]^Dm
RB *P0
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 K9^ "NS3
&AJUY()8
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 oo\IS\
*cPN\Iu.W
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 yduuFK
wZ
O@J|
运算符等构成。 yE<,Z%J[n
oLd:3,p}
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 X= SG
8M~u_`6
连接。例如: ,,7.=#
}]`}Ja
SELECT p1.pub_id,p2.pub_id,p1.pr_info >gF-6nPQ
c|+y9(0|y
FROM pub_info AS p1 INNER JOIN pub_info AS p2 *s~i 2}
kM,@[V
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 4':MI|/my_
DgVyy&7>
(一)内连接 k}#@8n|b
-&$%|cyThQ
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 >6w@{p2B
16L"^EYq
三种: |MVV +.X
ig+k[`W
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 2G H)iUmc
:)j7U3u
表中的所有列,包括其中的重复列。 |K6nOX!i
qR_SQ
VN
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 &hO$4q tN
0:jsV|5B8
运算符包括>、>=、<=、<、!>、!<和<>。 fG3wc
l~
PMQb\%iE"
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 G%Y*q(VrEu
\_?yzgf
结果集合中所包括的列,并删除连接表中的重复列。 pTN%;`)
{
xS-w\vbLV
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: b#e]1Q
@PKAz&0
SELECT * 4_WH
6Z
1T:)Zv'
FROM authors AS a INNER JOIN publishers AS p ?l(nM+[kSL
{ qjUI
ON a.city=p.city 1]HHe*'Z
GsI[N%
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): . c#90RP
Oxpo6G
SELECT a.*,p.pub_id,p.pub_name,p.country 58 kv#;j
2lF WW(
FROM authors AS a INNER JOIN publishers AS p aD0Q 0C+
~0av3G
ON a.city=p.city BF>T*Z-Ki
1xq3RD
(二)外连接 av"Dljc
C-_(13S
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 F_K
ShsJ_/C2
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 }F~f&<GX6
i[mC3ghM6,
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 !'+\]eA
<##|311o
如下面使用左外连接将论坛内容和作者信息连接起来: ZBPd(;"x+
=CWc`
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b bN]\K/
O}e|P~W
ON a.username=b.username (\T8!s{AO
w{RNv%hJ$=
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: q/A/3/
O 0Vn";Q 4
SELECT a.*,b.* dBsRm{aS
]6jHIk|
FROM city as a FULL OUTER JOIN user as b /j`i/Ha1
N'htcC
ON a.username=b.username f34_?F<h
?f(pQy@V
(三)交叉连接 ~JIywzcf8
9Ilfv
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 =PI^X\if88
Uf=vs(
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
~JAH-R
#8P#^v]H
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ?ykVf O'
2,rY\ Nu_
于6*8=48行。 [lmHXf@1C
PWADbu{+
SELECT type,pub_name d4b 9rtM
p7%0hLW
FROM titles CROSS JOIN publishers f6keWqv<GW
JsZAP
ORDER BY type