一、简单查询 ^hzlR[
)uC],CbW{
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 #qrZ(,I@n
6!dbJ5x1
表或视图、以及搜索条件等。 id<i|
SNV~;@(h
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 )Fx"S.Ok
11[[H kX@
SELECT nickname,email 7zXFQ|TP
v#0F1a?]D
FROM testtable GmP)"@O](;
y=g9 wO
WHERE name='张三' Z"#eN(v.N
l9KLP
(一)选择列表 }IO<Dq=[
)b`Xc+{>
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 +PgUbr[p
D9,609w
量和全局变量)等构成。 {*,~,iq
hr_ 5D
1、选择所有列 aDmyr_f$
wI><kdz
例如,下面语句显示testtable表中所有列的数据: NAjY,)>'K
IROX]f}r (
SELECT * 4)0 %^\p
sd9$4k"
FROM testtable gNF8&T
&IsQgS7R
2、选择部分列并指定它们的显示次序 K]ob>wPf
nwswy]e8/
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 hTcy;zLLS
9pUvw_9MY
例如: <~;; iM6
JTK>[|c9oE
SELECT nickname,email *p:`F:
kP~'C'5Ys
FROM testtable <k?ofE1o
5v <>%=
3、更改列标题 A<P3X/i
A}WRpsA9
在选择列表中,可重新指定列标题。定义格式为: xFxl9oM."
WA}<Zme3[
列标题=列名 o|Cq#JFG
u$ C@0d
列名 列标题 N`XJA-DE
D,q=?~
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 Py7!_TX
?3X!
标题: ddvSi6
ie|I*;#
SELECT 昵称=nickname,电子邮件=email $*
1?"$LN
[p[nK=&r
FROM testtable WeDeD\zy
maAZI-H{
4、删除重复行 L1=3_fO
K*iy ^}
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认
bj23S&
\Zc$X^}vN
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Vij P;
J$6h%Eyo
5、限制返回的行数 [M>Md-pj
QK _1!t3
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 88}+.-3t$
L[l?}\
表示一百分数,指定返回的行数等于总行数的百分之几。 uo0g51%9
=OfU#i"c
例如: -YM#.lQ
3 i<,#FaL
SELECT TOP 2 * r>73IpJI
_svEPHU
FROM testtable (t&]u7Atr
j.FA!4L
SELECT TOP 20 PERCENT * }
8ZCWmd
].F7.
zi
FROM testtable zRTR
HR)Dz~Obw
(二)FROM子句 Oop5bg
T=r-6eN
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, r=GF*i[3
Q#C;4)e
它们之间用逗号分隔。 _y#omEx
r~cmrLQa
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 gXr"],OM;
XMhDx
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 5/x"!Jk
Rs+rlJq
使用下面语句格式加以限定: d"3S[_U
tHNvb\MR$
SELECT username,citytable.cityid jVP70c
w-2&6o<n-
FROM usertable,citytable QZy+`
OLXkiesK{
WHERE usertable.cityid=citytable.cityid /H#- \r&r
2|'v[
在FROM子句中可用以下两种格式为表或视图指定别名: WrK!]17or
<viIpz2jh%
表名 as 别名 A
?"(5da.
_&S?uz m
表名 别名 H I/]s^aL
1I({2@C
例如上面语句可用表的别名格式表示为: 6o@}k9AN
89@\AjI
SELECT username,b.cityid !NWz
RjS;Ck@;
FROM usertable a,citytable b }~P%S(zB
fDc>E+,
WHERE a.cityid=b.cityid p7(Pymkd
.qVz rS
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 IOA"O9;
p.KX[I
例如: [6x-c;H_4
0_yE74i
SELECT a.au_fname+a.au_lname dz/'
m7
U3r[ysf
FROM authors a,titleauthor ta ( Lj{V}^
\)'nxFKqV
(SELECT title_id,title `|K,E
Z09FW>"u
FROM titles ;t47cUm6j
jvx9b([<sG
WHERE ytd_sales>10000 |\ Nj
/64jO?mp
) AS t &tY3nr
"=4`RM
WHERE a.au_id=ta.au_id HZMs],GX
QX(x6y>Q
AND ta.title_id=t.title_id $>E\3npV
"bZV<;y6
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 d
q=>-^o
l@`D;m
(三)使用WHERE子句设置查询条件 NfLvK o8
l,uYp"F,ps
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: eeIh }t>[
||v=in
SELECT * 2mL1BG=Yk
}qfr&Ffh@
FROM usertable 8Ml&lfn_8
A.7:.5Cx'
WHERE age>20 Dd|}LV
tB.;T0n
WHERE子句可包括各种条件运算符: =jD[A>3I
RAR0LKGX
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 3oX%tx
4X7y}F.J
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 9@AGx<S1
%VYQz)yW
NOT BETWEEN…AND…
1?)iCe
xw: v|(
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) .d`+#1Ot(
T=cSTS!P;q
NOT IN (项1,项2……)
{ZFa
+
$,08y
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE H3{x;{.b
:QgC Zq
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ~45u
a
E#"QaI8`
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR E
[JXQ76
m1_?xU
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 N_<sCRd]9
/H.QGPr
2、列表运算符例:country IN ('Germany','China') >JT{~SRB|Y
U`q[5U"
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 FzmCS@yA
k*|dX.C:
varchar、text、ntext、datetime和smalldatetime等类型查询。 2rHw5Wn]~
EQPZV
K/
可使用以下通配字符: iU^ 4a
Okk[}G)
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 |)6(_7e9
IV^LYu
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ^&<~6y}U^
6h>8^l
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 \Ekez~k{`
Qu]0BVIe
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 z.16%@R
H%7V)"
例如: `XYT:'
RBx`<iBe
限制以Publishing结尾,使用LIKE '%Publishing' R#~}ZUk2
G B!3`
A%&
限制以A开头:LIKE '[A]%' Gb61X6
&Pxt6M\d
限制以A开头外:LIKE '[^A]%' i=_leC)rl
/Nq!^=
4、空值判断符例WHERE age IS NULL ~J2-B2S!
V5rnI\:7
5、逻辑运算符:优先级为NOT、AND、OR ^7q=E@[e
!mBsDn(J
(四)查询结果排序 n ! qm
$N;!. 5lX3
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: &n<jpMB
|Ix6D
ORDER BY {column_name [ASC|DESC]} [,…n] N&NOh|YS
V2es.I
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 zcJ]US
G_5sF|(mq
序。 OxElvbM#
vVyO}Q`
例如: q" wi.&|
[2w3c4K
SELECT * 5!#"8|oY
el!Bi>b9c!
FROM usertable w|WZEu:0|
A`(p6 H"s
ORDER BY age desc,userid ASC V$
38
N-^\X3X
另外,可以根据表达式进行排序。 /iif@5lw{
+Smv<^bW
B2d$!Any
> 0 !J]gK
二、联合查询 UEo,:zeN[
}SitT\%
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 w%S<N
js`zQx'
合查询。UNION的语法格式为: JmNeqpbB`w
oE#HI2X
select_statement P},S[GaZ
%fP^Fh
UNION [ALL] selectstatement }#!o^B8
=)M 8>>l
[UNION [ALL] selectstatement][…n] -Kg@Sj/U}R
%W"\
其中selectstatement为待联合的SELECT查询语句。 PkDL\Nqe
x|0Q\<mEe
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 L:Wy- Z
b("CvD8
行。 4NR,"l)
miS+MK"
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 3\=8tg p
HKOJkbVZ2^
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 -Qnnzp$]
nWFp$tJ/R
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 mMN oR]
:^%soEi
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 I-/PzL<W P
y=h2_jt
型,系统将低精度的数据类型转换为高精度的数据类型。 /l(:H
q,nj|9z V
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: TeqFy( Dr
"]c:V4S#`A
查询1 UNION (查询2 UNION 查询3)
(i *1M
?[!.TU?4N
bG^eP:r
Jr17pu(t
/oiAAB27
JS(KCY 9
三、连接查询 YD@V2gK
&tMvs<q,
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 @1n0<V/
jv2l_
数据库管理系统的一个标志。 @2$PU{dH
]?``*{Zqy
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 ;k
b^mJE
ls*^3^O
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 @TgCI`E
e}[$ =
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 4]
?
oPa2GW8
查询。 )W 57n)]
d1y(Jt
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 -HoPECe
J=zZGd%
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 )>\Ne~%
(3]7[h7
SQL-92标准所定义的FROM子句的连接语法格式为: WDzov9ot
NmB0CbB
FROM join_table join_type join_table tm]75*?
.\U+`>4av
[ON (join_condition)] o{-PT'
Nq*\{rb
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 bO2$0!=I
I5x/N.
个表操作的连接又称做自连接。 &7@6Y{!/
?Fi-,4
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 @Wx_4LOhf
TqQ>\h"&_
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 0eQ5LG?)
$ ~D`-+J
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 :~T:&;q0
<[~x]-
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) Hlz4f+#I
$wN'mY
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 :eIBK
m k -"
U7;
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 v0$6@K;M4G
9MHb<~F
数据行。 hJd#Gc~*M
:nwcO3~`
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 PI{sO |
}1_gemlf
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 JpuW
!I
>Y2Rr9
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 <CA
lJ
PKjA@+
运算符等构成。 E0)v;yRcw
M/1Q/;0P
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 4&y_+
L\-T[w),z7
连接。例如: j ^_G
2iH,U
SELECT p1.pub_id,p2.pub_id,p1.pr_info #Jm_~k
k*-+@U"+
FROM pub_info AS p1 INNER JOIN pub_info AS p2 |fw+{f
{Or|] 0
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) sWX
%<
W1y
(一)内连接 a#raUF7e
8AefgjE
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 p O:
EJ
x &9I2"
三种: ?L'k2J
S>"dUM
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ,#c-"xY
5X`.2q=d
表中的所有列,包括其中的重复列。 7PisX!c,h
C&5T;=<jKO
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 y!v $5wi
@{nT4{
运算符包括>、>=、<=、<、!>、!<和<>。 Vm6^'1CY
1%-?e``.
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 MiSFT5$v6
Ab(bvS8r$
结果集合中所包括的列,并删除连接表中的重复列。 Cog:6Gnw
(+^1'?C8
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: +m+HC(Z
W:) M}}&H
SELECT * Jp=
(Q]ab
vW4f 3(/
FROM authors AS a INNER JOIN publishers AS p -_4! id
aoJ&< vl3
ON a.city=p.city {;-$;\D
gf3/ kll9
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 8wy"m=>=b}
]7VK&YfN
SELECT a.*,p.pub_id,p.pub_name,p.country /S;?M\
}Ns_RS$
FROM authors AS a INNER JOIN publishers AS p >yWJk9hf
9Q.j
<
ON a.city=p.city NKB!_R+
HFDg@@
(二)外连接 I9u=RIs
Jz|(B_U
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 xv%}xeEV
RV($G8U
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 k[zf`x^
Hv`Zc*
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 M 0"feq
lO) B/N&
如下面使用左外连接将论坛内容和作者信息连接起来: #`W8-w
R1wdQ8q
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b *Zc-&Dk:Ir
.6'T;SoK>
ON a.username=b.username 2xnOWW
$"UAJ -
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: N&ddO-r[s
xp&I~YPH
SELECT a.*,b.* 9z-"JnM
%!=YNm
FROM city as a FULL OUTER JOIN user as b x[?_F
h]=chz
ON a.username=b.username j=gbUXv/
S_QDYnF)`
(三)交叉连接 O^<6`ku
bc"{ZL!C
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 O:U@m@7
D H.ljGb
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 m:^@AR1%d
81n%2G
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 %sq=lW5R{b
#zQkQvAT9
于6*8=48行。 hlVP_h"z
NMDNls&)k
SELECT type,pub_name kQb0pfYs
U-k;kmaj
FROM titles CROSS JOIN publishers
[:k'VXL
;'Y?wH[
ORDER BY type