一、简单查询 +$]eA'Bh@
IT,d(UV_
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ?39B(T
_?UW,5=O
表或视图、以及搜索条件等。 3$Ecq|4J:
$*)??uU
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ^qNh)?V?]I
en\shc{R]`
SELECT nickname,email :00 #l]g0q
]RYk Y7>`
FROM testtable nya-Io.
X4<!E#
WHERE name='张三' dc#Db~v}k
(hywT)#+
(一)选择列表 -[-LR }u
vIBVp
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 Jvi"K
YG2rJY+*
量和全局变量)等构成。 NOOP_:( 7H
:,.g_@wvG
1、选择所有列 =[Lo9Sg
$lkd9r1
例如,下面语句显示testtable表中所有列的数据: 3/sKRU
x+~IXi>Ig
SELECT * u15-|i{y7
">b~k;M?
FROM testtable P3[+c4
bkmW[w:M
2、选择部分列并指定它们的显示次序 -VK6Fq
-w41Bvz0
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 T';<;6J**
ciKkazx.
例如: tPO\ e]
1$,t:/'-4
SELECT nickname,email }5n((7@X
<0[{Tn
FROM testtable <:#O*Y{
n^QOGT.s6`
3、更改列标题 bDdJh}Vz
>`rK=?12<
在选择列表中,可重新指定列标题。定义格式为: /EY^u i
XOl]s?6H$
列标题=列名 s>sIji
z1\G,mJK
列名 列标题 Mwdh]I,#
muLt/.EZ
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 i4TU}.h8
g*UI~rp
标题: $@_7HE3
KMz\h2X
SELECT 昵称=nickname,电子邮件=email \=+s3p5N
\ iL&Aq}BO
FROM testtable Qy ;
M:q
@_0g "Ul
4、删除重复行 lD09(|`
0x'-\)v>3
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 i<D}"h|
%hK?\Pg3=E
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 gi`K^L=C
4XL*e+UfJ
5、限制返回的行数 yjvH)t/!.
Hfer\+RX
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 $[VeZ-
DM6oMT
表示一百分数,指定返回的行数等于总行数的百分之几。 o/I <)sa
myH:bc>6
例如: o{*8l#x8
4 !lbwqo
SELECT TOP 2 * OwIW;8Z
I`h9P2~
FROM testtable LV:oNK(
IY|;}mIF
SELECT TOP 20 PERCENT * db"FC3/H
Kq/W-VyGh
FROM testtable 'e-Nt&;
mwFI89J'
(二)FROM子句 i|>K
_I_Sq,Z#
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ,hK0F3?H>
w<_.T#
它们之间用逗号分隔。 Du>dTi~
VVuL+i
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 8WWRKP1V
g~d}?B\<@
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 Egt;Bj#%
`gqBJi
使用下面语句格式加以限定: 9vL`|`Vau
ErF;5ec
SELECT username,citytable.cityid _<5 o1
;VS;),h/
FROM usertable,citytable cHK)e2r
>HnD'y*
WHERE usertable.cityid=citytable.cityid F#_7m C
JJ56d)37.
在FROM子句中可用以下两种格式为表或视图指定别名: 3+m#v8h1
q`09
表名 as 别名 aKaqi}IT
".| 9h
表名 别名 >]"5K<-1
k%QhF]
例如上面语句可用表的别名格式表示为: t~p9iGX<
[ (tgoh/
SELECT username,b.cityid tklU
zv
ZZTPAmIr
FROM usertable a,citytable b _,b%t1v
T3['6%
WHERE a.cityid=b.cityid %iIryv;
_jef{j
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 KtHh--j`
Ig1cf9 :
例如: H;,cUb
5(>m=ef"
SELECT a.au_fname+a.au_lname lfu1PCe5
xk86?2b{)
FROM authors a,titleauthor ta mKZ?H$E%%
O7j$bxk/^
(SELECT title_id,title _6qf>=qQ`"
BW:&AP@B
FROM titles 8E/$nRfOd
AEK * w4
WHERE ytd_sales>10000 -]5dD VSO
D>c%5h
) AS t =(*Eh=Pw
_h_;nS.Y
WHERE a.au_id=ta.au_id 2Iz@lrO6
T~ Jl{(s9)
AND ta.title_id=t.title_id `a:@[0r0U
Y,WcHE
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 iUA2/ A
>;o^qi_$
(三)使用WHERE子句设置查询条件 *P:`{ZV7=W
FHM^x2
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: $ sEe0
*%ZfE,bu8<
SELECT * Gyy:.]>&
6\O4R
FROM usertable -O~WHi5}
yqlkf$?
WHERE age>20 "eI-Y`O,
P%pB]d.qpi
WHERE子句可包括各种条件运算符: H` Q_gy5Z(
+Qu~UK\
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 7H[#
/.05rTpp
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… (W3R3>;
3w{4G<I
NOT BETWEEN…AND… 0Qw?.#[9
=DE5Wq19
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) Q(AOKp,F
nP'ab_>b
NOT IN (项1,项2……) <3HW!7Ad1
`;*=2M<c
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE XnWr~h{b
{FQ
dDIj#
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL a>sUq["
`Lm
ArW:
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR I=f1kr
pR
4OCz:t
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Ew4DumI
RZ|s[bU
2、列表运算符例:country IN ('Germany','China') $q.8ve0&^
$+JaEF`8
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 K"Nq_Ddwd
:Iwe> ;}
varchar、text、ntext、datetime和smalldatetime等类型查询。 5/:Zj,41{
ICq;jf ML
可使用以下通配字符: L4.yrA-]C%
XFYCPET
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 :BMU c-[
j@UW[,UI
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 t]eB3)FX
} M'\s
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 9jaYmY]~
3dadeu^{A
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 E'[pNU*"x-
=h&DW5QC
例如: f`WmRx]K
pl fz)x3
限制以Publishing结尾,使用LIKE '%Publishing' X~GZI*P
FjiLc=RXXz
限制以A开头:LIKE '[A]%' }}t"^m s
hpWAQ#%oHm
限制以A开头外:LIKE '[^A]%' ]N1$ioC#
qK|r+}g|&
4、空值判断符例WHERE age IS NULL A!iH g__/t
4CX *
5、逻辑运算符:优先级为NOT、AND、OR J[LGa:``
axU!o /m>
(四)查询结果排序 Y0|~]J(B
p4{?Rhb6
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Yz-b~D/=}
J9poqp@`MG
ORDER BY {column_name [ASC|DESC]} [,…n] MB^b)\X
$Ae/NwIlc
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Kh<v2
;1{S"UY
序。 !nuXK
Q:_pW<^
例如: RG*Nw6A
s%4)}w;z
SELECT * !S(jT?'w
Bu!Gy8\
FROM usertable D
?,P\cp
|r0j>F
ORDER BY age desc,userid ASC q;kMeE*
u#J5M
另外,可以根据表达式进行排序。 .^JID~<?#
>)#*}JI
pk;bx2CP8
T'Jw\u>"R
二、联合查询 >@H:+0h-
V7rcnk#
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 rX;(48Y
oVC~RKA*
合查询。UNION的语法格式为: ^o?.Rph|i]
ctt5t
select_statement D*D83z OzN
Ih,~h[
UNION [ALL] selectstatement kP8Ypw&
Zls4@/\Q
[UNION [ALL] selectstatement][…n] ?r'b
Z~
3%<ia$
其中selectstatement为待联合的SELECT查询语句。 BvX!n"QIb
gN mp'Lm
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 zT_{M
qY
-pqShDar|
行。 D"A`b{z
OkzfQ
hC}
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 /-BplU*"9
|_O; U=2
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 1/le%}mK
mi97$Cr2
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ,dh*GJ{5
PjsQ+5[>
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 _V8pDcY
s/,St!A4!
型,系统将低精度的数据类型转换为高精度的数据类型。 /}M@
@W
.' .|s?s
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: >DbG$V<v'
;Rwr5
查询1 UNION (查询2 UNION 查询3) Iupk+x>
yRvq3>mU
OSkZW
sBRw#xyS
,HMB`vF
^vG*8,^S=8
三、连接查询 8swj'SjX
|L`w4;
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 /6 P()Upe
xTAC&OCk^[
数据库管理系统的一个标志。 7sLs+|<"
! *pK#
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 o"UqI
|n6nRE wW
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 vaK$j!%FE
rm"bplLZA
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 W*U\79H
AeUwih.
4
查询。 `?Y/:4
O 6A:0yM4
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ?J<4IvL/
X0U{9zP
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 cm7aL%D$c
EzG7RjW
SQL-92标准所定义的FROM子句的连接语法格式为: #~p1\['|M
{SROg;vA
FROM join_table join_type join_table vn,L),"=
26\1tOj Np
[ON (join_condition)] z
^a,7}4
Y%wF;I1x
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 Uyi_B.:`
=cRJtn
个表操作的连接又称做自连接。
tb@/E
KZDB \T
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 TR:D
-4hX-
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 &1B)mj
]@WJ&e/'@
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 :5"|iRP'
5RlJybN"o
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) I{1w8m4O6
g~Q#U;]
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 |0-5-.
O[`n{Vl/
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 M%B]f2C
_Thc\{aV#
数据行。 6o,,w^
^(&:=r.PC
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 o.k#|q
"$Rl9(}
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 lWOB!l
QZ{:#iuig
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ;J?!D x
Lb/a_8<E?
运算符等构成。 W:0@m^r
Txw,B2e)>
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 M{z+=c&w
|dXS+R1
连接。例如: .GS|H d
d~[>%&
SELECT p1.pub_id,p2.pub_id,p1.pr_info nGyY`wt&Rg
44_n5vp,T
FROM pub_info AS p1 INNER JOIN pub_info AS p2 <pPI:D@G
_G'.VSGH
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) !})+WSs'"s
\ &_
-
(一)内连接 >#>YoA@S
x{ZcF=4
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 |t.WPp5,
(>)Y0ki}
三种: f Z \Ev%F
|/r@z[t
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ];Z_S`JR
y)(@
表中的所有列,包括其中的重复列。 Is88+,O
I98wMV8
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 c?z%z&
JDMaLo
运算符包括>、>=、<=、<、!>、!<和<>。 St&XG>nWS
xp,H5
m%
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 j[Et+V?
)ns;S
结果集合中所包括的列,并删除连接表中的重复列。 o.j;dsZ
ZY][LU~l8
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: Vxk0oIk`
R?]>8o,
SELECT * \3Xt\1qN4
3btciR!N]
FROM authors AS a INNER JOIN publishers AS p lz # inC|
Dcp,9"yt%
ON a.city=p.city lUWjm%|
Q>z0?%B
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): B"{CWH O
%`gqV9a
SELECT a.*,p.pub_id,p.pub_name,p.country 6o6m"6
Ob(j_{m
FROM authors AS a INNER JOIN publishers AS p 8(S'g+p
D{G#|&;
ON a.city=p.city &os*@0h4
]n!pn#Q
(二)外连接 n){\KIU/O
&,K;F'
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ]Q)TqwYF
3EzI~Zsx
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外
G%4vZPA
'3<YZWS
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 i44KTC"sB
47t^{WrT
如下面使用左外连接将论坛内容和作者信息连接起来: 9N-mIGJ
LWIU7dw
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ]aaHb
[9$>N
ON a.username=b.username ;Hm\?n)a
8BWLi5R[
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: Cu9,oU+N
242lR0#aY
SELECT a.*,b.* Y.&z $+
irrQ$N}
FROM city as a FULL OUTER JOIN user as b uRUysLIw
Q OdvzVy<
ON a.username=b.username $R"~BZbt;
)|2g#hH5
(三)交叉连接 7$b78wax
#>!!#e!*
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 EV~_-YC
WlG/7$
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Zb}=?fcL;@
~omX(kPzK
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 Yz{UP)TC
R=PjLH&)
于6*8=48行。 i%-c/ lop
Q@l3XNH|c
SELECT type,pub_name 33
N5> }
?K}/b[[0v
FROM titles CROSS JOIN publishers 5)EnOT"'
CQ13fu+|6
ORDER BY type