一、简单查询 ,gZp/ yJ;
er24}G8
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ?"
4X&6xl
|Q)mBvvN
表或视图、以及搜索条件等。 *#>(P
pLe4dz WA
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 D~ 3@v+d
eE'>kP}
SELECT nickname,email -4+'(3qr
4+>yL+sC%v
FROM testtable bP-(N14x+
75p9_)>96
WHERE name='张三' VD&wO'U
m-4#s
(一)选择列表 kOo Vqu
T8\@CV!
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 8hS^8
J \|~k2~
量和全局变量)等构成。 KRlJKd{
X7OU=+g
1、选择所有列
y
_ap T<P
lHM}
E$5
例如,下面语句显示testtable表中所有列的数据: 0~ nCT&V
FJH>P\+
SELECT * \EU3i;BNT%
8K9HFT@yV
FROM testtable w^8Q~3|7
|sr\SCx
2、选择部分列并指定它们的显示次序 *:d``L
r3?8nQ$
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 +|bmUm<2
`^{G`es
例如: _Zav Y<6
!I1p`_(_7
SELECT nickname,email =7TWzUCO#
>WZ%Pv*
FROM testtable (BtU\f#d
eCKm4l'BZ
3、更改列标题 9~j"6wS
i_m&qy<v
在选择列表中,可重新指定列标题。定义格式为: V0m1>{
M:OZWYQ
列标题=列名 <-N eusx%
xib}E[-l#
列名 列标题 JdI*@b2k[
yB7si(,1>
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 =%I[o=6
Tx&H1
标题: S+KKGi_e
*0,*F ~n
SELECT 昵称=nickname,电子邮件=email 32+N?[9
*
fhZwYx&t
FROM testtable Q(N'Oj:J
0_je@p+$
4、删除重复行 ynra%"sd
6[XaIco=C
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 {BM:c$3@j
VB |k
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 P\WHM(
>DY/CcG\P
5、限制返回的行数 Z(RsB_u5
3F;0a ;[
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 m`zd0IRTP
w7~]c,$y.
表示一百分数,指定返回的行数等于总行数的百分之几。 chD7^&5]
bny@AP(CY+
例如: _Q^jk0K8ga
=aj|auu
SELECT TOP 2 * &/uakkS
;(,GS@sP
FROM testtable $/Wec,`&
PC@HNto{
SELECT TOP 20 PERCENT * EhO\N\p(Q=
pHVDug3
FROM testtable /oe0
W'k&DKhTqF
(二)FROM子句 5[zr(FuE
A<H]uQ>
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, nUONI+6Z/
S|u5RU8*"|
它们之间用逗号分隔。 mhIGunK;+
zB y%$5~Fw
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 u]B
b ^[
L
~Vw`C
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 V^qBbk%l>D
:/?
Op
使用下面语句格式加以限定: J.2BBy
Yy[=E\z
SELECT username,citytable.cityid ^+~$eg&js
uq:'`o-1
FROM usertable,citytable uJ=&++[
ArX*3
WHERE usertable.cityid=citytable.cityid Jp)PKS
![
Gg6cjc =dC
在FROM子句中可用以下两种格式为表或视图指定别名: $+e(k~
{3vm]
表名 as 别名 Rbm+V{EF&
')F@em
表名 别名 -, =)O
Np9Pae'
例如上面语句可用表的别名格式表示为: \iEJ9V
ZKI` ;
SELECT username,b.cityid BI#(L={5
?b^<Tny
FROM usertable a,citytable b
2 (ux
K24y;968
WHERE a.cityid=b.cityid Q4ii25]*
IP !zg|c,
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 IMSm
QKz2ONV=)
例如: Q(8W5Fb?
c$A}mL_
SELECT a.au_fname+a.au_lname e!i.u'z
=|- xj h
FROM authors a,titleauthor ta F+xMXBD@>*
bg4VHT7?>)
(SELECT title_id,title jAt65a
`b@"GOr
FROM titles `~=Is.V[
^kB9
I8u
WHERE ytd_sales>10000 DML0paOm5
P#A|Pn<p
) AS t T?__
. 55aY~We
WHERE a.au_id=ta.au_id Yic'p0<
?V
i3Nt?FSN
AND ta.title_id=t.title_id +xmZK<{<
Git2Cet
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 SR)@'-Wd
'?fn} V
(三)使用WHERE子句设置查询条件 Y u^ }
v g tJ+GjN
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: [iSLn3XXRX
x~yd/ R
SELECT * [qt^gy)
v#sx9$K T
FROM usertable ^T@-yys
/_bM~g
WHERE age>20 qn\>(&
GWShv\c}
WHERE子句可包括各种条件运算符: Q;1$gImFz
}Ty_} 6a5
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< DNM~/Oo
uoBPi[nK
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ,%m$_wA$
gD fVY%[Z
NOT BETWEEN…AND… pm;g)p?
7@VR:~n}k
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) GHWpL\A{8`
M9S[{Jj*
NOT IN (项1,项2……) `V0]t_*D
7
~ Bo*UM
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE wY}+d0Ch
UuA=qWC
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL f.r-,%^6{
Y!s/uvRI
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR V'?nS&,i
54LCoG/
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 9zd)[4%=
(C QgT3V
2、列表运算符例:country IN ('Germany','China') J.`.lQ$z
*XzUqK
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 u09OnP\
kp;MNRc
varchar、text、ntext、datetime和smalldatetime等类型查询。 }#u}{
@49^WY
可使用以下通配字符: ^jhHaN]G^
7y`~T+
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 2W~2Hk=0+%
TT&!WbA-Hk
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 o_$r*Z|HG
RMrt4:-DI
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 gA) F
uTJ?@^nq
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Cw^)}23R
EGMcU|yL
例如: Yc5$915
X:g5>is|
限制以Publishing结尾,使用LIKE '%Publishing' y.oJzU[p%
MDCf(LhEH
限制以A开头:LIKE '[A]%' *'t`;m~
}&naP
限制以A开头外:LIKE '[^A]%' cE]kI,Fw,M
$1@{Zz!S
4、空值判断符例WHERE age IS NULL "Ii!)n,
F;NZJEy
5、逻辑运算符:优先级为NOT、AND、OR mg;AcAS.o,
i\eykYc,
(四)查询结果排序 XAFTLNV>
g%[Ruugu
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: IH0^*f
9VY_gi=vL
ORDER BY {column_name [ASC|DESC]} [,…n] jKQP0 t-
:{6[U=O
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 5Q'R5]?h
=UP)b9*h
序。 4* hmeS"
_1JvA-
例如: hg>YOf&RG
! O>mu6:Rf
SELECT * Yr,1##u
^~ I
FROM usertable +%~g$#tlJo
t-Fl"@s
ORDER BY age desc,userid ASC wIiT
:o
sR0nY8@F
另外,可以根据表达式进行排序。 WL~`L!_. A
DpR%s",Q
i!nl%%
%?$"oWmenS
二、联合查询 JZ7-?
o
nC Z
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 Fy@D&j
d$Xvax,C
合查询。UNION的语法格式为: U\z+{]<<
?0<3"2Db~
select_statement
t|DYz#]
>y@w-,1he
UNION [ALL] selectstatement Aws
TDM
_[7uLWyC9
[UNION [ALL] selectstatement][…n] zBR]bk\
+$'/!vN
其中selectstatement为待联合的SELECT查询语句。 ;g*6NzdA
(^4%Fk&I-
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 7> Qt O
uQNoIy J)
行。 dA~6{*)
h 2zCX
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 sOW|TN>y\
J.d `tiN
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 w?C\YKF7
?m.4f&X
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Cu:-<
/P%:u0fX,
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 >JMKEHl.q
S'e2~-p0F
型,系统将低精度的数据类型转换为高精度的数据类型。 I|:j~EY
aU! UY(
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: @mazwr{B
-wt2ydzos
查询1 UNION (查询2 UNION 查询3) b,W'0gl
wtKh8^:YD
(qrT0D6
9+']`=a:
z=U!D `]v
}ie]7N6;
三、连接查询 9.B7Owgr89
HKwGaCj`
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 |"<
I\Vs:
!|/fVWH
数据库管理系统的一个标志。 N@$%0!
qG qu/$bh
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 '9gI=/29D
9lxT5Wg
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 .%A2
\v_C7R;&
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ,d+mT^jN
2vC=.1k
查询。 2 *$n?
K&h6#[^\d
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ihVQ,Cth
=!X4j3Cv
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ZIp=JR8o$
u/f&Wq/
SQL-92标准所定义的FROM子句的连接语法格式为: p3o?_ !Z
68*{Lo?U
FROM join_table join_type join_table |*5nr5c_L
7w*&Yg]
[ON (join_condition)] d8#j@='a*
2'U9!.o
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 >e ;f{
O~el2
个表操作的连接又称做自连接。 Q:\hh=^
_1'Pb/1
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ;GSJnV
*&]l
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 2LU'C,o?
P>-,6a>
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ?
h%+2
=.a ]?&Yyh
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) M6sDtL9l
s|'L0` <B
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 jxaoQeac
3#[I_
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 MV}]i@V
`%3p.~>
数据行。 ErC[Zh"''
Cj+=9Dc
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ~~,<+X:
>lmL
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 P1n@E*~V5
Uj)]nJX
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 iurB8~Y
}i:'f2/
运算符等构成。 VHCzlg
h6 i{5\7.
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 Gu).*cU
rR~X>+K
连接。例如: `WS_*fJ5
8)8oR&(f
SELECT p1.pub_id,p2.pub_id,p1.pr_info 2\de |'
~*Qpv&y)
FROM pub_info AS p1 INNER JOIN pub_info AS p2 m9@n
17oxD
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ($>0&w
;7k7/f:
(一)内连接 >>zoG3H!
KCE-6T
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 dAl<'~g
':]a.yA\1
三种: N-E`go
oF R'GUQC
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 TP::y
^^l"brPa
表中的所有列,包括其中的重复列。 9G+rxyWMW
D:tZiS=0
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ycD.:w p\'
V&v~kzLr+
运算符包括>、>=、<=、<、!>、!<和<>。 T(^8ki
gq3OCA!cX
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 GuvF
>:&p(eu)L0
结果集合中所包括的列,并删除连接表中的重复列。 0K0=Ob^(e
l0if#?4\r
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: r$Y!Y#hwQ
Ky$G$H
SELECT * d/rz0L
LW5ggU/
FROM authors AS a INNER JOIN publishers AS p 8T
)ELhTj
JSK5x(GlH
ON a.city=p.city -U[`pUY?f
Fjt,
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): $ n[7
e~]e9-L>I
SELECT a.*,p.pub_id,p.pub_name,p.country }yDq\5s
Q[
v:1Vli.
FROM authors AS a INNER JOIN publishers AS p \3?;[xD
B
RjKV
ON a.city=p.city 4^_Au^8R(
9?chCO(@
(二)外连接 .MARF
_4B iF?1
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 }AZx/[k
|z
*[:CbFE0y
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 Yka&Kkw
\ZWmef
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 9R"N#w.U]
<L/vNP
如下面使用左外连接将论坛内容和作者信息连接起来: sNmC#,
I} fcFL8
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b {<[tYZmj.
b:cK >fh0_
ON a.username=b.username ~{Rt4o _W
KVpAV$|e
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: f?^Oy!1]
y"p-8RVk{
SELECT a.*,b.* B\>}X_\4
JO{-
P
FROM city as a FULL OUTER JOIN user as b X]U"ru{1q
b(-t)5^}
ON a.username=b.username }.V0SM6
aDvO(C
(三)交叉连接 hs_|nr0;[
5>[sCl-
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 @^6OV)
U{uWk3I_b
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 gdFoTcHgO|
NG!cEo:2aa
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 3nC#$L-
#r^@*<{^
于6*8=48行。
)k] !u
G|oB'~{&
SELECT type,pub_name jI2gi1,a
bW.zxQ:
FROM titles CROSS JOIN publishers *
r4/|.l
^'53]b:
ORDER BY type