一、简单查询 9%oLv25{)
j9%u&
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ) gvXeJ
rj$u_y3S*
表或视图、以及搜索条件等。 B9iH+
]W
4u X<sJ*
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 |^Try2@
C5i]n? )S
SELECT nickname,email 9+@_ZI-
u%5B_<90V
FROM testtable T#J]%IDd
"KOLRJ@
WHERE name='张三' ?YXl.yj
Sl^HMO
(一)选择列表 tNbCO+rZ
^o !K0t*
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 f|?i6.N>f
V;=SncUb
量和全局变量)等构成。 >2Al+m<w
CcgCKT
1、选择所有列 =/.[&DG
LH]nJdq?)
例如,下面语句显示testtable表中所有列的数据: T9{94Ra
"FcA:7 +
SELECT * *ky5SM(NR
P_hwa1~d
FROM testtable {#=q[jVi%1
%whPTc0P
2、选择部分列并指定它们的显示次序 X)fj&
ub}t3#
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 A[XEbfDO
?.|qRzWL
例如: vrGRZa
iK(n'X5i
SELECT nickname,email Mh>^~;
r&0v,WSp&S
FROM testtable ,":ADO-
eXnMS!g%Z
3、更改列标题 7 -gt V#
S`K8e^]
在选择列表中,可重新指定列标题。定义格式为: =B*,S#r
jFw?Ky2
列标题=列名 M,e_=aq
1P3^il7
列名 列标题 DB:Ia5|*i
i4'?/UPc
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 kxWf1hIz0
%l,p />r
标题: $oq&uL
#p*{p)]HiA
SELECT 昵称=nickname,电子邮件=email p[h A?dXn
H1 n`A#6?
FROM testtable MCe=R R
"^zxq5u
4、删除重复行 Z)|*mJ
E$4\Yc)(AL
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 _4owxYSDke
<2diO=
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 }c|Xr^
A"I:cw"KY
5、限制返回的行数 V\PGk<VO
0>4:(t7h\
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 7tUl$H;I/R
q,^^c1f
表示一百分数,指定返回的行数等于总行数的百分之几。 -HP [IJP
\2:
JX?Jw!
例如: 53=s'DZ
x76<u:
SELECT TOP 2 * '2/48j X5
H;G*tje/M
FROM testtable 5=.,a5
(3%NudkwT
SELECT TOP 20 PERCENT * \.9-:\'(
%z`bu2
FROM testtable )<1M'2
]5YG*sD4
(二)FROM子句 LC*@/((
bxc#bl3
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, IM}#k$vM:
)e4nKh],
它们之间用逗号分隔。 n_v|fxF1
$wdIOfaH
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 :a0qm.EN
hCc_+/j|
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ka[]pY
EbY%:jR
使用下面语句格式加以限定: [|<|a3']|
"DjD"?/b
SELECT username,citytable.cityid fN?HF'7V
y_Bmd
FROM usertable,citytable g(,gg1mG
%=]~5a9
WHERE usertable.cityid=citytable.cityid Cc]t*;nU_
]GJIrtS4
在FROM子句中可用以下两种格式为表或视图指定别名: 71@V|$Dy
elJLTG
表名 as 别名 (Y)$+9
lmp0Ye|
表名 别名 oZmni9*SD
ORA+>
例如上面语句可用表的别名格式表示为: wX<)Fj'
bv4lgRE6Y
SELECT username,b.cityid IyL2{5
^ bexXYh
FROM usertable a,citytable b W.HM!HQp
<Ktx*(D
WHERE a.cityid=b.cityid R3jhq3F\Y
wx>BNlT@?
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 5WP)na6"
|*fGG?}
例如: V'mQ{[{R
rMH\;\
I|U
SELECT a.au_fname+a.au_lname GW]Ygf1t
K`M 8[ %S
FROM authors a,titleauthor ta y7u"a)T
=BMON{K
(SELECT title_id,title 2Vr F~+
A]WU*GL2H
FROM titles Zyu4!
:;#^h]Q
WHERE ytd_sales>10000 ,l_"%xYx
l7Zqk GG]
) AS t >j4;{r+eQw
q$yTG!q*
WHERE a.au_id=ta.au_id ?.LS_e_0
,?3r-bM
AND ta.title_id=t.title_id VA&_dU]*
-S"YEH9
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ]t=m
Q=)$
(三)使用WHERE子句设置查询条件 MXh0 a@*]
U6t>UE6k
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: @a'Rn
J2f}{! b+I
SELECT * dzjp,c@
|e!%6Qq3
FROM usertable }u5/
hbl:~O&a/
WHERE age>20 H{x'I@+
% r`hW\4{
WHERE子句可包括各种条件运算符: )>QpR8
G-
^RAst1q7
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< <'>c`80@\*
p9 <XaJ}
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 1Mn=m w
DI{VJ&n66
NOT BETWEEN…AND… i+
]3J/J
*39Y1+=)$$
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) SP?~i@H
x"9`w42\r
NOT IN (项1,项2……) tBd-?+~7
i%_W{;e
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE pZ,=iqr
Hz) Xn\x
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL J: vq)G\F
f~%|Iu1ob
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR w[YiH $
WWhAm{m
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 fd!bs*\X
o%;R4 s,
2、列表运算符例:country IN ('Germany','China') s1.EE|h,5
`$*I%oT;
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 B5{ wSr
> r1cW7
varchar、text、ntext、datetime和smalldatetime等类型查询。 <tXk\cOg
t1}R#NB
可使用以下通配字符: "
R!,5HQF;
Q"7vzri
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Y&!-VW
$9YAq/#Q
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 NX%"_W/W
,P ~jO
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 'i+j;.
p{X?_ F
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 #
2;6!_
', ~
例如: U2<8U
`v?XFwnV`
限制以Publishing结尾,使用LIKE '%Publishing' fm]mqO
tAF#kBa\y_
限制以A开头:LIKE '[A]%' _zt)c!
OIJNOu I
限制以A开头外:LIKE '[^A]%'
PgIH(
G%ytp=N
4、空值判断符例WHERE age IS NULL ~8:q-m_h
7IkNS
5、逻辑运算符:优先级为NOT、AND、OR !xcLJ5^W
Oxsx\f_
(四)查询结果排序 RT`.S
uN
D=1:-aLP7
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: f$1&)1W[
[wOz<<
ORDER BY {column_name [ASC|DESC]} [,…n] iOY: a
uJ-Q]yQ
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 A\ARjSdb
e_=TkG1E6
序。 StLFq6BO
$-Iui0h
例如: D8X~qt/
^G(U@-0..
SELECT * D[/h7Ha
MTXh-9DA
FROM usertable ^E~F,]dV=
{$qE>ic
ORDER BY age desc,userid ASC >|zMN$:
+xNV1bM
另外,可以根据表达式进行排序。 sE^ee2]OI@
B703{k
| KtI:n4d
IVSOSl|
二、联合查询 C(CwsdlP
&fofFVQnW
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 W{Uz#o
Sf*1Z~P|
合查询。UNION的语法格式为: V#X#rDfJZ
Ua hsX
select_statement ;n,xu0/
-.xiq0
UNION [ALL] selectstatement Mc,3j~i
?_ 476A
[UNION [ALL] selectstatement][…n] Ef @
r)S:-wP
其中selectstatement为待联合的SELECT查询语句。 QL]e<2oPJ
jQBL8<
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 S^s|/!>
\uPyvA=
行。 *Xcqnu('
CKI.\o
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 uM)#T*(
Znw3P|>B
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 5(5:5q.A/D
2nf<RE>
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 IJ]rVty
U7#C. Z
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Gr-~&pm
j+9;Rvt2
型,系统将低精度的数据类型转换为高精度的数据类型。
5'\detV_
@eJ6UML"
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: &NKb},~
3D;?X@
查询1 UNION (查询2 UNION 查询3) t)|~8xpP
<@Z`<T6
HmiG%1+{A
%@9c'6
Upa F>,kM
:
&bJMzB
三、连接查询 qCkC 2Fy(
A^ofs*"Y
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 "%}24t%
GXaPfC0-y
数据库管理系统的一个标志。 _?>x{![
8
XQo
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 {oSdVRI
p$=Z0p4%LL
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 KFgq3snH
YdDP;,
DA
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 VBUrtx:
GQ(*k)'a
查询。 OxQ 5P;O
&V|kv"Wwj
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 w_h{6Kc<
cgnMoBIc
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 LLc^SP j
oN2#Jh%dH
SQL-92标准所定义的FROM子句的连接语法格式为: xkC M*5:
/!?b&N/d)
FROM join_table join_type join_table EHy 15RL
X1HEeJ|
[ON (join_condition)] 7Kf
i#98KzE
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 Q6)?#7<jy
e
|K_y~
个表操作的连接又称做自连接。 I
cASzSjYX
$DXO7;#
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 5tyA{&Ao
$K.DLqDt
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ZC]|s[
6f2?)jOW^N
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 et2;{Tb,5
X%mga~fB
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) %~I&T".iC
yAAV,?:o[
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 #+QJ5VI:
uI$n7\G!
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 ~!S/{Un
Llkh
kq_
数据行。 IQ$!y,VJ
XV/7K"
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 _aYhW{wW
#W6 6`{>
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 uH?dy55Y
|sI@m@
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 {yv_Ni*6!
F?$Vx)HI
运算符等构成。 vf zC2
j,Mbl"P
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 [[HCP8Wk
B{b?j*fHJ
连接。例如: fF(AvMsO
O=t~.]))
SELECT p1.pub_id,p2.pub_id,p1.pr_info cRH(@b
Xr
wo+`WnDh
FROM pub_info AS p1 INNER JOIN pub_info AS p2 z
.Z
L pq)TE#
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 43E)ltR=]
9Nps<+K
(一)内连接 X1d{7H8A2
5kGQf
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 w[F})u]E
Td,d9M
三种: 4qQE9fxdY
"b402"&
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 +.&P$`;TZj
tmOy"mq67
表中的所有列,包括其中的重复列。 !KJA)znx;(
Y(t/=3c[
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 D_?Tj
ZR
-RzT1
运算符包括>、>=、<=、<、!>、!<和<>。 u(FOSmNkN
&a4FGzR#
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 `-%dHvB^R
Cu5_OJ
结果集合中所包括的列,并删除连接表中的重复列。 cpl Ny?UIC
Ux1j +}y
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: T9}~]zW7P
qSlo)aP
SELECT * YzQ(\._s
`y61Bz
FROM authors AS a INNER JOIN publishers AS p L){V(*K '
c]Gs{V]\
ON a.city=p.city 7TEpjSuF
@`)>-k
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): gm
pY[
`*[\b9>
SELECT a.*,p.pub_id,p.pub_name,p.country Y#I8gzv
vmEn$`&2t
FROM authors AS a INNER JOIN publishers AS p H\V?QDn
?A;RTM
ON a.city=p.city O:8
u^TP
h<)ceD<,
(二)外连接 qE3Ud:j
]zVQL_%,
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 .?rs5[th*
oQrfrA&=M
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ]]_5_)"4
8G3 Z,8P4(
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 1) K<x
mhv6.W@
如下面使用左外连接将论坛内容和作者信息连接起来: Qy"%%keV'T
y9?*H?f,
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b Go1xyd:k
;zze.kb&F
ON a.username=b.username 2q]ZI
c7{s'ifG
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ovOV&Zt
QVRQUd
SELECT a.*,b.* #'O9Hn({
:%33m'EV}
FROM city as a FULL OUTER JOIN user as b H{yBDxw
"!(@MfjT
ON a.username=b.username lz6CK
n|? sNM<J3
(三)交叉连接 zRmVV}b
H;NAS/OhS
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ?]bx]Y;
ZbVn"he
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 )X," NJG
"=K3sk
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 V~#5^PF{
I$S*elveG
于6*8=48行。 jl}!UG
"=+i~N#Sc
SELECT type,pub_name K|\0jd)N
n^$Q^[:Z
FROM titles CROSS JOIN publishers 0[fBP\H"Wr
@`+\vmfD
ORDER BY type