一、简单查询 _`[6jhNa!
QLU;.&
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 !Jnw_)
X0QS/S-+
表或视图、以及搜索条件等。 Ck%(G22-
D\*_ulc]
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 >Io7h#[u
I/V#[K C
SELECT nickname,email }V,M0b>
o (NyOC
FROM testtable "Am0.c/
cB=u;$k@*
WHERE name='张三' 3CPOZZ
Ic!83-
(一)选择列表 2]*~1d
rh&Eu qE%
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 L;7mt
4H
nKkTnTSa
量和全局变量)等构成。 c7!`d.{90
Cbvl( (
1、选择所有列
ts!aKx
w=o m7%J@l
例如,下面语句显示testtable表中所有列的数据: EXzNehO~e
[IA==B7
SELECT * lA
0_I"b2Y
L([ >yQZ
FROM testtable gt (nZ
A8(PI)Ic.
2、选择部分列并指定它们的显示次序 V46[whL%r
&7u
Ra1/R
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 K -1~K
bY$!"b~
例如: +%9Y7qol
Jc^ozw
SELECT nickname,email f_XCO=8'v
=:8=5tj
FROM testtable OVf|4J/Yx
l%~zj,ew
3、更改列标题 _'p;V[(+M
CoXL;\
在选择列表中,可重新指定列标题。定义格式为: L%Q *\d
XPTB,1g+f
列标题=列名 G_4P)G3H
=JH,RQ
*
列名 列标题 wGX"R 5
<qt%MM [Y
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 )pa|uH+N
1*b%C"C
标题: @??
6)C
O G}&%NgH
SELECT 昵称=nickname,电子邮件=email tTp`e0L*m
XhV"<&v
FROM testtable O#Hz5A5
N6%q%7F.:
4、删除重复行 4jro4B`
|JQKxvjT
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 &2pM3re/f
/*HSAjv
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 muY^Fx
L$Z_j()2
5、限制返回的行数 nzl,y,
p:%E>K1<
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Q3Lqj2r
XX6)(
表示一百分数,指定返回的行数等于总行数的百分之几。 *.l=>#qF
ka%pS
例如: I!'(>VlP7
tRCd(Z,WY
SELECT TOP 2 * 3l[hkRFu`
KrH;o)|
FROM testtable x%&V!L
'8
#*U
SELECT TOP 20 PERCENT * >i E
\vQ (
FROM testtable &>+Z$ZD
r :-WfDz.
(二)FROM子句 ]!w52kF7
3i~{x[Jc
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, !iqz 4E
,#Y".23G
它们之间用逗号分隔。 75i)$}_1B
wX;NU4)n
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 9z}kkYk
ond/e&1
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 `<G+N
2eYkWHi
使用下面语句格式加以限定: ~VF,qspO
wE2?/wb
SELECT username,citytable.cityid ,fFJSY^
$hh=-#J8
FROM usertable,citytable -+/|
$=R\3:j
WHERE usertable.cityid=citytable.cityid VEm[F/'
2Y{9Df
在FROM子句中可用以下两种格式为表或视图指定别名: !>j-j
>=Veu; A
表名 as 别名 0IuU4h5Fr
OYy8u{@U:
表名 别名 9,+LNZ'k
+.St"f/1
例如上面语句可用表的别名格式表示为: c7_b^7h1
H;`@SJBf
SELECT username,b.cityid GvY8O|a
u e~1144
FROM usertable a,citytable b zV#k
#/$
>TgO|mq
WHERE a.cityid=b.cityid P)
#rvTDRw
F!8425oAw
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 F{Hy@7
`h#JDcT;a
例如: .~']gih#
wB{-]\H`\
SELECT a.au_fname+a.au_lname nor`w,2VF
~8K~@e $./
FROM authors a,titleauthor ta cvt2P}ma#
_G`aI*rKsy
(SELECT title_id,title (?(ahtT4T
UQy+&;#5
FROM titles V qf}(3K0
seim?LK
WHERE ytd_sales>10000 \)hmg
e2v,#3Q\
) AS t 2J$Uz,@
gnt[l0m
WHERE a.au_id=ta.au_id DlP=R
j43HSY7@
AND ta.title_id=t.title_id xhv)rhu@
^z1WPI
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 N?p$-{
)erPp@
(三)使用WHERE子句设置查询条件 DpAuI w7|
UHHe~L
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: JdnZY.{S0
3[$VW+YV
SELECT * hLF@'ln
R?k1)n
FROM usertable <e"2<qVi
XOoND
WHERE age>20 gi8kYHldH
}-kb"\X%g
WHERE子句可包括各种条件运算符: x<].mx
7)YU ;
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< EC7o 3LoND
;a|A1DmZ
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… -95`.o
'ga@=;Wj
NOT BETWEEN…AND… f7L |Jc
Xc.~6nYp
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) w t}a`hxu
uAJC Q)@
NOT IN (项1,项2……) %u#pl=k}
[69aTl>/
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE -$*YN{D+
}x+{=%~N
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL &Jj?C
9r!%PjNvE
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR cB
TMuDT_
LY"/ Q
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 [}Nfs3IlBw
GlaWBF#
2、列表运算符例:country IN ('Germany','China') '#XP:nqFkK
&*0V!+#6
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 tC&Xm}:
_ge3R3
varchar、text、ntext、datetime和smalldatetime等类型查询。 SYyH_0N
rv^j&X+EH
可使用以下通配字符: * fx<>aK
v{I:Wxe
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 TE/2}XG)
[KJm&\evp
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 V9+7A
>q}EZC
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Z#0z #M`
15870xS
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 {It4=I)M
6oC(09
例如: C>LkU |[
#3.\}d)
限制以Publishing结尾,使用LIKE '%Publishing' ms~ mg:
V'_^g7}l&
限制以A开头:LIKE '[A]%' /dCZoz~~T
^0VI J)y
限制以A开头外:LIKE '[^A]%'
o]
=
&
1iz\8R:0
4、空值判断符例WHERE age IS NULL sI`Lsd'V
^<<
Wqmx
5、逻辑运算符:优先级为NOT、AND、OR ^LZU><{';
"jy'Dpy0m
(四)查询结果排序 z19y>j
+* &!u=%G
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Ly3^zFW
X(/W|RY{@
ORDER BY {column_name [ASC|DESC]} [,…n] >kd2GZe^_J
K }r%OOn0
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Ek84yme#
W}KtB1J
序。 >2_J(vm>
g5H+2lSC
例如: M6?* \9E
!X8:#a(
SELECT * a7Z PV1k
kfn5y#6NZ
FROM usertable k;"=y)@o
h:l\kr|9
ORDER BY age desc,userid ASC >RRb8=[J
Rj-<tR{
另外,可以根据表达式进行排序。 ]NN9FM.2b/
gXG1w>
IF uz'
Z$T1nm%lo:
二、联合查询 FFPO?y$
b d9]'
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 ,1od]]>(O
^oj)#(3C
合查询。UNION的语法格式为: v50=D/&w
r..\(r
select_statement 7j5 l?K-
N[czraFBD}
UNION [ALL] selectstatement 2rne=L
UnGG%
[UNION [ALL] selectstatement][…n] ze]2-B4
P#6y
其中selectstatement为待联合的SELECT查询语句。 0F)Y[{h<
Qb6s]QZEV
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ,xNuc$8Jd
'a*tee ^RS
行。 &c0U\G|j
0IxXhu6v
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 @2]_jW
JhIgqW2
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 S's\M5
7\eN8+
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 {p+7QlgK
Lylw('zZ
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 C;M.dd
*s<FE F
型,系统将低精度的数据类型转换为高精度的数据类型。 !|hv49!H
2?#IwT'
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: na_Y<R`
}h>QkV,{2
查询1 UNION (查询2 UNION 查询3) pGh2 4E
8I3"68c_a
jCxw|tmgq
-Y{P"!p0
nUD)G<v
ZEp UHdin
三、连接查询 IA!( 'Ks
7i,}F|#8
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 sd
xl@
IZoa7S&t
数据库管理系统的一个标志。 \5cAOBja
nxw]B"Eg
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Z25^+)uf*U
j!xt&t4D
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 1 f).J
/X{:~*.z
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 6MqJy6
C|8.$s<
查询。 J[du>1D
s9?klJg
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 H"6Sj-<=
w-pdpbHV
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ]G#og)z4
Q47Rriw
SQL-92标准所定义的FROM子句的连接语法格式为: +v{<<
@;!s"!~sv
FROM join_table join_type join_table $d'GCzYvZ
vE^Hk!^
[ON (join_condition)] L]I)E`s
);'8*e'
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 C AVqjT7
fE8/tx](
个表操作的连接又称做自连接。 iZyhj%#
MS)(\&N
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 /{#1w\
"z8L}IC!e5
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 615, P/
c%n[v3]
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 <H::{
;Z\jX[H
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) % V/J6
< {$zOF}
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 e?rp$kq7
nJ<h}*[
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 p(fYpD
S;[9
hI+
数据行。 (hEqh
nnm`
T.]+T[}!
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的
QK)"-y}"g
ZaBGkDX5
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 c$ya{]a
ov.7FZ+
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 6&5p3G{%0
I4.^I/c(
运算符等构成。 x'tYf^Va28
n$i}r\
so
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 bX23F?
\#Ez["mD
连接。例如: sS7r)HV&GI
7+ QD=j-
SELECT p1.pub_id,p2.pub_id,p1.pr_info u2,V34b-
x<W`2Du
FROM pub_info AS p1 INNER JOIN pub_info AS p2 BuII|j
Nz %{T
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ~ x-
R78'
`'H"|WsT
(一)内连接 {B8W>>E
K6d9[;F
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 (P&~PJH
-*t4(wT|j
三种: AX!YB'm-
Uax[Zh[Cg
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ~vgm;O
zBg>I=hiG
表中的所有列,包括其中的重复列。 R`sU5 :n
r*'a-2Au
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 hY XH9:
aVcQ
运算符包括>、>=、<=、<、!>、!<和<>。 \WKly
xrd@GTaI
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 {W*_^>;K
cD5c&+,&I
结果集合中所包括的列,并删除连接表中的重复列。 (lBgWz
:d\ne
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 7/%{7q3G>
oju)8H1o#
SELECT * X;25G
4
qMO@E_
FROM authors AS a INNER JOIN publishers AS p +c$]Q-(
uSh!A
ON a.city=p.city %5.aC|^}
huVw+vAA
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): rjqQWfShY
X+2 aP'D
SELECT a.*,p.pub_id,p.pub_name,p.country B@XnHh5y
HF>Gf2-C
FROM authors AS a INNER JOIN publishers AS p =>Ss:SGjT
Jv(9w[
ON a.city=p.city Ln-/
9'^
~H"Q5Hr
(二)外连接 m!{Xu y
M5DQ{d<r
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 mkH{%7n
l,5<g-r
V
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 l+g\xUP
A<-Prvryt
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 +iKs)s_~
r;m_@*]
如下面使用左外连接将论坛内容和作者信息连接起来: V8AF;1c?-'
CZaUrr
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b evOyTvc
y\Su!?4!
ON a.username=b.username ;{'{*g[
5MUM{(C
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: G=?2{c}U
(3PkTQlE
SELECT a.*,b.* -XNjyXm2
k+Ew+j1_
FROM city as a FULL OUTER JOIN user as b =[{YI2S
78a!@T1#
ON a.username=b.username "";[U
Zqwxi1
(三)交叉连接 '@OqWdaR
"o"ujQ(v
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 4wfT8CL
TTB1}j+V6
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 8/ lv, m#
"]*16t%Z%x
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 2E]SKpJ
f44b=,Lry5
于6*8=48行。 iEd%8 F h
Y JzKE7%CO
SELECT type,pub_name M->/vi
t[gz#'
FROM titles CROSS JOIN publishers #m 2Ss
$v|/*1S
ORDER BY type