一、简单查询 0)Nu
X\Gbs=sf6
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 nY M2Vxi0+
o{[w6^D7
表或视图、以及搜索条件等。 , ;$SRQ.
,::f?
Gc7j
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 (baBi9<P=
e|1.-P@
SELECT nickname,email Ah:d2*SR4
[ikW3 '99,
FROM testtable yt+d
f0l
[x[nTIg
WHERE name='张三' ;)Fc@OXN>
W @
?* ~
(一)选择列表 Fswr @du
K3dg.>O
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 WzhY4"p
rK~Obv
量和全局变量)等构成。 IeN~E'~
)=TS)C4
1、选择所有列 j"5 $m@lgn
vX;~m7+
例如,下面语句显示testtable表中所有列的数据: }Gf9.ACQ
89Ch'D
SELECT * ioT+,li
wG LSei-s
FROM testtable +wIv|zj9
Xte"tf9(C
2、选择部分列并指定它们的显示次序 }'u0Q6Obj
wNm 1H[{
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 b=PB" -
1ir~WFP
例如: p N+1/m,
y^:N^Gt
SELECT nickname,email ?s]+2Tq
PblO?@~O
FROM testtable ;&9wG`
%X -G(Z
3、更改列标题 O>,Rsj!e
FR^(1+lx&
在选择列表中,可重新指定列标题。定义格式为: irooFR[L9
,V &RpKek
列标题=列名 \Z8:^ct.P
_Gtq]`y
列名 列标题 UFPSQ
8i~n;AhDs
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 vYNu=vnM
|2!cPf^8
标题:
*\# ?)q
WfH4*e
SELECT 昵称=nickname,电子邮件=email hQ _gOI
_FxQl]@
FROM testtable U2CCjAgRs
yL#2|t(
4、删除重复行 kWZ/O
i%#
<Hi7
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 dOFK;
5pz(6gA
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 }J+\o~
cyXnZs ?|
5、限制返回的行数 OM (D@up
snvixbN
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 |PutTcjQ
~JX+4~qT
表示一百分数,指定返回的行数等于总行数的百分之几。 _ lE
d8Cb
VRA0p[
例如: ~#PC(g
T{4Ru6[
SELECT TOP 2 * ay>u``$R
,}23
FROM testtable bCmlSu
8)V6yKGO
SELECT TOP 20 PERCENT * d)'J:
`KHP?lX
FROM testtable JXAH/N&i
s5&v~I;>e
(二)FROM子句 XAb-K?)
\[Q* d
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, |m>{< :
xC
YL3hl
它们之间用逗号分隔。 |#J!oBS!
JG* Lc@ Q
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 M?.[Rr-uw
r8TNl@Z
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 '[`pU>9
gaVQ3NqF
使用下面语句格式加以限定: cUD}SOW
";*Iwd*V
SELECT username,citytable.cityid 't#E-+o
k*k 9hv?
FROM usertable,citytable [fIElH<
0=I:VGC3
WHERE usertable.cityid=citytable.cityid s\io9'Ec
57rH`UFXH
在FROM子句中可用以下两种格式为表或视图指定别名: ]}A3Pm- t*
R6E.C!EI
表名 as 别名 W?2Z31;7
/2fQM_ ,P
表名 别名 MB!$s_~o#L
<,huajQs
例如上面语句可用表的别名格式表示为: zOT(>1'
u
4$$0 `
SELECT username,b.cityid egh_1Wg2a
sHf.xc
FROM usertable a,citytable b "FH03
9
_su$]s
WHERE a.cityid=b.cityid ]`u_d}`
#9u2LK
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 !fK9YW(Im
OE[N$,4I*
例如: D.Z4noMA6
t`eUD>\
SELECT a.au_fname+a.au_lname [fl^1!3{
SJsRHQ
FROM authors a,titleauthor ta PNG!q}(c
G !;<#|a
(SELECT title_id,title 5|Hz$oU
rFU|oDF
FROM titles /p7-D;
`uLH3sr
WHERE ytd_sales>10000 Qv/Kb w
N{
,-.a! a
) AS t ';Ew-u
ylPDM7Ka
WHERE a.au_id=ta.au_id _H)>U[
4@1C$|k
AND ta.title_id=t.title_id QTbv3#
9vw0box
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 '.1_anE]
~"8)9&
(三)使用WHERE子句设置查询条件 >' e(|P4
kzXmiBL<9
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 5$Da\?Fpn
q}MPl 2
SELECT * MrFi0G7u
5@< D6>6
FROM usertable Y=tx
kN
U]W+ers
WHERE age>20 T Z_](%
7FvtWE*
WHERE子句可包括各种条件运算符: $Oi@B)=4d+
]q<Zc>OC
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< t Zqy \_G
fLR\@f
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… iz5WWn^
tC4 7P[b
NOT BETWEEN…AND… a@}A;y'd
%VmHw~xyF:
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 0
V3`rK
e
QGhX(
NOT IN (项1,项2……) t%Hy#z1W_
\SQ wIM
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE (OT&:WwW
zcE[wM
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL w;4FN'
\'.#of
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR e9@7GaL`"S
8nQjD<-
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 0VBbSn}Z<
jce^Xf
2、列表运算符例:country IN ('Germany','China') flzHZH
d/!R;,^
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 VMb r@9
G~fM!F0
varchar、text、ntext、datetime和smalldatetime等类型查询。 uIb,n5
M qG`P
可使用以下通配字符: +ew9%={zB
Ql.abU
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 i_kKE+Q
76j5
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 FatLc|[
(S=RFd
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 0Z<&M|G
y8|?J\eRy
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 KOHYeiry~A
Uf<hzP
例如: {B,r
]v,>!~8r
限制以Publishing结尾,使用LIKE '%Publishing' QfHO3Y6h[
MPI=^rc2
限制以A开头:LIKE '[A]%' NQ"`F,T
f9FLtdh
\7
限制以A开头外:LIKE '[^A]%' 8dYPn+`
w\QMA3
4、空值判断符例WHERE age IS NULL y1@*)|
r
oGXndfd"
5、逻辑运算符:优先级为NOT、AND、OR oP 4z>
M9s cZuj
(四)查询结果排序 ERQc1G]3Dd
j!;y!g
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: :^[HDI-[2
Kfl#78$d
ORDER BY {column_name [ASC|DESC]} [,…n] Z<^TO1xs9B
67{>x[
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 eg$y,Tx
`7mRUDz
序。 +M/1,&
g&oAa;~o
例如: ;R
x Rap
r}]%(D](v
SELECT * "0edk"hk
~.H*"
FROM usertable |A0)-sVZ
8BgHoQ*
ORDER BY age desc,userid ASC '|JBA.s|
1{pU:/_W
另外,可以根据表达式进行排序。 #y:,owo3I
m_pqU(sP
- IF3'VG
nnol)|C{5Y
二、联合查询 dqu+-43I|
eG05}
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 Y!C8@B$MR3
4>I >y@^
合查询。UNION的语法格式为: _I1:|y
okv`+VeA
select_statement 4'
MmT'
Z2cumx(
UNION [ALL] selectstatement CW)JS3}W"
eK)R=M@i
[UNION [ALL] selectstatement][…n] rrL
gBeQa
Un[ 0or
其中selectstatement为待联合的SELECT查询语句。 9KgGK cy%
Gi=s|vt
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 t6JM%
$/p/9 -
行。 k~,({T<
! O~:
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Zl4X,9Wt
|0Y:
/uL#)
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 VsJ4sb7
pdFa]
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 k(bDj[0q^
psaPrE
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ;)'@kzi
:U!@
型,系统将低精度的数据类型转换为高精度的数据类型。 B2/d%B
Q2(K+!Oe
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: iXsX@ S^F
6";ew:Ih^
查询1 UNION (查询2 UNION 查询3) !Yi2g-(
?Xq"Q^o4#e
9>I&Z8J$M
(O@fgBM
uZ/XI {/
g;n6hXq4
三、连接查询 kQt#^pO)
%&[=%zc
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 4v?}K
pcrarj
数据库管理系统的一个标志。 n;+`%;6
^S%xaA9
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 j2GTo~muq
rQb=/@-
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 \fD)|
5HqvSfq>?
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 !CGpE=V
hzcSKRm
查询。 L%Mj{fJ>Wm
]I<w;.z
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 u"s@eN
92 oUQ EK
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 mNk@WY_F
# X`t~Y'
SQL-92标准所定义的FROM子句的连接语法格式为: $3'xb/3|
W_bp~Wu
FROM join_table join_type join_table GnFm*L
$2J[lt?%
[ON (join_condition)] m<liPl
uv
L4t(Y7
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 ?;xL]~Q~1
epm ~
个表操作的连接又称做自连接。 WZ6'"Cz`
kuI$VC
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 JUpb*B_z
pt_]&3\e
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 3o^~6A
~LF1$Cai
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 rf=oH
}
N eC]MW
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 9@^N*
E+
;BmPP,
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 \`oP\|Z
s/\<;g:u^
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 {TVQ]G%'b
8mM`v
数据行。 &WJ;s*
"~:P-]`G
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 uGU-MC*
>v'@p
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 j^)=<+Q;=
*bl|[(pP
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 6c[Slq!KA
ZU68\cL
运算符等构成。 8O| w(z
=v(&qh9Q2
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 HXb^K
U:q4OtiP
连接。例如: OD6dMql
9yYNX;C
SELECT p1.pub_id,p2.pub_id,p1.pr_info a^eR~efdu@
pqDlg
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Egi(z9|Pp
XYze*8xUb
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) cXIuGvE&=
'>:%n
(一)内连接 orZwm9#].
08_<G`r
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 X- P%^mK
R@
MXwP
三种: 'byao03
*]>~lO1
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 :4x&B^,53
X3j|J/
表中的所有列,包括其中的重复列。 [!j;jlh7},
=l4F/?u]f@
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 Z5`U+ (
^%t{:\
运算符包括>、>=、<=、<、!>、!<和<>。 p?'
F$Wz
Exz(t'
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 q22@ZRw
H8A=]Gq
结果集合中所包括的列,并删除连接表中的重复列。 h3(B7n7
us )NgG
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: $AF,4Ir-b+
iUq{c+h
SELECT * {4B7a6
')Qb,#/,%
FROM authors AS a INNER JOIN publishers AS p 7,3 g{8
>a)6GZ@
ON a.city=p.city F>U*Wy
%:.IG.`d
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): q9B5>Ye)
kf1 (
SELECT a.*,p.pub_id,p.pub_name,p.country &GaI
iUk#0 I
FROM authors AS a INNER JOIN publishers AS p "Xj>dB1~
=/kT|
ON a.city=p.city \]qwD m/
qz
}PTx
(二)外连接
A&C?|M?M
?jn";:
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 N6h.zl&04
{W%/?d9m
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 BFPy~5W
Wl{wY,u
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 kj@m5`G
:o_6
如下面使用左外连接将论坛内容和作者信息连接起来: ~-BIUZ;
r1zuc:W1
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b x?2y^3<5
`r+`vJ$
ON a.username=b.username p;rT#R&6>
H1 e^/JD)
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: k-8$43
WO+_|*&
SELECT a.*,b.* 4p]hY!7
x<>In"QV
FROM city as a FULL OUTER JOIN user as b q&@q/9kz
.xg, j{%(
ON a.username=b.username h"(HDn q
9m}c2:p
(三)交叉连接 =~ ="#
aZL
FsSY
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 .!Os'Y9[,
cB4p.iO
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 e2Df@8>
O^4Ko}
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 )5l9!1j
;op8r u
于6*8=48行。 gro@+^DmT
$-lP"m@}
SELECT type,pub_name /@9-D
4
(\ Gs7
FROM titles CROSS JOIN publishers ^vr`t9EE
-MItZ
ORDER BY type