一、简单查询 R
s)Nz< d
J#^oUq
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 O}IRM|r"
V,CVMbn/%N
表或视图、以及搜索条件等。 5b^`M
mlD 1 o
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 d=_Wgz,d
9xm' 0 '
SELECT nickname,email To"J>:l
`<:D.9vO "
FROM testtable ayQB@2%
_7LZ\V+MLW
WHERE name='张三' 1Xi.OGl
.;xt{kK
(一)选择列表 uY6|LTK&x
APA:K9jD
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ;<=B I!
~'9>jpnw
量和全局变量)等构成。 Ev7fvz =
.j)f'<;%
1、选择所有列 b:w {7
ZNEWUt{+;^
例如,下面语句显示testtable表中所有列的数据: ~Z#jIG<?g
g/ict2!
SELECT * 9cm9;
D8''q%
FROM testtable V
2WcPI^
*To5\|
2、选择部分列并指定它们的显示次序 KLn.vA.
;{k`nv_6
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 G*;6cV19
eJ23$VM+9
例如: Cg!]x
o
h NCoX*icd
SELECT nickname,email A#6\5u
"me
a*-XB
FROM testtable S EeDq/h
eQRY xx{
3、更改列标题 vF ,iHzv
+=/FKzT<
在选择列表中,可重新指定列标题。定义格式为: WI$MT6
,9C~%c0Pw
列标题=列名 C<.Ny,U
"/zIsn7
列名 列标题 =#"ZO
`bdCom
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 #&cNR_"w
*N;# _0)/
标题: 855JAf
,' m<YTF
SELECT 昵称=nickname,电子邮件=email *"pf3x6
#H@rb
FROM testtable H?(I-vO
&7 YTz3aj
4、删除重复行 C&QT-|
[0(+E2/:2
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 a\Ond#1p
6?3f+=e"~!
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 =V@5W[bV
-$[o:dLO
5、限制返回的行数 2C!Ko"1Y'
)lo;y~ o
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 2V1|b`b#4
Z7X_U`Q
表示一百分数,指定返回的行数等于总行数的百分之几。 wewYlm5@
VNmQ'EuV}2
例如: 5IPZ;
!Cpy
)D(
SELECT TOP 2 * x@ZxV*T^
k yFq
FROM testtable (0=e ,1 n
vncak
SELECT TOP 20 PERCENT * /@<&{_sybp
'w8k*@cQ
FROM testtable U '#Xwax
FKOTv2
(二)FROM子句 12yr_
SGd[cA
K o
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, _^ 2rRz
hw@ `Q@
它们之间用逗号分隔。 e7(iMe
OUd&fUmH
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 DO #!ce
f+/AD
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 |Mj2lZS
(W~')A"hC'
使用下面语句格式加以限定: \D9J!K82
ld-Cb3R^
SELECT username,citytable.cityid c?;YufH'j
!5hNG('f
FROM usertable,citytable \Tc<27-
pE<@
WHERE usertable.cityid=citytable.cityid b=5"*=T{+
|bwz
在FROM子句中可用以下两种格式为表或视图指定别名: Lad8C
vbo:,]T<A
表名 as 别名 9\_^"5l
w$X"E*~>8
表名 别名 \lJCBb+k
BP& T|s
例如上面语句可用表的别名格式表示为: zT\nj&7
h& t/
L
SELECT username,b.cityid o1m+4.-
5cv&`h8uo_
FROM usertable a,citytable b 6%hr]>L
]Kutuf$t
WHERE a.cityid=b.cityid Y;X_E7U
4@b~)av)
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 y h
(Q_J{[F
例如: fd {75J5%
K/Q%tr1W0
SELECT a.au_fname+a.au_lname UP18?uM
>tmv3_<=
FROM authors a,titleauthor ta A)2eo<ij4
Ej\Me
(SELECT title_id,title k$kOp *X
;.O#|Z[
FROM titles xnuu#@f
qT<OiIMj^
WHERE ytd_sales>10000 B<99-7x3
y@#JzfY?Hr
) AS t 9;\a|8O
#%~PNki
WHERE a.au_id=ta.au_id (R.l{(A
K@JGGgrE`!
AND ta.title_id=t.title_id kBh*@gf
kqebU!0-
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 E%[2NsOM]
X]Aobtz
(三)使用WHERE子句设置查询条件 N)kZ2|oD
kB2]Z}
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: P}2i[m.*,
3 #8bG(
SELECT * St1Ny,$yU
\jkMnS6FvL
FROM usertable ?06+"Z
SBf8Ipe
WHERE age>20 9!``~]G2
yHXQCWY{8;
WHERE子句可包括各种条件运算符:
}T)0:DF1,
Ft<6`C
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< %4=r .9
U<YP@?w
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… o*fNY
n(}W[bZ4
NOT BETWEEN…AND… oMb&a0-7u
^=COgO]e
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) BF="gZoU<
Q7!";ol2
NOT IN (项1,项2……) 1}7Q2Ad w
8_d>=*(
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE '%W`:K'
#nD]G#>e
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL pie,^- _.g
^69ZX61vt
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 8\N`2mPt
U_&v|2o#3
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 !`A]YcQ
T{USzMj
2、列表运算符例:country IN ('Germany','China') ?;bsg9
JO3x#1~;_
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 qg`8f?
SHAC(3o/e
varchar、text、ntext、datetime和smalldatetime等类型查询。 Rk8oshS+2
QY^v*+lr\
可使用以下通配字符: S [$Os7
3pk=c-x
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 `W*b?e|H1
Knjg`f
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 u ?
}T)B
*_ U=KpZF
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 R7
WGc[
"PK`Ca@`v
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Ft[)m#Dj`
!4/s|b9K
例如: Ag82tDL[u
fF|m~#y
限制以Publishing结尾,使用LIKE '%Publishing' f4[Bj{F
!W4X4@
限制以A开头:LIKE '[A]%' dsUt[z1w5
q-3e^-S*
限制以A开头外:LIKE '[^A]%' ,ix> e
.H33C@
4、空值判断符例WHERE age IS NULL "!AbH<M;@
%3@a|#g
5、逻辑运算符:优先级为NOT、AND、OR ru 5T0w";V
Mb1K:U
(四)查询结果排序 NbyXi3@v
;bMmJ>[l-
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ju8DmC5
x\R%hGt
ORDER BY {column_name [ASC|DESC]} [,…n] *#| lhf'
VGVb3@
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ImG7E
w
jgyXb5GY
序。 B.oD9 <9
y.6Yl**l
例如: rHMr8,J;
c+bOp
05o-
SELECT * EQvZ(-_;4
?j:g. a+U
FROM usertable +vSp+X1E
\G~<O071
ORDER BY age desc,userid ASC s6YnNJ,SK
{Rv0@)P$
另外,可以根据表达式进行排序。 :W6R]y
KB\A<(o,
+FGw)>g8'm
qJyGr ?
二、联合查询 "?f_U/+D<
jg3X6 /'
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 B']}n`g
"Ei' FM
合查询。UNION的语法格式为: BM+>.
+ak<yV1=
select_statement "/~KB~bB
r/e} DYL&
UNION [ALL] selectstatement GX@=b6#-
O~bJ<O=?
[UNION [ALL] selectstatement][…n] 6$ \69
_enS_R
其中selectstatement为待联合的SELECT查询语句。 gc"A Tc
+DR,&;
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 _C&XwCIm
r1R\cor
行。 Frd` u.I
[izP1A$r#Q
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 r J^*8C!
*_,: &Ur
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 Ce.*yO<-
1(4}rB3
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 :vWixgLg
6qYK"^+xu
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 QZ?%xN(4
L_(Y[!
型,系统将低精度的数据类型转换为高精度的数据类型。 /@xL {
.{t]Mc
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: |k[hk
hha!uD~(
查询1 UNION (查询2 UNION 查询3) T {B\1|2w
J!"#N }[
<%ZlJ_cM
U_oei3QP
@Z[XV"w|
k>W}9^ cK
三、连接查询 C<"b99\2`
\1[v-hvK
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 !`S61~gE
I;rh(FMV
数据库管理系统的一个标志。 N&YQZ^o
71wtO
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Zf*DC~E_
u7G9 eN
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 dkI(&/
d:GAa
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 m1{OaHxKh
>DkRl
查询。 U!D\Vd
.J fV4!=o
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 (|t)MnPfY
<HMmsw
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
I5H#]U
E7AYK&
SQL-92标准所定义的FROM子句的连接语法格式为: J,,+JoD
D]B;5f
FROM join_table join_type join_table <52)
97-=Vb
[ON (join_condition)] 3uJ>:,~r
=cKrp'
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 5lYzgt-oP
*R8qnvE\()
个表操作的连接又称做自连接。 M7.
fz"M
D FN
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 2& ZoG%)
s3+6Z~g'B
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 jB -wJNP/
}$D{YHF
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 P d)<Iw^<
-$@4e|e%a
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) W;y ,Xs
g6l&;S40
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 OaCp3No
eW.[M ?,
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 yr,Oq~e
wW1>#F
数据行。 !dZpV~g0
<h[l)-86
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 u(b Pdf@kz
5l,Q=V^@l
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Y&y5^nG
6fcn(&Qk
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 +x:-W0C:
QoTjKck.
运算符等构成。 ~ s# !\Ye
le.(KgRS4
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 bc ;(2D
t}A n:
连接。例如: F%F :Gr/
yMCd5%=M\
SELECT p1.pub_id,p2.pub_id,p1.pr_info w/Ej>OS
h&Q9
FROM pub_info AS p1 INNER JOIN pub_info AS p2 ;y%C\YB#
HS[N]'dc
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) gW_^GrK pI
eHQ3K#M#
(一)内连接 D`fi\A
WlfS|/\%V^
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 ~G#^kNme
6z>Zm1h
三种: (25v7Y]
hY^-kdQ>M
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 {nyVC%@Y
/m+q!yi &
表中的所有列,包括其中的重复列。 E])X$:P?
WTZr{)e
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 dX>l"))yR
tW7*(D
运算符包括>、>=、<=、<、!>、!<和<>。 {nl4(2$
e Zb8x
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 RBM(>lU:
L?~-<k
结果集合中所包括的列,并删除连接表中的重复列。 ^"hsbk&Yu
^d[s*,i?
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: p@x1B
&Z
hp6%zUR
SELECT * +(9qAB7
2 bQC2
FROM authors AS a INNER JOIN publishers AS p ecl$z6'c
IsjD-t
ON a.city=p.city 8`j;v>2
DGllJ_/Z
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): u%`4;|tI
S/l?wwD
SELECT a.*,p.pub_id,p.pub_name,p.country +ysP#uAA
=|G l
FROM authors AS a INNER JOIN publishers AS p glvtumv
Tl ?]K
ON a.city=p.city 2~BId&]
3cztMi
(二)外连接 <u9U%Vsi
%}%vey
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 %`Q<_LTU
!`-/E']/
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 F6xQ`T|
hc4W|Ofj
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ND|!U#wMNV
DTw3$:
如下面使用左外连接将论坛内容和作者信息连接起来: h
r!Htew4
_'lrI23I
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b Tfba3+V
s]p3dB#
ON a.username=b.username z9#iU>@
1*!`G5c,}
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: {Noa4i
ua-cX3E
SELECT a.*,b.* (8*& 42W
Y"U -Rc
FROM city as a FULL OUTER JOIN user as b i C
nWb
fGD#|a;,
ON a.username=b.username b1A8 -![
Zk.LG Yz
(三)交叉连接 I}a iy.l
k^IC"pUc
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 J}-,!3qxW
6jRUkI-!
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 1x^(vn#=
liUrw7,
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 [foZO&+!
u}7#3JfLn
于6*8=48行。 ttwfWfX
IaU
SELECT type,pub_name uW8LG\Z>D5
[ Yzh(a8
FROM titles CROSS JOIN publishers 6J|Y+Y$
4D`T_l
ORDER BY type