一、简单查询 iq8Hq)I]
{gDoktC@M
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 w%6 L"
*iPBpEWC
表或视图、以及搜索条件等。 d+8|aS<A
[t5D d
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 )hK;27m4
UC00zW<Z@"
SELECT nickname,email 3+M+5
f-}_
FROM testtable >Y:veEa6v6
9!D
c=
WHERE name='张三' :{Iv
]d
jwwst\f
(一)选择列表 eN<?rVZl
$')Uie<!8
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 cavzXz
4&`d$K
量和全局变量)等构成。 T=pKen/
2&F H8
1、选择所有列 uv7tbI"r
+2s][^-KV
例如,下面语句显示testtable表中所有列的数据: z}7U>y6`
E `%*lGu_
SELECT * LQ"xm
H.2aoZ-w
FROM testtable m W4tW
v(jZ[{x@
2、选择部分列并指定它们的显示次序 @Z9>E+udQ
}iB>3|\
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 <>=abgg
twPD'X!r
例如: \3j4=K'nE
l-[5Zl;"
SELECT nickname,email @#5?tk0
-kzg(+sm
FROM testtable 3HX-lg`0
hXn@vK6
3、更改列标题 S'AS,'EnY
Vjr}"K$Y
在选择列表中,可重新指定列标题。定义格式为: '[[*(4a3
[8`^_i=#
列标题=列名 V%J_iY/BUb
#w)D ml
列名 列标题 O'W[/\A56M
2fdC @V
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 5|oi*b
yrrP#F
标题: Y2y =
P
]i'gU(+;`
SELECT 昵称=nickname,电子邮件=email I%ZSh]On
"eKM<S
FROM testtable BH?fFe&J:`
K%>3ev=y.s
4、删除重复行 p{rzP,Pb&
*3!ixDX[r
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 a[V4EX1E
i}ti
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 LGC3"z\=
AjO|@6
5、限制返回的行数 ot,e?lF
f1/if:~6
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 At8^yF
xo(3<1mD
表示一百分数,指定返回的行数等于总行数的百分之几。 p/&s-GF
d0 yZ9-t
例如: %@[ ~s,6<
CLY>M`%?+p
SELECT TOP 2 * 1`EkN0iZ
fmk(}
FROM testtable @)S d3xw[
*
n>YS
SELECT TOP 20 PERCENT * BQ77n2(@
tumYZ)nW
FROM testtable P;lDri
>]l7AZ:,
(二)FROM子句 u=!n9W~"
<o&\/uO~H
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, $PKUcT0N9
Wwo`R5
它们之间用逗号分隔。 uF\f>E)/N%
$T}Dn[.
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 %KmhR2v
{DGnh1
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 *[wj )
~px)Jd
使用下面语句格式加以限定: WzO[-csy
n%:&N
SELECT username,citytable.cityid ;"DI)hdz
Yu9.0A_) :
FROM usertable,citytable "Bbd[ZI8
{}v<2bS
WHERE usertable.cityid=citytable.cityid RB/;qdqR
2o9IP>#u
在FROM子句中可用以下两种格式为表或视图指定别名: HpTX6}^
FPXB>D'
表名 as 别名 yM*<BV
Sc3 B*.
表名 别名 W2j@Q=YDS
GF awmNZ
例如上面语句可用表的别名格式表示为: a'A'%+2
$ &fm^1
SELECT username,b.cityid ;CdxKr-d
M/a5o|>8
FROM usertable a,citytable b fIg~[VN"
Av^<_`L:
WHERE a.cityid=b.cityid k8ej.
A**PGy.Ni
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Q?TXM1Bp
~l>2NY
例如: w`r)B`!g
#`{L_n$c
SELECT a.au_fname+a.au_lname j+>&~
?;)F_aHp
FROM authors a,titleauthor ta :~+m9r
w?zY9Fs=s
(SELECT title_id,title K
yFR;.F-
B< BS>(Nr>
FROM titles 14;lB.$p
Wc-8j2M
WHERE ytd_sales>10000 XP!7@:
Pi:=0,"XOp
) AS t xSoXf0zq:
W0>fu>
WHERE a.au_id=ta.au_id )MJy
GjvTYg~
AND ta.title_id=t.title_id (dVrGa54
:#zv,U&OC
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 /N82h`\n
0I@Cx{$
(三)使用WHERE子句设置查询条件 ac??lHtH9
+zn207.`
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: @&M$oI$4*
O/2Jz
SELECT * i7(\i2_P
C1KO]e >
FROM usertable -$m?ShDd
^L;k
WHERE age>20 jW!)5(B[A
&SE+7HXw
WHERE子句可包括各种条件运算符: 5!)_"u3
!2Q>
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< |;6l1]hk6
K~JXP5`(
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… MW6KEiQ"
@:"GgkyDl#
NOT BETWEEN…AND… koAM",5D
[v$NxmRu
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) #[{xEVf
mjz<,s`D
NOT IN (项1,项2……) bP ,_H
%!e;sL~&
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE $1$T2'C~+
;BMm47<
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL F"M$ "rC]
+O,h<*y
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR !%{s[eO\
jB-)/8.qk
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 CD+2
w
cy
h8lI#Gs
2、列表运算符例:country IN ('Germany','China') v/B:n
rv?d3QqIC
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 {l -V
v
lsS
varchar、text、ntext、datetime和smalldatetime等类型查询。 Z'I0e9Jw
!p~K;p,
可使用以下通配字符: @)YQiE$
XUyoZl?
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 a\PvRW*I
\7Fkeo+
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 E5b JIC(
pD>^Dfd
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 d@72z r
^BFD -p
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 0fTEb%z8
(\6R"2
例如: dnP3{!"b
_("&jfn
限制以Publishing结尾,使用LIKE '%Publishing' ?w[M{
YQ+Kl[ec
限制以A开头:LIKE '[A]%' 8>|@O<2\
KVrK:W--p
限制以A开头外:LIKE '[^A]%' mTW@E#)n
Kc:}
K y
4、空值判断符例WHERE age IS NULL %g>{m2o
pH1 9"=p<
5、逻辑运算符:优先级为NOT、AND、OR 20t</lq.
Hf'yRKACj
(四)查询结果排序 @Sl!p)
t!Uc,mEV]
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 9#;UQ.qA
igW>C2J
ORDER BY {column_name [ASC|DESC]} [,…n] 3[jk}2R';p
^:RDu q
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Nh[{B{k
[}OL@num
序。 *ppb4R;CW
;#$zHR
例如: \O7?!i
> HL8hN'q'
SELECT * =/Dp*
!I? J^0T
FROM usertable PUN.nt
D=fB&7%@
ORDER BY age desc,userid ASC (qP !x 2j
0P_Y6w+
另外,可以根据表达式进行排序。 nAp7X-t
4D/mm(2d$
>)N}V'9
Mlpq2I_x
二、联合查询 _5nQe
!
"F+Wo&
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 "Jp6EL%
!!c.cv'
合查询。UNION的语法格式为: Ik#>6
TLL.Ch|#Y
select_statement e< Ee2pGX
Z6cG<,DQ
UNION [ALL] selectstatement Te{L@sj
^j2:fJOU#
[UNION [ALL] selectstatement][…n] $Q:5KNF+p
7<=7RPWmD
其中selectstatement为待联合的SELECT查询语句。 iDO~G($C
"*@iXJxv5
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 e;=G|E
b* 6c.
行。 XU0"f!23x
;D/'7f7.}
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 t3/!esay
azB~>#H~
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 n^/,>7J
]T+.kC
M
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 >NE]TZ.F
fxLhVJ"b
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 `,(1'
LwUvM
型,系统将低精度的数据类型转换为高精度的数据类型。 (D8'qx-M
!qH=l-7A
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: MjU>qx::
)`rC"N)
查询1 UNION (查询2 UNION 查询3)
=*'X
$gZ|=(y&r
1F5F2OT$8
eT+MN`
5b B[o6+
"VWxHRVg4M
三、连接查询 s=huOjKL]
+V|]:{3W
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 /$rS0@p
@fpxGMy&
数据库管理系统的一个标志。 "`:#sF9S
)m[!HE`cZ
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 PyHE>C%
d*3R0Q|#{
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 cf@#a@7m9
qRB7I:m-Wi
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 7k3":2:
B0Z~L){i
查询。 /KKX;L[D(
v *:m|wl
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 A|>a
Gy
wCvD4C.WH
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 kX1hcAa
zMrZ[AU
SQL-92标准所定义的FROM子句的连接语法格式为: t*Q12Q
fWm;cDM
H
FROM join_table join_type join_table PfrW,R~r
ij hMJ?3
[ON (join_condition)] {/7'uD\
H
Mdwh-Cis/
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 !s)2H/KM 8
>5 5/@+^
个表操作的连接又称做自连接。 Q)a*bPz
*rEW@06^\
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 iCx'`^HnP
g1J]z<&
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 f\(K ou$
jv0e&rt
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 P6=|C;[
>Ft jrEB
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) `ZefSmb
0XozYyq
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 V,M8RYOnC!
_X.M,id
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Ar'5kPzY>
.Yu,&HR
数据行。 d&'6l"${
50H [u|
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 oW+R:2I~O
FySK&
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 orU4{.e
1g/mzC
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 qbAoab53
A`r&"i OKA
运算符等构成。 Y2$%%@
3]VTQl{P
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 t1~*q)!Mo
P7Y[?='v
连接。例如: \|&5eeE@
2C8M1^0:Z
SELECT p1.pub_id,p2.pub_id,p1.pr_info $K
G?d>wx
*@Qt*f
FROM pub_info AS p1 INNER JOIN pub_info AS p2 v^E5'M[A
oL6_Ya
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) RZ.5:v6
)US)-\^
(一)内连接 nEn2!)$
Aio0++r-
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 "iydXV=Q
%Bo Jt-v
三种: o4Ba l^=[
W@0(Y9jdg
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 '",5Bu#C
0CN.gu
表中的所有列,包括其中的重复列。 \m.{^Xd~
0bd.ess
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 0s4j>
?D~uR2+Z
运算符包括>、>=、<=、<、!>、!<和<>。 PHOW,8)dZh
WMC6dD_6e
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 4v?S`w:6
{l1;&y?
结果集合中所包括的列,并删除连接表中的重复列。 hmi15VW
[j/-(?+
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: (nzzX?`nY
~p 1y+
SELECT * r:o!w7C:a
\4&g5vE
FROM authors AS a INNER JOIN publishers AS p 6Rt pB\hq
'\;tmD"N5#
ON a.city=p.city 9(I4x]`
[gE2lfaEy
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
~.Gk:M
f[ywC$en
SELECT a.*,p.pub_id,p.pub_name,p.country 1GNAx\(
SVHtv0Nx
FROM authors AS a INNER JOIN publishers AS p F`N*{at
2-6-kS)c
ON a.city=p.city O|/tRkDMP{
lDA%M3(p
(二)外连接 ~& l`"
3A9|{Vaz+6
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 qjFgy)qV
Yk5kC0B
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 bd9c/>&
s0h)~z
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 0'<S7?~|
$pKS['J0
如下面使用左外连接将论坛内容和作者信息连接起来: BZBsE
:(F
JSL 3.J
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b &0"`\~lA
+(<f(]bG
ON a.username=b.username TvP# /qGgG
*Zvw&y*
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: R}]FIu
|
jkmh6
SELECT a.*,b.* nk{1z\D{
ZAP+jX;
FROM city as a FULL OUTER JOIN user as b
1Li@O[%X<
v$c D!`+k
ON a.username=b.username Ob6vg^#
ibq@0CR
(三)交叉连接 rx"zqm9 }u
~:@H6Ke[
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 4j*}|@x
WAEKvM4*i0
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 qRFN@ID$
:s5g6TR
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 O<hHo]jLF
3,[2-obmi
于6*8=48行。 pA2U+Q@
j0GI[#
SELECT type,pub_name |bk*Lgkzw
U!5@$Fu
FROM titles CROSS JOIN publishers anvj{1
@.{
ORDER BY type