一、简单查询 08g2? 5w"
0%yPuY>
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 w BoP&l
~b%dBn]n>
表或视图、以及搜索条件等。 Oe;1f#`5
4.>y[_vu
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 7dOpJjv?)
g\*2w
@
SELECT nickname,email P~PM $e
f9O_M1=|lo
FROM testtable d^0-|sx
E#cu}zi
WHERE name='张三' b{
tp
qNm~
a|k*A&5u2
(一)选择列表 }{[JS=A^
n;>r
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 FS*J8)
"
^!=e72
量和全局变量)等构成。 %H3iX^}*
UgOhx-8
1、选择所有列 ziv+*Qn_b4
/74)c~.W
例如,下面语句显示testtable表中所有列的数据: Gsz$H_
dki3(
SELECT * V|<'o<h8
lQ4$d{m`
FROM testtable Q,};O$h
g+xcKfN{
2、选择部分列并指定它们的显示次序 $-
Y8@bw
7'ws: #pC
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 7UUu1"|a|
\vuWypo
例如: !P6?nS
;Q[E>j?w=
SELECT nickname,email q3|SZoN
Qz$Wp*
FROM testtable TZdJq
\7e4t
3、更改列标题 KYq<n& s
0;%\L :,O
在选择列表中,可重新指定列标题。定义格式为: ly@%1
x6vkd%fCj
列标题=列名 R?J8#JPXD
{@PZlQg
列名 列标题 g9IIC5
jPg[LZQ'
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 0QEcJ]Qb8
TjpAJW@-
标题: &7Xsn^opku
${97G#
SELECT 昵称=nickname,电子邮件=email $-(lp0\*
_6L'}X$)N
FROM testtable xJOp~fKG
|{rhks~
4、删除重复行 >VG*La'c
q}(f9
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 8A'SMJi
`*i:z'
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 8rNf4]5@X(
bKh}Y`
5、限制返回的行数 ft!D2M
x@|10GC#:
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 )[=C@U
{l\Ep=O vx
表示一百分数,指定返回的行数等于总行数的百分之几。 WWLf'89It
Wq<HsJd/
例如: y"H(F,(N
%-|$7?~
SELECT TOP 2 * G+m[W
VY@`)
FROM testtable %d
/]8uO
.4y44: T
SELECT TOP 20 PERCENT * JYLAu4s6
Ctk1\quz
FROM testtable ,,?XGx
M1*x47bN
(二)FROM子句 P|a|4Bb+fW
d-I=xpB
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ifmX<'(9A
*#GX~3A
它们之间用逗号分隔。 H8E#r*"-m
6f+@@=Xc
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 !)`m mr
-JclEp
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 )?(_vrc<
SN$3cg]z
使用下面语句格式加以限定: Q0L1!}w
R,-DP/ (im
SELECT username,citytable.cityid I1p{(fJ
raM{!T:
FROM usertable,citytable UUvR>5@n
oF s)UR
WHERE usertable.cityid=citytable.cityid xzf/W+.>.
_znpzr9H
在FROM子句中可用以下两种格式为表或视图指定别名: XFi9qL^
2l~qzT-
表名 as 别名 8w~X4A,
(62Sc]
表名 别名 .pblI
cHnd
gUW]
例如上面语句可用表的别名格式表示为: u!McPM8Yk
<JW%h :\t
SELECT username,b.cityid 7&Ie3[Rm_3
V@`%k]k
FROM usertable a,citytable b |#B)`r8
_A=i2?g
WHERE a.cityid=b.cityid *(sv5c!0M8
)
gxN'z
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 XMLl>w2z
^>z+e"PQA
例如: 5 &]a8p{
?VyiR40-Cx
SELECT a.au_fname+a.au_lname EEHTlqvR
$;)A:*e
FROM authors a,titleauthor ta 0uI=8j
/@", 5U#
(SELECT title_id,title ~le:4qaX
880T'5}S
:
FROM titles %~N| RSec
Qn/6gRLj
WHERE ytd_sales>10000 Qo80u?*
C0&ZQvvy1:
) AS t JE;!~=
cq$_$jRx
WHERE a.au_id=ta.au_id E.CG
d;).| .}P
AND ta.title_id=t.title_id eqyUI|e
= @ 1{LF;
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 hE +M|#o
+rKV*XX@
(三)使用WHERE子句设置查询条件 zOis}$GR
)OFf nKh
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: fD2 N}
q oz[x
SELECT * VrJf g
5zF$Q {3
FROM usertable 5$*=;ls>J
~vMJ?P@
WHERE age>20 ZD<e$PxxCd
O
2+taB
WHERE子句可包括各种条件运算符: 6vg` 8
_F2ofB'
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< "l B%"}
]5e|W Q>*X
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… zTw<9 Nf
.Z@ i z5
NOT BETWEEN…AND… @
b}-<~
gdg
"g6b
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) p }3$7CR/
R^yh,
NOT IN (项1,项2……) 43!E> mq
Rvd'uIJ
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE (:RYd6i
3O|2Z~>3
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL nlc$"(eA[H
^a7a_M
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR {-hu""x>
5GURfG3{
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ~8)l/I=`);
I-W,C&J>
2、列表运算符例:country IN ('Germany','China') D*g
K, `
|Pv)&'B"
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 k:z)Sw
"XU)(<p
varchar、text、ntext、datetime和smalldatetime等类型查询。
L$@qEsO
c7]0>nU;
可使用以下通配字符: 9x#Tj/5%
?:+p#&I
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Am >b 7Z!
{gB9EGY
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ]#W9l\
6U1_Wk?
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 &3\3wcZ,q
~eXI}KhBw6
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 $?DEO[p.
:b,An'H
例如: n/%M9osF
)hD77(c
限制以Publishing结尾,使用LIKE '%Publishing' D_BdvWSxj
{O4&HW%
限制以A开头:LIKE '[A]%' U XOf
|J~A )Bw?
限制以A开头外:LIKE '[^A]%' +)_#j/
8(}cbW
4、空值判断符例WHERE age IS NULL b .cBg.a
5
axt\
5、逻辑运算符:优先级为NOT、AND、OR H?;@r1ZAn
u0%bv\$m
(四)查询结果排序 Wp^A.
af&P;#U
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: v|nt(-JX
}D!o=Mg^
ORDER BY {column_name [ASC|DESC]} [,…n] VL$?vI'
Q5*"t*L!N
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 -`1)yhS
-2Dgr\M
序。 'wo}1^V
X*`b}^T
例如: .+5;AtN
hSaw)g`w
SELECT * dA0o{[o=
fjm3X$tR
FROM usertable Y0ACJ?|
>KJE *X@s
ORDER BY age desc,userid ASC A"IaFXB
vg5fMH9ZZ
另外,可以根据表达式进行排序。 e4;h*IQK
07>D G#
-~
Dn^B1^
I:YE6${k!
二、联合查询 -#r=
'K|F{K
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 SfPtG
Gyc_B
合查询。UNION的语法格式为: p@wtT"Y
y/"CWD/ i
select_statement GYV%RD #
va!fJ
UNION [ALL] selectstatement fH%C&xj'&
gj82qy\:
[UNION [ALL] selectstatement][…n] -'Z-8
J5}?<Dd:
其中selectstatement为待联合的SELECT查询语句。 Z*.rv t
Q>TNzh
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 +#6f)H(P]
R xc
行。 Zk5AZ R!|
6dYa07
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 iAXF;'|W
@QDpw1;V'
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 tZ:fh p
DN;$->>
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 kE1k@h#/
|oR#j
`
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 hfs QAa
bUc++M
型,系统将低精度的数据类型转换为高精度的数据类型。 hPt=j{aJ%<
^CB@4$!
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: PrF('PH7i
3lgD,_&
查询1 UNION (查询2 UNION 查询3) x6Q_+!mnk
\psO$TxF=
fF.+{-.
+B4 i,]lCx
R[H#av
J$&2GAi
三、连接查询 rWJKK
9/O\769"'
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 m
[BV{25
\mw5
~Rf;
数据库管理系统的一个标志。 u89Q2\z~"M
)Zrn?KM
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 |Rb8/WX
#2%8@?_-M
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 *\^(-p~M
gKRlXVS
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 |j4;XaG)
_+ >V(,{G
查询。 QV _aM2
o>I,$=
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 h-\+# .YP
*?o 'sTH
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 %%lJyLq'Vk
9dp1NjOtAc
SQL-92标准所定义的FROM子句的连接语法格式为: #YSFiy:+r_
}jYVB|2
FROM join_table join_type join_table <M\#7.](
+aOX{1w
[ON (join_condition)] 3*oZol/
"}:SXAZ5`
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 K^%ONultv
4"Mq]_D
个表操作的连接又称做自连接。 LKst
QP!I
'Kd-A:K2g
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 dRBWJ/ 1T
e)|5P
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 8/-hODoT_
5B;;{GR
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 9\%`/tJM
_] us1
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) (_fovV=
)yS8(F0
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ](z*t+">
,6x>gcR
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 BKu<p<
B%z+\<3^q
数据行。 l2kUa'O-
=@MJEo` D
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 iT</
4C9k0]k2
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 6e"Lod_ L
\Z-Fu=8J8^
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ^[b DE0
M/YS%1
运算符等构成。 Uq.hCb`:
B9]bv]
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ]i8t
<6C:\{eo
连接。例如: )%HIC@MM6
^_uCSA'X
SELECT p1.pub_id,p2.pub_id,p1.pr_info E*QLw*H
SxL/]jWR7
FROM pub_info AS p1 INNER JOIN pub_info AS p2 :13u{5:th
V/yj.aA*@
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) i\kDb=
fiLlOr%r
(一)内连接 Bx|h)e9
JG{`tTu
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 (dHjf;
0m4'm<2m
三种: <A&Zl&^1
Tj!rAMQk
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 A&X
XL~yH
8*&YQId~
表中的所有列,包括其中的重复列。 h79~d%-
(SByN7[gb
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 J#\oc@
W4)bEWO+q
运算符包括>、>=、<=、<、!>、!<和<>。 yn.[-
cuL/y$+EY
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 u"DE?
CM)V^k*
结果集合中所包括的列,并删除连接表中的重复列。 <>V~
LXf|n
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: T
`o[whr
rGay~\
SELECT * =sk#`,,:
{5c]\{O?[
FROM authors AS a INNER JOIN publishers AS p ]^<\a=U
^[Y/ +Q.J
ON a.city=p.city 8qoA5fW>
z<8VJZd
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): X=Jt4 h9
D0h6j0r5
SELECT a.*,p.pub_id,p.pub_name,p.country C{,Vk/D-0
T75N0/teS
FROM authors AS a INNER JOIN publishers AS p `)TgGny01
$}=r45e0K
ON a.city=p.city M%7|7V<o)^
AsI.8"
(二)外连接 JI/iq
6#HnA"I2n
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 N3wy][bo
hz5t/E
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 kA9 k^uR/
w7f)v\p
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 7yOBxb
sY?sQ'E2]
如下面使用左外连接将论坛内容和作者信息连接起来: =]1g*~%
tMyMA}`
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b }$s QmRR
gZ=$bR
ON a.username=b.username R#s_pW{op
lHE+o;-
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: [C@Ro,mI
3V<c4'O\W
SELECT a.*,b.* 2m9qg-W
VOT9cP^6
FROM city as a FULL OUTER JOIN user as b /buj(/q^#
nPH\Lra
ON a.username=b.username $9Gra#
!(y(6u#
(三)交叉连接 Bf" ZmG9
SBY0L.
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ^!x qOp!
n%!50E6*:
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 1yTw*vH F
T#HF!GH]
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 .`oKd@I*"
j?VHR$
于6*8=48行。 V(Oi!(H;v
S(0JBGC
SELECT type,pub_name S`vw<u4t
He&A>bA)z
FROM titles CROSS JOIN publishers V>ZDJW"G!
u@Bgyt7Y
ORDER BY type