一、简单查询 3{LXx
J}c57$Z
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 wZJpSkcEx
ug'I:#@2
表或视图、以及搜索条件等。 XZ EawJ0
#v0"hFOH,
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 *p`0dvXG2
x1:+M]Da
SELECT nickname,email (v6tE[4
w},' 1
FROM testtable DJ_,1F
#=V%S
2~
WHERE name='张三' I= G%r/3
6}='/d-[
(一)选择列表 MUhC6s\F
m4bfW
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 m2E$[g
F l83
Z>
量和全局变量)等构成。 / *RDy!m
7g[m,48{
1、选择所有列 orVsMT[A
b'Pq[ )
例如,下面语句显示testtable表中所有列的数据: 4.I6%Bq$
q#:,6HDd
SELECT * H%t/-'U?
O$k;p<?M
FROM testtable 7!+kyA\}r^
jJkM:iR
2、选择部分列并指定它们的显示次序 D9zw' RY
guz{DBlK
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 KE1S5Mck>
PVP,2Yq!
例如: %C\Q{_ AS
QZB2yK3]h
SELECT nickname,email 9yH95uaDF
` wuA}v3!
FROM testtable \{AxDk{z#
M>D 3NY[,
3、更改列标题 >!s=f
$/90('D
在选择列表中,可重新指定列标题。定义格式为: f#_ XR
+-&N<U
列标题=列名
F' s($n
?Z0T9e<
列名 列标题 ^h{AAS>
d"<Q}Ay
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ^.5L\
,Dfq%~:grT
标题: E1IRb':
A ${b]
SELECT 昵称=nickname,电子邮件=email @'C f<wns
{Z 3t0F
FROM testtable L]hXAShmb
8ar2N)59
4、删除重复行 .F:qJ6E
b#bdz1@s
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 *Dtwr
] as_7
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 !4GGq
E/|]xKG
5、限制返回的行数
Bj09?#~[
&sR=N60n
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 sfNXIEr^
AVVL]9b_2
表示一百分数,指定返回的行数等于总行数的百分之几。 Mez;DKJ`
&,4]XT
例如: Rn~FCj,-
vZj^&/F$=g
SELECT TOP 2 * nv1'iSEeOl
oJe9H <
FROM testtable J\<7M8
0* <gGC
SELECT TOP 20 PERCENT * L@2%a'
MzT#1~
FROM testtable \?c0XD
"u5Hm ^H
(二)FROM子句 }$!bD
Ni*f1[sI<
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, mE(EyB<
Y$b4Ga9j
它们之间用逗号分隔。 Zs<}{`-
|!{Q4<
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 $3S6{"
Yr5A,-s
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 +]uW|owxo
x- kCNy
使用下面语句格式加以限定: ?Y+xuY/t
ot]eaad
SELECT username,citytable.cityid {[G2{ijRz
]vJZ v"ACn
FROM usertable,citytable (__=*ew
K]' 84!l
WHERE usertable.cityid=citytable.cityid p8K4^H
hm3,?FMbq
在FROM子句中可用以下两种格式为表或视图指定别名: .NcoST9a
jIJVl \i]
表名 as 别名 4v9zFJ<Z
TU$PAwn=
表名 别名 G7 >
rs{e6
例如上面语句可用表的别名格式表示为: A!Zjcp|
y
,isK
SELECT username,b.cityid `l@[8H%aw
"r @RDw
FROM usertable a,citytable b fx %Y(W#5
0#4_vg .
WHERE a.cityid=b.cityid ;l>
xXSB7$
4*MjDb
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 _a@&$NEox
(rO_Vfaa
例如: F>jPr8&
pg~vteq5
SELECT a.au_fname+a.au_lname ?g%5 d
E]w1!Ah M
FROM authors a,titleauthor ta (-*NRY3*
Q:eIq<erY
(SELECT title_id,title H+vONg
C-d|;R}Ww
FROM titles }qmBn`3R
8^M5k%P
WHERE ytd_sales>10000 _Z+tb]
pw{3I 2Ix
) AS t ,/6V ^K
/Y5I0Ko Uw
WHERE a.au_id=ta.au_id 6~zR(HzV{
,\!4A
AND ta.title_id=t.title_id 7IW:,=Zk8+
5,`U3na,
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 [1B F8:
J9S9rir&
(三)使用WHERE子句设置查询条件 W"S,~y
&[,g`S0
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: UfjLNe}wA
.z&V!2zp
SELECT * m76**X
6g4CUP'Y
FROM usertable q9o =,[
#Z<pks2
y
WHERE age>20 D
7 l&L
L>+g;GJ
WHERE子句可包括各种条件运算符: rt$zM
pq_DYG]
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ~K% ]9
$l-|abLELz
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… f gI.q
P`6
T;|VDk
NOT BETWEEN…AND… 75i
M_e\
c:I1XC
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) `q* 0^}
7iu?Q
NOT IN (项1,项2……) W!q'wrIx(
;e;lPM{+
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE @+~=h{jv<
3S1V^C-eBx
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL >SpXB:wx
xn)FE4
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR q88p~Ccoa
h`+Gs{1qw
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 IrQ8t!
~-x8@ /
2、列表运算符例:country IN ('Germany','China')
F7a &-
yq+<pfaqvK
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 }l$M%Ps!a
'D%No!+Py
varchar、text、ntext、datetime和smalldatetime等类型查询。 9\3% 5B7
#b\&Md|;
可使用以下通配字符: xP*9UXZ4P
wpu]{~Y
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 GDw4=0u-
)|,-l^lC
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 zYpIG8"o5
BL0WI9
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Jpg_$~k
&RRggPx"k
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 ;=: R|
@3wI(l[
例如: hRb
k-b
x={t}qDS8
限制以Publishing结尾,使用LIKE '%Publishing' Q_QmyD~m
!_E E|#`n
限制以A开头:LIKE '[A]%' EA7]o.Nm*{
wOE_2k
限制以A开头外:LIKE '[^A]%' z
6yk
4、空值判断符例WHERE age IS NULL St,IWOmq"
8B;`9?CI
5、逻辑运算符:优先级为NOT、AND、OR 7p3 ;b"'
=bs4*[zq
(四)查询结果排序 F3jrJ+nJ
nQK@Uy5Yr
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: WIO V
hJ4==ILx
ORDER BY {column_name [ASC|DESC]} [,…n] 0uzis09
gJi11^PK
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 =sRd5aMs
qTC`[l
序。 . hHt+
i_g="^
例如: 9 U1)sPH;
RL~|Kr<7J
SELECT * #W
1`vke3
[UNfft=K3P
FROM usertable
j^KM
As@~%0 S
ORDER BY age desc,userid ASC ~B>I?j
%r6LU<;1@
另外,可以根据表达式进行排序。 F<BhN+U
1w+OnJI?
JeMhiY}
,iCd6M{
二、联合查询 ]@l~z0^|[_
L6BHh_*E
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 FU!U{qDI
V5KAiG<d
合查询。UNION的语法格式为: W()FKP\??!
ERL(>)
select_statement ,8o]XFOr
R8EDJ2u#
UNION [ALL] selectstatement gv `jeN
GEA@AD=^f
[UNION [ALL] selectstatement][…n] x)G/YUv76
L3Ry#uw
其中selectstatement为待联合的SELECT查询语句。 =N<Hc:<t4
L"zOa90ig
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 b9EJLD
+>z/54R
行。 ec1snMY
8v1asFxs.
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 ]gTaTY
)_+"
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 {ZbeF#*"
~FZLA}
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 St|sUtj<r
fouy??
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 '7>Vmr6
QC4_\V>[
型,系统将低精度的数据类型转换为高精度的数据类型。 tt|U,o
0J$wX yh
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 4}580mBc
f:7Y
查询1 UNION (查询2 UNION 查询3) ++,mM7a
-2> L*"^
Uo^s]H#:
(4ow0}1
G2a fHL<
Iay7Fkv
三、连接查询 ,-] JCcH
:KX/`
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 XIBw&mWf
Ea\a:
数据库管理系统的一个标志。 m>:%[vm
ddnWr"_
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Uj k``;
5F^,7A4I0
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 NWCnt,FlY
xO1d^{~^^
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 6J%SkuxR
,)]ZD H
查询。 \`>Y
t T-]Vj.
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 "j$}'uK<
[FiXsYb.8
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 q6j]j~JxB
/unOZVr(
SQL-92标准所定义的FROM子句的连接语法格式为: lS?f?n^
ip>dHj
z
FROM join_table join_type join_table IZAbW
5R"b1
[ON (join_condition)] CdZ;ZR
W:rzfO.`Z
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 DT 9i<kl
C
2oll-kN
个表操作的连接又称做自连接。 b17p;wS
G>:l(PW:
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 #Q'i/|g
_LK>3Sqd
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 S^x9 2&!
y]?$zbB
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 =PZs'K
g LpWfT29V
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) oAvJ"JH@i
oR-_=U^
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 t9K.Jc0
|0qk
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 0-|1}/{4
H>DJ-lG(
数据行。 Ab_aB+g ]
xVl90ak
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 -\NB*|9m|
`gss(o1}
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 { @-Q1
:A[bqRqe
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ww\/$ |
"{V,(w8Dt
运算符等构成。 [dzb{M6_
A<TJ3Jp]
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ![vc/wuf
1H[lf
B
连接。例如: (|6qN
nIsi
SELECT p1.pub_id,p2.pub_id,p1.pr_info YF:NRY[i
3ZB;-F5v
FROM pub_info AS p1 INNER JOIN pub_info AS p2 H/, tE0ZV
p!Gf^
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ?` `+OH
6@I7UL >
(一)内连接 TTOd0a
Q'|cOQX
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 T|{BT!
W1E
|f>y"T+1
三种: 9*2hBNp+
!Uj !Oy
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ^mz_T+UOe
cnIy*!cJs
表中的所有列,包括其中的重复列。 %^5$=w
vuAAaKz
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 g|+G(~=e|
P&F)E#Sa
运算符包括>、>=、<=、<、!>、!<和<>。 ]&r/H17
N{q'wep
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 r+lY9l
R]V`t^1
结果集合中所包括的列,并删除连接表中的重复列。 jr9ZRHCU
3p^WTQ>(
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: d&ZwVF!
4\$Ze0tv
SELECT * /60[T@Mz
;^*^
:L
FROM authors AS a INNER JOIN publishers AS p 7H[+iS0
g
Sa ,A
ON a.city=p.city q7)$WXe2LM
dT|z)-Z`
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): NeK:[Q@je
i#-Jl7V[a
SELECT a.*,p.pub_id,p.pub_name,p.country #dl8+
ow$#kQ&R O
FROM authors AS a INNER JOIN publishers AS p @O3w4Zs
w_{z"VeD
ON a.city=p.city 7}lZa~/
NMj`wQ`M+
(二)外连接 HOUyB's'
q?MYX=Y6
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 4kz8U
&FZe LIt
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 2fLd/x~
Ke/P[fo
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 i5wA=K_
@qe>ph[UA
如下面使用左外连接将论坛内容和作者信息连接起来: 43)9iDmJ8<
)RkU='lB "
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b yNT2kB'
_cJ{fYwYU
ON a.username=b.username E8j9@BHU[r
i;tA<-$-
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 3jn@ [ m
%-*vlNC )
SELECT a.*,b.* *K98z ?
tEEhSG)s%
FROM city as a FULL OUTER JOIN user as b KW;xlJz(j
~::R+Lh(
ON a.username=b.username fwnpmuJ
Sx ~_p3_5U
(三)交叉连接 RXof$2CZS
'~f@p~P
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 Z8 # I
:E^B~ OuL
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 hKT:@l*
R5i8cjKZ?w
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 -j$l@2g
%F 4Q|
于6*8=48行。 FlgB-qR]<n
E:o:)h?$
SELECT type,pub_name D4vmBVT
/~^I]D
FROM titles CROSS JOIN publishers ?I0 i%nH
=ddx/zN
ORDER BY type