一、简单查询 s_.]4bl.8
s( <uo{
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 |y20Hi':
m5G \}8|
表或视图、以及搜索条件等。 2&Nb
$BmmNn#
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 -*2Mf Mh
NA,CZ
SELECT nickname,email c#N<"cy>
_lW+>xQ
FROM testtable !EQ@#qW/
y0~Ia:y
WHERE name='张三' 5X.e*;
`pd&se'p
(一)选择列表 0b91y3R+
w;v7_
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 d*pF> j
aCV4AyG
量和全局变量)等构成。 L!_ZY
;v
1、选择所有列 ;V<iL?
DP/J(>eG
例如,下面语句显示testtable表中所有列的数据:
$hxNhI
}bU8G '
SELECT * /MQU
>&
VDB;%U*D
FROM testtable oPc\<$
sS
TPMh
2、选择部分列并指定它们的显示次序 aAu>Tn86D.
-yDs<
Xl
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 .k4W_9
MzIq"3
例如: e4OeoQ@ >
juBw5U<
SELECT nickname,email ;d$qc<2uA
VGL#!4wK
FROM testtable x ]5@>5
]\RRqLDzkg
3、更改列标题 Y,8KPg@W
P\CDd=yWc
在选择列表中,可重新指定列标题。定义格式为: )Z+{|^`kJ
VCy5JH
列标题=列名 I &* _,d
gfU-"VpHE
列名 列标题 &/.hx(#d
pS 4&w8s
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 +MK6zf
c^8o~K>w84
标题: 7nzGAz_W
Pag63njg?
SELECT 昵称=nickname,电子邮件=email a'\By?V]
')S;[= v
FROM testtable vhr+g 'tf
}G$]LWgQx
4、删除重复行
yz+, gLY
~#\i!I;RY}
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 6pE :A@
^0W(hA
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 52zGJ I*
zm9TvoC%}
5、限制返回的行数 CBf7]n0H
CLKov\U\
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 CGw--`#\
pO<-.,
表示一百分数,指定返回的行数等于总行数的百分之几。 6) \dBOz
mxwdugr`
例如: "HM{b?N
OEr:xK2T
SELECT TOP 2 * h06ku2Q
=R*Gk4<Y
FROM testtable v;y0jD#b
xa( m5P
SELECT TOP 20 PERCENT * 2}}?'PwwT
Ja]oGT=e
FROM testtable ?(KvQK|d4
R4%P:qM
(二)FROM子句 9+Y D!y
5H,G-
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, #iSFf
r^$~>!kZ|
它们之间用逗号分隔。 dEM?~?
o?Sla_D
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ;@ WV-bLe
WKA'=,`v
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 H'RL62!
6*GjP ;S=
使用下面语句格式加以限定: Mu_i$j$vvP
T#:F]=
SELECT username,citytable.cityid vd#,DU=p!
2>S~I"o0
FROM usertable,citytable -'rj&x{Q)U
")s!L"x
WHERE usertable.cityid=citytable.cityid d_}a`H
HW=xvA+
在FROM子句中可用以下两种格式为表或视图指定别名: "C%!8`K{a*
D1,O:+[;.
表名 as 别名 Kn+=lCk
;i#LIHJ
表名 别名 \9)[#Ld
Mj0Cat=
例如上面语句可用表的别名格式表示为: p}]q d4j
>', y
SELECT username,b.cityid ;kaHN;4?
{7Cx#Ewd
FROM usertable a,citytable b >e5zrgV
Q 882B1H
WHERE a.cityid=b.cityid r
-f
0rMqWP
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 .")b?#K
PB~_I=
例如: &yH#s
8^8
nR5bs;gk"
SELECT a.au_fname+a.au_lname ]>:^d%n,}
0yof u
FROM authors a,titleauthor ta i%(yk#=V
`rWB`q|i<
(SELECT title_id,title CKARg8o
6i@ub%qq
FROM titles 4 9w=kzo
YaFcz$GE_
WHERE ytd_sales>10000 -oBI+v&
AfWl6a?T8:
) AS t rFag@Z"["
:q2YBa
WHERE a.au_id=ta.au_id K, (65>86;
993d/z|DX
AND ta.title_id=t.title_id Y4~vC[$x'
3\!F\tqD \
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ;cSGlE |
GXb47_b^
(三)使用WHERE子句设置查询条件 `ypL]$cW
}X1.Wt=?
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: M|CrBJv+F
2tr
:xi@
SELECT * 9\51Z:>
J6|JWp
FROM usertable C@@$"}%v2
AF#_nK)@
WHERE age>20 O.:I,D&]
< tQc_
WHERE子句可包括各种条件运算符: x72G^`Wv
IlHY%8F{
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< kJ8vKcc
t!l%/$-
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… :4;S"p
<%!J?
NOT BETWEEN…AND… .:0M+Jr"
4]6 Qr
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) &G{2s J5{
HCc`
NOT IN (项1,项2……) ^tE_LL+ji|
Z H-5Qy_
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE :::>ro*R
5-p.MGso
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL CX+9R3pa
}K8Lm-.=
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 7z<Cu<
QFzFL-H~N
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 6+%-GgPf
%_tk7x
2、列表运算符例:country IN ('Germany','China') xURw,
q:yO92Ow
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 Xu]h$%W
4;\Y?M}g?
varchar、text、ntext、datetime和smalldatetime等类型查询。 `C<F+/q
$9i9s4u^
可使用以下通配字符: P3$,ca'
G]lvHD
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 :ej_D}
2Guvze_bU
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 <|JU(B
A70(W{6a9@
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 S8*> kM'
[2H[5<tH
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 ,Oi^ySn
.YiaXP
例如: 5+FLSk
oWD)+5.]
限制以Publishing结尾,使用LIKE '%Publishing' jM\ %$_/
DyX0xx^
限制以A开头:LIKE '[A]%' 0#`)Prop6
YKq0f=Ij
限制以A开头外:LIKE '[^A]%' L1MrrC
7:kCb[ji"
4、空值判断符例WHERE age IS NULL ;Vo mFp L
=, TS MV
5、逻辑运算符:优先级为NOT、AND、OR `e*61k5
b Fn(w:1Q
(四)查询结果排序 PSEWL6=]N
a>(~ C'(<
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: N?^_=KE@
.D3`'K3t{[
ORDER BY {column_name [ASC|DESC]} [,…n] sS'{QIRC'
++k J\N{
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ]-EN/V
]+lF=kkc%
序。 \4@a
^?sSx!:bZ
例如: V g6S/-
!=knppY
SELECT * +U=KXv
u7 u~
FROM usertable ecT]p
s[Gswd
ORDER BY age desc,userid ASC }#|2z}!
[k~C+FI
另外,可以根据表达式进行排序。 z"3H{ A
.)0gz!Z
e#m1X6$.e
`OLB';D
二、联合查询 ?Hk.|5A}
D9G0k[D,
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 wNR=?Z~
/gX%ABmS
合查询。UNION的语法格式为: ebD{ pc`&
5E.vje{U;
select_statement U5clQiow
iW-t}}Z>B
UNION [ALL] selectstatement =ty2_6&>
K]MzP|T,
[UNION [ALL] selectstatement][…n] Uk|9@Auav
I2W{tl
其中selectstatement为待联合的SELECT查询语句。 :^.u-bHI
b8e*Pv/
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 CL )%p"[x
_UaPwJ
行。 XJ
_%!
sHF%=Vu
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 BMF3XcH~G
%WmZ ]@M
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 qWkx:-g]
W -3w7^
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 o=@ UXi
Hj1k-Bs&'w
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 DSTx#*
!Am
=v=>
型,系统将低精度的数据类型转换为高精度的数据类型。 nT)~w
s
BHIM'24bp
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 8@Q"YA3d+
vevx|<9,
查询1 UNION (查询2 UNION 查询3) ?SB5b ,
'2j~WUEmg
sgR
9d
zEAx:6`c
:
qr}M
@!Y.935/0
三、连接查询 ?!rU
|D
]KzJ u`O%G
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 Mru~<:9
EyzY2>"^
数据库管理系统的一个标志。 [10$a(g\x
T<_+3kw
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 cFe V?a
;,R[]B01u
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 E=3#TBd
:E}6S
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 &(GopWR`e
5NFq7&rJ6
查询。 e-1;dX HL
g+VRT,r
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 +~@7"
|d
tYF$#Nor#k
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 yFIl^Ck%
JHHb |
SQL-92标准所定义的FROM子句的连接语法格式为: #V,LNX)
9{T 8M
FROM join_table join_type join_table e3G7K8
8U8P
g2
[ON (join_condition)] JB641nv
L)@`58Eil
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 iz,]%<_PE
l A 0-?k
个表操作的连接又称做自连接。 ^V_ku@DY
|)~Ex 9%ev
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 Bi %Z2/
?]759,Q3L
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ;B,nzx(L
$gXkx D
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 `4se7{'UK`
8Ix-i
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) tuX =o
`"i^'VL,
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 EolE?g@l8
uv?8V@x2
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 x;<oaT$X
<|ka{=T
数据行。 721{Ga4~S
v/QEu^C
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 dw@TbJ
Pm;x]Aj
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 -9hp+0 <
Zb12:?
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 Cmp{F N"o
R?1idl)
运算符等构成。 oFX"F0rx
m4wPuW
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 z7D*z8,i
OaX HJ^k
连接。例如: L{4),65
f$~ _FX
SELECT p1.pub_id,p2.pub_id,p1.pr_info qiF@7i
V.O<|tl.
FROM pub_info AS p1 INNER JOIN pub_info AS p2 "it`X
B.
7O;BS}Lv=
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 3'|Uqf8
]?v?Qfh2
(一)内连接 ;P0,60
yaCd4KP
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 m~A[V,os
R
(+h)#![
三种: =vB]*?;9
3tJ=d'U
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 g6x/f<2x
F(?Fz8
表中的所有列,包括其中的重复列。 @S/g,;7"
xkk@{}J\
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 iX0]g45o
0:7v/S!:
运算符包括>、>=、<=、<、!>、!<和<>。 +xoyKP!
A52LH,
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 [XA&&EcU
uOivnJ?
结果集合中所包括的列,并删除连接表中的重复列。 =%:n0S0C"
'qD'PLV
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: wR5\^[GN
.b!OZ
SELECT * j\i;'t}8g
ox i
a}
FROM authors AS a INNER JOIN publishers AS p gNMKGf\Y
^?sSsHz
ON a.city=p.city VuJfo9 `E
e>ZbZy?
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): E-5ij,bHv3
ntA[[OIFO
SELECT a.*,p.pub_id,p.pub_name,p.country AaCnTRG
:
9djMsd
FROM authors AS a INNER JOIN publishers AS p CWobvR)e
.P|+oYT&g
ON a.city=p.city qY*%p
IL8'{<lM
(二)外连接 >uP{9kDm
t?Njw7
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 S?,KgMVM
[FeJ8P>z
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 mlsvP%[f.
vkNZ -`+I
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 IxK 3,@d
ZYl-p]\*y
如下面使用左外连接将论坛内容和作者信息连接起来: eY6gb!5u
@SF")j|
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ^-csi
/:*R -VdF
ON a.username=b.username n##w[7B*
/jK17}j
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: it/C y\f
]XpU'/h>q;
SELECT a.*,b.* H$=h-
pDq^W@Rq
FROM city as a FULL OUTER JOIN user as b b3y,4ke"
Ca`/ t8=
ON a.username=b.username |2+F I<v4
{=pP`HD0
(三)交叉连接 z</XnN
N~Sue
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ~,`\D7Z3
YDZ1@N}^B
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 w'5dk3$"
CwH)6uA
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 O) =73e\
|~=?vw<W
于6*8=48行。 zn?a|kt
'%eaK_+7
SELECT type,pub_name ^}Dv$\;6
|+$j(YuH
FROM titles CROSS JOIN publishers vt(}ga
p[k9C$@e}
ORDER BY type