一、简单查询 K:M8h{Ua
y7{?Ip4[
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 LD?sh"?b
l] vm=7:
表或视图、以及搜索条件等。 _aphkeqd
xk5]^yDp
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 jdN`mosJ
YUb_y^B^
SELECT nickname,email 4| f*eO
Y2TtY;
FROM testtable ,6/V"kqIP
TC('H[
]
WHERE name='张三' b>W%t
s"|Pdc4
(一)选择列表 V#HuIgf-
\['Cj*e k
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 /FII07V
# _1`)VS
量和全局变量)等构成。 )BE1Q*=
n
aXVFc5C\
1、选择所有列 (:_$5&i7
t1".0
例如,下面语句显示testtable表中所有列的数据: baasGa3}s
ks tIgcI
SELECT * ?< />Z)
3Vwh|1?
FROM testtable x2EUr,7
F
[M,]?
2、选择部分列并指定它们的显示次序 }k0_5S
siaG'%@*r
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 Gt1U!dP
PCvWS.{
例如: !if
_$'ashF
SELECT nickname,email /z!%d%"
}C:r9?T
FROM testtable \bF{-" 7.
H|*m$|$,
3、更改列标题 [
3Gf2_
7_L;E~\
在选择列表中,可重新指定列标题。定义格式为: a#4?cEy
bOB\--:]
列标题=列名 }EPY^VIw
[GR;?R5
列名 列标题 _w{Qtj~s|
KXy6Eno
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 $`c:&
1x)J[fyId
标题: sx%[=g+<2(
D-c4EV
SELECT 昵称=nickname,电子邮件=email PsYpxNr
AdEMa}u6
FROM testtable
2iOV/=+
3Ul*QN{6
4、删除重复行 uD'6mk*
n]9$:aLZ
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Ey2^?
VRMXtQ*1Dm
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 E.TAbD&5(
,2q-D&)\Z
5、限制返回的行数 &HW9Jn
O?2DQY?jT
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 tc! #wd+u
uYN`:b8
表示一百分数,指定返回的行数等于总行数的百分之几。 WLT"ji0w2
#4PN"o@
例如: w}KkvP^
6'/ #+,d'
SELECT TOP 2 * _U(
Nc`L;CP
FROM testtable [6fQ7uFMM8
=euni}7a
SELECT TOP 20 PERCENT * +rd+0 `}C
V&5wRz+`W
FROM testtable = [E
8=l%5r^cq
(二)FROM子句 cr3^6HB
,prf;|e?
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, XTyxr
u_enqC3
它们之间用逗号分隔。 b;n[mk
J zl6eo[;
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 T[gv0|+
]DcFySyv
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 HtFDlvdy]
$Yq9P0Ya
使用下面语句格式加以限定: aOp\91
wT@og|M
SELECT username,citytable.cityid icgfB-1|i
b9krOe*j
FROM usertable,citytable S'" Df5
6Oq7#3]
WHERE usertable.cityid=citytable.cityid UNYqft4
#e"[^_C@!
在FROM子句中可用以下两种格式为表或视图指定别名: Da|z"I
x
mt
.sucT
表名 as 别名 @]j1:PN-
lN@o2QX
表名 别名 ^c|/*u
iTwm3V
P
例如上面语句可用表的别名格式表示为: ;pAK_>
)GpK@R]{
SELECT username,b.cityid d=(mw_-?
LoV<:|GTI
FROM usertable a,citytable b occ7zcA
]Um/FA W
WHERE a.cityid=b.cityid jd:6:Fm
R&&4y 7
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 A^g(k5M*
%EH)&k
例如: F5<Hm_\:
V0@=^Bls
SELECT a.au_fname+a.au_lname e+WNk
2
Vr}'.\$
FROM authors a,titleauthor ta l#o
~W`
.A|udZ,
(SELECT title_id,title )5,v!X)
=bOW~0Z1
FROM titles {c'lhUB
]Ze1s02(
WHERE ytd_sales>10000 0B2t"(&
4x34u}l
) AS t %J(:ADu]
W\3X=@|u)
WHERE a.au_id=ta.au_id 9{l}bu/u
dPlV>IM$z
AND ta.title_id=t.title_id T)/eeZ$
FPz9N@M%Q
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 FrS]|=LJhX
Ui~>SN>s
(三)使用WHERE子句设置查询条件 1}x%%RD_
oR'm2d ^
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: b6bHTH0
(QEG4&9
SELECT * +7Gwg
@ Y+oiB~Y
FROM usertable -w2/w@&
01]f2.5
WHERE age>20 K-v#.e4
us-L]S+lm
WHERE子句可包括各种条件运算符: B#A6v0Ta
-@'FW*b
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Lbgi7|&
.v
K-LHs
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Q,g\
7Q 3 k7
NOT BETWEEN…AND… m
O_af
y29m/i:
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) Oketwa
2y4bwi
NOT IN (项1,项2……) i!Ba]n
f*Hr^b}`8
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE K(4_a``05
=_CzH(=f#
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL "oyo#-5z
&ZO0r ^
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR _a, s
)
F?0Ykjh3
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 OUnA;_
pa+hL,w{6
2、列表运算符例:country IN ('Germany','China') :OT&
M\j.8jG
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 E.h*g8bXe
0GwR~Z}Z
varchar、text、ntext、datetime和smalldatetime等类型查询。 6tZI["\
CIWO7bS
可使用以下通配字符: !
nx{
X
0GL M(JmK
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 ~%oR[B7=|
Eci\a]
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 P55fL-vo|}
>P(.:_^p
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 kh<2BOV
?,/ }`3Vw
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
(3e2c
kJU2C=m@e2
例如: " bG2:
6BlXLQ,8q
限制以Publishing结尾,使用LIKE '%Publishing' JF]JOI6.e
sOY:e/_F
限制以A开头:LIKE '[A]%' A/(a`"mK|'
;uW FHc5@B
限制以A开头外:LIKE '[^A]%' ib m4fa
(7Qo
4、空值判断符例WHERE age IS NULL %b0*H_ok7
Jm@oDME_E
5、逻辑运算符:优先级为NOT、AND、OR 4H/OBR
SbZ6t$"
(四)查询结果排序 st*gs-8jJ;
/Oono6j
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Ri'n
]~-r}`]
ORDER BY {column_name [ASC|DESC]} [,…n] XppOU
ZCw]m#lS
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 e20-h3h+
{
w_e9W bi
序。 ]:;&1h3'7
}H4RR}g
例如: 'w/hw'F6
]9-\~Mwh
SELECT * al0L&z\
XW9!p.*.U
FROM usertable ,4rPg]r@
nN;u,}e
ORDER BY age desc,userid ASC zs;JJk^
a*;b^Ze`v
另外,可以根据表达式进行排序。 (H]AR8%W
*Ex|9FCt$
1YA% -~
;S{(]K7i
二、联合查询 '-6~tWC~7
%y@AA>x!
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 g0H[*"hj
2c}E(8e]
合查询。UNION的语法格式为: Rcv9mj]l
<3iMRe
select_statement 0(Ij%Wi,
k9R9Nz|J
UNION [ALL] selectstatement a.'*G6~Qgw
^.tg 7%dJ
[UNION [ALL] selectstatement][…n] b6[j%(
z#N@ 0R
其中selectstatement为待联合的SELECT查询语句。 3T
9j@N77
-&f$GUTJ
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 |{;G2G1[
s{++w5s
行。 VQI3G
K,]=6Rj
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 N [@?gFtT
Vi}_{
Cy
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 g`^x@rj`E
<#.g=ay
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 mmsPLv6
wBzC5T%,
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 67TwPvh
>/\'zi]L
型,系统将低精度的数据类型转换为高精度的数据类型。 Si,6o!0k
{*KEP
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ?upM>69{
H]!"Zq k
查询1 UNION (查询2 UNION 查询3) >p/`;Kq@
51u0]Qx;fm
Bt#N4m[X*|
#g=XUZ/"
V]N?6\Op
Qd6F H2Pl
三、连接查询 *VeRVaBl
=xrv~
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 E9}C #
zQA`/&=Y
数据库管理系统的一个标志。 HDKbF/
tDo"K3
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 fnY.ao1-s[
+#By*;BJ
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 vy/-wP|1
]9XDS[<2`
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 h~26WLf.
:EH=_"
查询。 /bEAK-
:KN-F86i
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于
7.T?#;'3
C?Ucu]cW
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 X.V~SeS
=EIkD9u
SQL-92标准所定义的FROM子句的连接语法格式为: $N\Ja*g
mTh]PPo
FROM join_table join_type join_table ccnK#fn v
C>~TI,5a3
[ON (join_condition)] /> Nt[o[r
xpI wrJO
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 R4@6G&2d>
^(<f/C)i
个表操作的连接又称做自连接。 @KA4N`
V:27)]q
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ]~%6JJN7
2Hdu:"j
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ]d`VT)~vje
*dF>_F
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 OH"XrCX7n
e%6QTg5#
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) &?vgP!d&M
i&k7-<
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 s7EinI{^
L(o15
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 e*!kZAf
V,9cl,z+
数据行。 <X5fUU"+U
4sM.C9W
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 Mq8L0%j
aP`P)3O6)1
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ?}7p"3j'z
<| &Npd'
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 66 Tpi![
7?t6UPf
运算符等构成。 ? q&T$8zc4
Gy)@Is9
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 '2O\_Uz
p8Q1-T3v
连接。例如: aoTP[Bp
f-2c0Bi
SELECT p1.pub_id,p2.pub_id,p1.pr_info 1U\z5$V
"mNq&$
FROM pub_info AS p1 INNER JOIN pub_info AS p2 ^t"'rD-I
FN;^"H
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) <t,x RBk
ZB&6<uw
(一)内连接 ETLD$=iS
oRzi>rr
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 c|1&lYal;
|)81Lz
三种: {iLT/i%
s{" 2L{,$
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 yEoV[K8k
JCaOK2XT;
表中的所有列,包括其中的重复列。 W%)Y#C
9/7u*>:
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 cAc@n6[`3
N&pCx&
运算符包括>、>=、<=、<、!>、!<和<>。 ?s _5&j7
ASfaX:ke
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ]~nKK@Rw
:aQt;C6Z>
结果集合中所包括的列,并删除连接表中的重复列。 m6djeOl
UDni]P!E
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: l+R+&b^
y Wya&|D9
SELECT * gO^gxJ'0t
=ruao'A
FROM authors AS a INNER JOIN publishers AS p 9C\Fq-
'7@R7w!E4H
ON a.city=p.city Q|L~=9
wT\49DT"7
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): j+(I"h3
_~
&iq1
SELECT a.*,p.pub_id,p.pub_name,p.country <9%R\_@$H
g[t [/TV
FROM authors AS a INNER JOIN publishers AS p * H9 8Du
V_:&S2j
ON a.city=p.city :h V7>
rr
S@Hf
&hJ
(二)外连接 |W\(kb+
?rup/4|
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 3&/Ixm:
${)b[22":
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 #=v~8
9M9?%N:ra
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 (khL-F
F:l%O#V
如下面使用左外连接将论坛内容和作者信息连接起来: uH-)y,2&
BCcjK6'
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b h=%_Ao<x
7`YEH2
ON a.username=b.username lPJ\-/>$z
l$'wD hN*
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: EyLu O-5
FEVlZ<PW3I
SELECT a.*,b.* Wr5V`sM
{>%&(
FROM city as a FULL OUTER JOIN user as b ~WN:DXn
BX^tR1
ON a.username=b.username sse.*75U
$a%MOKr
(三)交叉连接 M|[o aanY'
t. '!`5G
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 }#E[vRf
N"y)Oca{
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 _{Hj^}+$
*~H Sy8s
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 Y)a^(!<H<
evJ.<{M
于6*8=48行。 pXK^Y'2C!
&yol_%C
SELECT type,pub_name vI)LB)Q
C{bgkzr
FROM titles CROSS JOIN publishers ,'iE;o{Tu
gRT00
ORDER BY type