一、简单查询 81](T<
oin$-i|Xp!
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 nx@=>E+a
g~ZvA(`
表或视图、以及搜索条件等。 =w;F<M|Y
:Uz| 3gq
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 \O}E7-
g=39C>
SELECT nickname,email X]'{(?Ch
2I%MAb&1@
FROM testtable M.Y~1c4f
, qA(\[
WHERE name='张三' 8R2QZXJb-
Jy^u?
(一)选择列表 >5_2_Y$"
46$._h
P
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 vY4\59]P
R_(tjkT
量和全局变量)等构成。 s&A}
h
BD68$y
1、选择所有列 4 kn|^
e63uLWDT
例如,下面语句显示testtable表中所有列的数据: zxMXXm;
^2+yHw
SELECT * p%#<D9S
0x'#_G65y
FROM testtable hq%?=2'9?
%+f>2U4I
2、选择部分列并指定它们的显示次序 >,TUZ
V:qSy#e
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 vBRQp&YwX
J3,fk)
例如: !i{aMxUP
|h- QP#]/
SELECT nickname,email 0Z~p%C<LW
e7@ojOQ%
FROM testtable 0vFD3}~>
FQm`~rA~zt
3、更改列标题 Qi^Z11
<L`KzaA
在选择列表中,可重新指定列标题。定义格式为: jB`,u|FG
`rgn<I"
列标题=列名 ;LcVr13J/
9}l33T4T
列名 列标题 .>CPRVuVI
9zZr^{lUl
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ,.rs(5.z8/
!LggIk1
标题: 'L
8n-TyL
lm!.W5-l
SELECT 昵称=nickname,电子邮件=email qo p^;~
,ek_R)&[o
FROM testtable D6%J\C13`
tro7Di2Q
4、删除重复行 ?h.wK
TX$r`~
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 G]D+Sl4<7i
[f)cL6AeF
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 \!>3SKs(e
bW$J~ ynM
5、限制返回的行数 Rd2qe /
#,,d>e
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 L_vISy%\b
U[SaY0Z
表示一百分数,指定返回的行数等于总行数的百分之几。 I`p+Qt
wN`jE0
{
例如: ]j'p :v
q
]M+/sl
SELECT TOP 2 * i'4B3
J!0DR4=Xi
FROM testtable !6BW@GeF]
:ZTc7}
SELECT TOP 20 PERCENT * g,}_G3[j0m
^oVs+ vC
FROM testtable ;-9=RI0
$eD.W
(二)FROM子句 F5?m6`g?
'd.EC#
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, vtw6FX_B
=G]1LTI
它们之间用逗号分隔。 FB
_pw!z
s}j{#xT
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 A9f)tqbc
21
O'M
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 .P;*D ws
.uuO>:
使用下面语句格式加以限定: /s?r`' j[
uv=.2U46
SELECT username,citytable.cityid }E0,z
iTFdN}U
FROM usertable,citytable )0ea+ib
;gBRCZ
WHERE usertable.cityid=citytable.cityid 0*rQ3Z
.$Ik`[+Z
在FROM子句中可用以下两种格式为表或视图指定别名: (&}i`}v_
\]%6|V
表名 as 别名 qDv93
)>.&N[v
表名 别名 sArhZ[H
}R1<
0~g
例如上面语句可用表的别名格式表示为: s>0't
T,]7ICF#
SELECT username,b.cityid j/>$,
$>GgB`
FROM usertable a,citytable b p;._HJ(
|(pRaiJ
WHERE a.cityid=b.cityid %<E$,w>
XM1WfjE\
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Z3{>yYR+
dls
ss\c^M
例如: 1y-y6q
/4c\K-Z;
SELECT a.au_fname+a.au_lname
Jd%H2`
LJ*q 1
;<E
FROM authors a,titleauthor ta 86(I^=
I|>^1kr8w
(SELECT title_id,title e?opkq\f
dQ_!)f&w1
FROM titles ~V&aUDO>/
F{EnOr`,m=
WHERE ytd_sales>10000 TR<<+
k%D+Y(WGz8
) AS t R($KSui
|p><'Q%*
WHERE a.au_id=ta.au_id dik:4;
@n(Z$)8tR
AND ta.title_id=t.title_id dE:+k/
^~G8?]w
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ZkA U17f
&GlwC%$S
(三)使用WHERE子句设置查询条件 5!l0zLQPo
_{r=.W+w
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: @c<3b2
<z]cyXv/
SELECT * J13>i7]L%
aemc2b*
FROM usertable <4_X P.N
5#> 8MU?&
WHERE age>20 LM}Ib.
`|,`QqDQ
WHERE子句可包括各种条件运算符: HR
;)|j{!
aCQ?fq
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< T(e!_VY|m
3T"j)R_=l
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 2C/$Ei^t
/h*>P:i].
NOT BETWEEN…AND… P^w#S
Z2TL #@
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) kB'Fkqwm
HvM)e.!
NOT IN (项1,项2……) U}MXT<6
cJ1#ge%4
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 31rx-D8o
3H|_mX
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL bKrhIU[
D+]a.& {p
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR zY|t0H
`0P$#5?
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 GG@md_
s}jHl8
2、列表运算符例:country IN ('Germany','China') F'B8v3
:lB=Lr)
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 6
G3\=)
'h^0HE\~p
varchar、text、ntext、datetime和smalldatetime等类型查询。 MxGu>r
}z\_;\7
可使用以下通配字符:
KnsT\>[K
J(c{y]` J
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 YN`H
BFH
A-4h
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 cfcim.jB
_Y8hb!#(
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 po$ /7
O
[i#9)
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 JMH8MH*
rb1`UG"h$
例如: >TQH|}|6(y
e pU:
限制以Publishing结尾,使用LIKE '%Publishing' ))&;}2{
#a`a$A
限制以A开头:LIKE '[A]%' 0KGY\,ae:;
(N&lHLy
限制以A开头外:LIKE '[^A]%' Xlb0/T<g!
.Fnwm}
4、空值判断符例WHERE age IS NULL 1jc,
Y.mP
yqi^>Ce0
5、逻辑运算符:优先级为NOT、AND、OR WHjUR0NZ
R}lsnX<
(四)查询结果排序 [P 06lIO
Z\HX~*,6
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: `FsH}UPu
b
!<SA6m#
ORDER BY {column_name [ASC|DESC]} [,…n] 0&/b42W
;PjQt=4K
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 &2 `F n!m
q|8{@EMT
序。 tQH+)*
%*&UJpbA
例如: o>7ts&rk
U2`'qsR1
SELECT * Q5FM8Q
^my].Qpt
FROM usertable d1U\ft:gV
!!Aj<*%
ORDER BY age desc,userid ASC ~ug=
{b
Nkp)Ax&
另外,可以根据表达式进行排序。 ik!..9aB
"
t7M3i_
.!G94b
xA9:*>+>
二、联合查询 >lBD<;T
z}{afEb
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 #{=;NuP
x-?{E
合查询。UNION的语法格式为: DSt]{fl`P
nzmDA6d
select_statement !OT-b>*w
:dLAs@z
UNION [ALL] selectstatement PSPmO'C+
wlEdt1G
[UNION [ALL] selectstatement][…n] \[jq4`\$
D5:{fWVsV/
其中selectstatement为待联合的SELECT查询语句。 7}vg.hmZ
s%2v3eb
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 L3n_ 5|
L5qwWvbT
行。 -.T&(&>^
u-tQ9ioKC
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 L~ IhsiB
h+a S4Q&
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 M?[h0{^K
^b 7GH9<&
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 rtL}W__
^|TG$`M(w
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 xCYE
B}o9r
$d,0=Ci
型,系统将低精度的数据类型转换为高精度的数据类型。 lhtZaU~V
c wOJy>
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: (sQr X{~
bk)g;+@
查询1 UNION (查询2 UNION 查询3) 'sxNDnGg
{'AWZ(
59#lU~Kv
($LLl;1
5ux`U{`m
me'd6!O9-
三、连接查询 2KQoy;
cZ<A0
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ONCnVjZ
YSj+\Z$(
数据库管理系统的一个标志。 2hee./F`
wN2QK6Oc
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 O)Y?=G)
3;8!rNN
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ZvUCI8
#rY sj-2
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 HU9Sl*/
)x]3Zq
查询。 F* .g;So
sYdRh?Hq
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 |=EZ1<KzD
{O+Kw<d
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 zLF?P3^
m~dC3}e8/?
SQL-92标准所定义的FROM子句的连接语法格式为: 8@PX7!9
+n7?S~R$
FROM join_table join_type join_table l27\diKPJ
1]}#)-
[ON (join_condition)] Y2O"]phi@
;/0 Q1-
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 lhi_6&&[8
fPR$kch
个表操作的连接又称做自连接。 9{$'S4
HFq m6|
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 4<x'ocKlD
/'hC i]b@v
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 \T;\XAGr
ru`U'
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 9W8]8sUeG
%J8|zKT5t
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) @?[1_g_'P
!=y]Sv~h
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 rLU/W<F8
A"aV'~>
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Dk='+\
sO5?aB&
数据行。 J-ePE7i
o=RM-tR`v
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 q|%(3,)ig
'oN\hy($,h
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 2>\v*adG
}/,HM9Ke
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 1pCieTz!PN
1lsLJ4P
运算符等构成。 gaf$uT2
@A+RVg*=
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ex<O]kPFE
+`sv91c
连接。例如: gt\MS;jMa
:d8W+|1u
SELECT p1.pub_id,p2.pub_id,p1.pr_info a,o_`s<
{,cCEXag%
FROM pub_info AS p1 INNER JOIN pub_info AS p2 <jS~ WI@
tV9LD>3
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ](B@5-^
$O{duJU
(一)内连接 @vMA=v7a
kqb0>rYa
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 9
C{;h
4G@nZn
三种: _Cw:J|l.
zd_HxYrN
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 X]loJoM9
| ea~'N1
表中的所有列,包括其中的重复列。 }dxDtqb
Bk}><H
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 dtPoo\@
JxjI]SF02
运算符包括>、>=、<=、<、!>、!<和<>。 xvNo(>
f/kI|Z
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 \*\R1_+
Gd+ET
结果集合中所包括的列,并删除连接表中的重复列。 1shBY@mlq
WU4U Zpz
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: \ j.x0/;
zKFp5H1!%+
SELECT * eh*6cQ.0
Eh|.
FROM authors AS a INNER JOIN publishers AS p K\^ 0_F K
l/y]nw
ON a.city=p.city 0GDvwy D1
m uW!xY
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): Ro=AADv@
$ \*`
}Y
SELECT a.*,p.pub_id,p.pub_name,p.country |xoF49
Cv)/7vyB8
FROM authors AS a INNER JOIN publishers AS p (]*H[)F/
q4UA]+-*
ON a.city=p.city =N);v\ Q$!
O9(r{Vu7u
(二)外连接 jxgj,h"}9`
GFk1/ F
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 zciCcrJ
.bD_R7Bi6
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 -S%x
wJKM
+fKtG]$
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 )R_E|@"
K~RoUE<3[
如下面使用左外连接将论坛内容和作者信息连接起来: /?/#B `
QMo}W{D
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b qW_u
X~Rl 6/,
ON a.username=b.username S>q>K"j^!
H ftxS
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: !5}l&7:(MN
?@6/Alk
SELECT a.*,b.* |DF9cd^
iv(5&'[p
FROM city as a FULL OUTER JOIN user as b "tS'b+SJ-S
r'BAT3
ON a.username=b.username 'j%F]CK
#kkY@k$4
(三)交叉连接 RE 3Z%;'
2h
{q h
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 E3/:.t
;oH,~|K
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 9H]_4?aX
D~K;~nI
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 Ap\AP{S4
rAQF9O[
于6*8=48行。
,%#
EA<}[4#jS
SELECT type,pub_name Uf*EJ1Ei
n,M)oo1G
FROM titles CROSS JOIN publishers ^4v*W;Q
T_<BVM
ORDER BY type