一、简单查询 _&dGo(B
p O:
EJ
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 x &9I2"
<c\aZ9+V
表或视图、以及搜索条件等。 B]Zsn`n
LG,RF:
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ^
1J;SO|
n:#ji|wM
SELECT nickname,email C&5T;=<jKO
y!v $5wi
FROM testtable @{nT4{
+- .BF"}
WHERE name='张三' 1%-?e``.
MiSFT5$v6
(一)选择列表 <4O=[Q 5S
mR0@R;,p
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 .
}=;]=
3)3'-wu
量和全局变量)等构成。 %hTe%(e
_X]?
1、选择所有列 |/<iydP
m.^6ef
例如,下面语句显示testtable表中所有列的数据: #);
6+v
ZDVaKDqZ_
SELECT * .4^Paxz
>Y\4v}-
FROM testtable st+Kz uK
Br yMq !
2、选择部分列并指定它们的显示次序 He]F~GXP
ntF(K/~Y
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 #JW1JCT
EAq >v
t83
例如: 1gt[_P2u
&c\8`# 6
SELECT nickname,email {==Q6BG*
qkBnEPWZy
FROM testtable ZO;]Zt]
v$mA7|(t!
3、更改列标题 ~cZ1=,P
CY7REF
在选择列表中,可重新指定列标题。定义格式为: v(t&8)Uu
|
'z)RFqj
列标题=列名 m#S ZI}
:qT>m
列名 列标题 my} P\r.
L`Ic0}|lzy
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 Z7f~|}
d@l;dos),
标题: ILVbbC`D
X:e'@]Z)?
SELECT 昵称=nickname,电子邮件=email J`V6zGgW
1U9iNki
FROM testtable UG!&n@R
Mr1pRIYMd
4、删除重复行 (%r:PcGMEV
xj~6,;83xR
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 WkO .
I3L1|!
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 x[?_F
wXZ-%,R-D
5、限制返回的行数 ::5-UxGL<2
P#0_
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 FE5R
^W#u-
y%GV9
表示一百分数,指定返回的行数等于总行数的百分之几。 MUo?ajbqOd
~ACB#D%
例如: >Y,7>ahyt
*PI3L/*
SELECT TOP 2 * #2MwmIeA
h\dIp`H
FROM testtable
h!Q>h7
_AO0:&
SELECT TOP 20 PERCENT * lu{}j4
:#L B}=HQ
FROM testtable dHu]wog
>2|#b
(二)FROM子句 &B.r&K&
980+Y
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ^*r${Nj
'|cuVxcE55
它们之间用逗号分隔。 B8nXWi
q"cFw${
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 t"L:3<U7
2KG j !w
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 *H$nydQ:
W`\H3?C`xQ
使用下面语句格式加以限定: F;ZLoG*U
yjpjJ
SELECT username,citytable.cityid G]S E
A
V4"AFArI
FROM usertable,citytable .dygp"*
4a 5n*6G!
WHERE usertable.cityid=citytable.cityid >}I}9y+
}+B7C2_\
在FROM子句中可用以下两种格式为表或视图指定别名: =#u2Rx%V
h1Lp:@:|
表名 as 别名 \uYUX~}i"
$-y+97
表名 别名 646yeQ1
m<yA]
';s
例如上面语句可用表的别名格式表示为: J8%|Gd0#4
IQ_0[
SELECT username,b.cityid Cjh&$aq
P]TT
FROM usertable a,citytable b 01dx}L@hz
EvYw$j
WHERE a.cityid=b.cityid <Kh\i'8
ZJ4"QsF
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Y[H_?f=;%
.xx#>Y-\
例如: Cam}:'a/`
%pt$S~j
SELECT a.au_fname+a.au_lname 4/jY;YN,2
}}2kA
FROM authors a,titleauthor ta pFK
|4u
(kHR$8GFM
(SELECT title_id,title `%=Jsi0.Nq
bXW)n<y
FROM titles J.&q[
sH]AB=_
WHERE ytd_sales>10000 *HC8kD a%$
e%P;Jj476
) AS t {,
|"Rpd
`~}7k)F(
WHERE a.au_id=ta.au_id bDkE*4SRX
8 N` $7^^
AND ta.title_id=t.title_id UVLcR
=?lT&|"
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 5B2,=?+o
Yyo|W;a]
(三)使用WHERE子句设置查询条件 z>{KeX:
d3$<|mG$
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Lr^xp,_ n
W>~%6K>p
SELECT * H>]z=w~
Pjy?&;GvT
FROM usertable A)#sh)
}Q
!$?@;}=
WHERE age>20 c>R(Fs|6
(w-u"1&
WHERE子句可包括各种条件运算符: @r43F$bcqo
g5Vr2
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 2%8Y-o?
KCu6:)6'
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ^ZlV1G;/W@
Rf^cw}jU
NOT BETWEEN…AND… {q)B@#p
JXAyF6
$
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 16y$;kf8
c-T
^
aR
NOT IN (项1,项2……)
gh}AD1TN]
z|<oxF.
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ]Yu+M3Fq
V[M#qZS
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL acZHb[w
6'ZnyWb
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR M;Rw]M
]*@$%iCPE
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 9O Q4\
Ib\G{$r
2、列表运算符例:country IN ('Germany','China') kn"x[{d
jq]"6/xxb
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 GN9_ZlC
I3Lsj}69
varchar、text、ntext、datetime和smalldatetime等类型查询。 "k|`xn
O)|4>J*B
可使用以下通配字符: Ltw7b
\.a .'l
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 G7;}309s
EM*OrUe
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 LPn}QzH
Zsogx}i-
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 w2+]C&B*
?<?C*W_
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 KUut C
:
cv4M[]U~
例如: zrO|L|F&P
=.oWg uzu
限制以Publishing结尾,使用LIKE '%Publishing' ws?s
I0vnd7
限制以A开头:LIKE '[A]%' t"p#iia
]M(f^
限制以A开头外:LIKE '[^A]%' 9u @h`
cmU+VZ#pk
4、空值判断符例WHERE age IS NULL h3EDN:FQ
}hitU(5t0
5、逻辑运算符:优先级为NOT、AND、OR 0|!<|N<
B9DxV>mr\r
(四)查询结果排序 J_|}Xd)~t6
{\/nUbo[
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ()#tR^T
@%nUfG7TQ
ORDER BY {column_name [ASC|DESC]} [,…n] xJLO\B+gM
|a$w;s>\
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Z{4aGp*
AdW2o|Uap
序。 9:i,WJO
(y=o]Vy
例如: FTnQqDuT
K=?F3tX^
SELECT * ]C6[`WF
Q3%#
o+R>
FROM usertable h;p%EZ
|K;Txe_
ORDER BY age desc,userid ASC 9*+0j2uhQ
llfiNEK5;
另外,可以根据表达式进行排序。 RhNaYO
+4g%?5'
51opP8
d 4\E
二、联合查询 Pd "mb~
yLO
&(Mb
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 {kl{mJ*
w1#jVcUQ
合查询。UNION的语法格式为: 6q[!X0u
%)Uvf`Xhh4
select_statement h_chZB'
([CnYv
UNION [ALL] selectstatement B=bI'S8\
F2`htM@,
[UNION [ALL] selectstatement][…n] UX'NJ1f
-0o6*?[Z
其中selectstatement为待联合的SELECT查询语句。 UxcDDa/j2T
8C,utjy
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ObyuhAR
4_762Gu%
行。 @Du}
1|WpKaMoq
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 RvS q KW8
sMS9!{A
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 &<V_[Wh"
T[XP\!z]B!
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 \_Kt6=
9X$#x90
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 +>:}req
27],O@2?L
型,系统将低精度的数据类型转换为高精度的数据类型。 LbX6p
aMvK8C%7
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ;IuK2iDt<
CxA\yG3L&
查询1 UNION (查询2 UNION 查询3) "-QRkif
uz#PBV8Q
]]=-AuV.
U 'CfP9=
blfE9Oy
&[ u6oAR
三、连接查询 X`3vSCn
R=amKLD?
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 4-+ozC{
,M@m4bx
数据库管理系统的一个标志。 _:gGD8
S
$_Y/x
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 <duBwkiG
/iTUex7T
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 s"=F^#
!0OD(XT
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 [CDX CV-z
RZ|HwYG
查询。 g{v5mly
.:Bwa
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 EID)o[<
<p^*Ydx
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 6A$_&?
" _:iK]
SQL-92标准所定义的FROM子句的连接语法格式为: ! 2Xr~u7a
gVa+.x]
FROM join_table join_type join_table c}IX"
$m:2&lU3
[ON (join_condition)] 5y%un
:kb1}Wu
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 AB2mt:^
(ET ;LH3
个表操作的连接又称做自连接。 @ .Z[M
+~w?Xw,
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 '9-axIj70
OS4]Y
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 `;5VH ]V
"%oH@
=
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 >@)*Sn9"
HJfQ]p'nK2
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) V8sH{R-
abROFI5.L
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 $u; >hk
R3B5-^s
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 ~aJW"\{
YY#s=
数据行。 -E8ntY-
!,? <zg
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 &RKH2R
}osHA`x"2
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ?W[J[cb
Qp kKVLi
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 &'5@azU
t} *l?$`
运算符等构成。 JrCf,?L^
yu`KzIU
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 gp~yt0AU
DKy>]Hca
连接。例如: ~\IF9!
QKp+;$SE'
SELECT p1.pub_id,p2.pub_id,p1.pr_info ^&+zA,aL,A
7tpAZ<{
FROM pub_info AS p1 INNER JOIN pub_info AS p2 MxO
W)$f
Ws-6W!Ib%
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) @Jb@L
2BoFyL*
(一)内连接 gYTyH.
2{A;du%&
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 rc;7W:
(3
IZ
三种: R'Kt=.s<
k$e D(cW$
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 yz[%MXI
+1otn~(E
表中的所有列,包括其中的重复列。 w^06z,
H$z>OS_6U
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 BFBR/d[&
m b%C}8D
运算符包括>、>=、<=、<、!>、!<和<>。 Nk96"P$P
$|4cJ#;^L
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 !oZQ2z~
%04:z77
结果集合中所包括的列,并删除连接表中的重复列。 0LetsDN7I
y;Qy"-)qb
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: D:=t*2-Iv
^cYStMjpy
SELECT * h&)fu{
3jvx2
FROM authors AS a INNER JOIN publishers AS p r5t;'eCea
_*O7l
ON a.city=p.city 3p:=xL
<+V-k|
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ?qju
DD
d{er|$E?
SELECT a.*,p.pub_id,p.pub_name,p.country B4`2.yRis
qBT_!
)h
FROM authors AS a INNER JOIN publishers AS p &MCy.(jN
L +L9Y}
ON a.city=p.city ;tJWOm
T"n{WmVQ
(二)外连接 -glugVq
Rw{$L~\
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 IikG/8lP
V?OuIg%=:
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 :1:3Svb<Y
8]S,u:E:N
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 3^{8_^I
~j=xi P
如下面使用左外连接将论坛内容和作者信息连接起来: 0CT}DQ._^N
AT"!{Y "H
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b z8IPhE@
dVa!.q_3
ON a.username=b.username Hal7
MP
W%TQYR
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: +wipfL~&S
538fK9[
SELECT a.*,b.* 2b5 #PcKa
Vzpt(_><
FROM city as a FULL OUTER JOIN user as b 59.$ULQVMY
X4a^mw\"
ON a.username=b.username }i(qt&U;
5?Bc
Y;
(三)交叉连接 ! 0^;;'
fV 3r|Bp
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 3filAGR?
z<hFK+j,'^
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Re>AsnA[
l09Fn>wa
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 "u_i[[y
jAXR`D
于6*8=48行。 cv2]*
2gt+l?O<PS
SELECT type,pub_name ^EF'TO$
yf!,4SUkU
FROM titles CROSS JOIN publishers :Zza)>l
UVrQV$g!
ORDER BY type