一、简单查询 j)@W1I]2#
A ON
|b\?
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 X0j\nXk
F>.y>h
表或视图、以及搜索条件等。 *A9v8$
?,VpZ%Df2
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ewcFzlA@
!hHe`
SELECT nickname,email 8fQ~UcT$
qBk[Afjgz
FROM testtable ](oeMl18R
<~|n}&
WHERE name='张三' #s~ITG#H
7O)ATb#up
(一)选择列表 }6l:'nW
Xf;!w:u
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 Z&^vEQ
\B')2phE
量和全局变量)等构成。 3JD62wtx
;*5z&1O
1、选择所有列 Dml?.-Uv<
"pt[Nm76)8
例如,下面语句显示testtable表中所有列的数据: ,q*|R
O
\WE/#To
SELECT * 0faf4LzU!
NL.3qx
FROM testtable $idToOkw
]Z[3 \~?
2、选择部分列并指定它们的显示次序 ULew ~j
U$D:gZ
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 !wAnsK
>XZ2w_
例如: 2\{/|\
9{u/|,rq1
SELECT nickname,email QY+{ OCB
qo9&e~Y<G
FROM testtable x6>WvFZ
4 4QW&qL!(
3、更改列标题 bHTf{=
]>)}xfL &,
在选择列表中,可重新指定列标题。定义格式为: u9;3Xn8
0uKm)t/
列标题=列名 a/E(GQ,,
CV|Ae [
列名 列标题 ~a=]w#-KD
+
o< 7*
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 p!DdX
~RLjL"
标题: ^/2O_C
g?1bEOA!
SELECT 昵称=nickname,电子邮件=email 1q'_J?Xmd
2;:]Q.g
FROM testtable mmFcch$Jv
Y+S<?8pA
4、删除重复行 V13^SVM
(O ;R~Io
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Q]/g=Nn
^~
P,S!Z&!
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 "QfF]/:
2v?#r"d
5、限制返回的行数 >Dv=lgPF
H{P*d=9v
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 MXVCu"g%
%_]O|(
表示一百分数,指定返回的行数等于总行数的百分之几。 7OZ0;fK
'(ETXQ@
例如: @bkSA
:^7_E&
SELECT TOP 2 * K0*er
6mZpyt
FROM testtable 2QHu8mFU
aS3-A4
SELECT TOP 20 PERCENT * 1b=\l/2
}8.$)&O$^
FROM testtable Pw|/PfG
#SLiv
(二)FROM子句 `5t~
Vlp
99h#M3@!
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, /\jRr7 Cd
%|}7YH41
它们之间用逗号分隔。 l5e`m^GK
IxG0TJ_
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 Qe[ai?iJkt
k:s86q
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 tchpO3u,
MoC/xF&
使用下面语句格式加以限定: NnZ_x>R
:v-,-3AG
SELECT username,citytable.cityid mX
SLH'
: B/u>
FROM usertable,citytable 7Il
/+l(
.@(MNq{"6
WHERE usertable.cityid=citytable.cityid Ky7-6$
A|L-;P NP
在FROM子句中可用以下两种格式为表或视图指定别名: nNM)rW
YWhS< }^
表名 as 别名 bir tA{q
)Z?\9'6e4
表名 别名 Re\V<\$J
"'8o8g
例如上面语句可用表的别名格式表示为: AK;G_L
%cc<>Hi
SELECT username,b.cityid wd:SBU~f5*
<CP't[
FROM usertable a,citytable b >>7m'-k%D
$_Lcw"xO
WHERE a.cityid=b.cityid \4q1<j
e3&.RrA
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 j"+R*H(#
n]Jfd I
例如: +>h'^/rAE
vw
q Y;7
SELECT a.au_fname+a.au_lname 5|[\Se#
nG5:H.)
FROM authors a,titleauthor ta Se5jxV
LTY(6we-
(SELECT title_id,title S1$&
V,9UOC,Gn
FROM titles BI)$aR
ErMA$UkJ
WHERE ytd_sales>10000 k3"Y!Uha:
_{gRCR)
) AS t [=xO>
== i?lbj
WHERE a.au_id=ta.au_id v?1xYG@1
m>?{flO
AND ta.title_id=t.title_id V@>s]]HMq#
~_L_un.R
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 G5 x%:,n
b!|c:mE9|
(三)使用WHERE子句设置查询条件 T*C]:=)
W[W}:@KZ
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: t5za$kW'&
B8G1
#V_jK
SELECT * mm<rdo(`
?To r)>A'
FROM usertable ~4tu*\P
j.rJfbE|X
WHERE age>20 RIl+QA
A0Hs d
WHERE子句可包括各种条件运算符: C}GOwvAL>
H]W59-{a
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< kO\aNtK
O7RW*V:G@
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
bR5+({yH
D7x"P-ie
NOT BETWEEN…AND… t7DT5SrR
-5yEd>Z
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) "Tm`V9
S(*SUH
NOT IN (项1,项2……) )b AcU
Hlq#X:DCn
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE &P{[22dQ
5Y97?n+6
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL jz;"]k
Dos`lh
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR F\;G'dm
HI30-$9
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 c`&<"Us
ON=6w_
2、列表运算符例:country IN ('Germany','China') Hi<5jl
"M.vu}~>
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 &De&ZypU
7].FdjT.
varchar、text、ntext、datetime和smalldatetime等类型查询。 W`-AN}C#
!8O*)=RA
可使用以下通配字符: +H~})PeQ
3Ga!)
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 y\&`A:^[ A
9q-9UC!g
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 _YW1Mk1
x-/ `c
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Ie~#k[X
J_A5,K*r|
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 I vQ]-A}N
zj^Ys`nl
例如: (TV ye4Z
0)'^vJe
限制以Publishing结尾,使用LIKE '%Publishing' <k&Q"X:"
}Z_w8+BZ
限制以A开头:LIKE '[A]%' N?h=Zl|
1^zpO~@S
限制以A开头外:LIKE '[^A]%' Vn6 g(:\w
=5jX#Dc5.+
4、空值判断符例WHERE age IS NULL s^b2H
!~
<OcD [5
5、逻辑运算符:优先级为NOT、AND、OR jR#g>MDKB
O#E]a<N`
(四)查询结果排序 /K"koV;
d[5?P?h')
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: /JfRy%31
G.,dP+i
ORDER BY {column_name [ASC|DESC]} [,…n] :.IVf Zw
VMUK|pC4K
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 %_!YonRY|X
SAt{At
序。 IR,`-
?j{LE-(
例如: $)M8@d
&JM|u ww?1
SELECT * LuB-9[^<
"Fu*F/KW
FROM usertable <$LVAy"RD
61q:nWs
ORDER BY age desc,userid ASC gjJ?*N[
<3iL5}
另外,可以根据表达式进行排序。 u+GtH;<;
;5A
< 6[XE
l Ud/^u`
二、联合查询 Ms. 1RCup
wPYz&&W
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 t%wC~1
vJT
%ET
合查询。UNION的语法格式为: t3.;W/0_
Lmx95[#@a
select_statement _
a|zvH
h+Dp<b
UNION [ALL] selectstatement (7G5y7wI"
y1!c:&
[UNION [ALL] selectstatement][…n] C&b^TLe
ika/ GG
其中selectstatement为待联合的SELECT查询语句。 GQOz\ic
,mR$YT8
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 o })k@-oL
NuKktQd
行。 z!quA7s<]
'PF?D~
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 eDR4c%
x8xSA*@k
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 E=.4(J7K
w%&lCu@v
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 .V9/0
j()<.h;'
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 +(*S@V$c
;#G)([
型,系统将低精度的数据类型转换为高精度的数据类型。 A>8uLO G}
.olDmFQD
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: =#||&1U$
Q<.847 )
查询1 UNION (查询2 UNION 查询3) h[M~cZ{
|'xVU8
gf()NfUvRH
M/XxiF
!j,LS$tPu
#;?j]npg]
三、连接查询 YoV^Y&:9<
y~CK&[H
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 AOhfQ:E 4
$IzhaX
数据库管理系统的一个标志。 fGDR<t3yiQ
sf\p>gb
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 47b=>D8
h0ufl.N_%
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 *6oQW
m0+X 109
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 :|3n`,
SnsOuC5Ah
查询。 kYBy\
7jIye 8Zi8
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 F3$@6J8<[z
$gU6=vN1#
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
~{7/v
kZXsL
SQL-92标准所定义的FROM子句的连接语法格式为: E? 1"&D
m
kXGJZ$
FROM join_table join_type join_table <<}t&qE%2%
v|:2U8YREf
[ON (join_condition)] XLe8]y=
6 KuB<od
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 4<b=;8
SXfuPM
个表操作的连接又称做自连接。 {//;GC*
x9Veg4Z7
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 /g}2QmvH
C'mYR3?m;
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 5}d"nx
gPs%v`y)*D
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 vovc,4}
7'g'qUW+~
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) by z2u
S&]AIG)
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 Wy{xTLXk2
*"4d6
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 tW4|\-E"s4
PMER~}^
数据行。 Y0`@$d&n
nA:\G":\y
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 J
ik+t\A
T=6fZ;7
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 =\;yxl
Q@B--Omfh
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 9aYDi)
:<$B o
运算符等构成。 y{CyjYpz^
_&!%yW@
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 <i9pJGW
~Pq(Ta
连接。例如: d~B]s
ts
BPQ 8Ne
SELECT p1.pub_id,p2.pub_id,p1.pr_info t?JY@hT*
[C)JI; \
FROM pub_info AS p1 INNER JOIN pub_info AS p2 KLqn`m`O;
6q^Tq {I
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) TEC'}%
jx _n$D
(一)内连接 M>H4bU(
5fpBzn$
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 2n}nRv/'
9GdQ$^m
三种: %YjZF[P
cR.[4rG'
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 FwU*]wx|{
72oiO[>N'
表中的所有列,包括其中的重复列。 OnGtIY
=Kdd+g!
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 Z]-C,8MM
pAwmQS\W
运算符包括>、>=、<=、<、!>、!<和<>。 C1
qyjlR
a&yIH;-
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 fJ"#c<n
-oGJPl {r
结果集合中所包括的列,并删除连接表中的重复列。 n^OWz4
DoV<p?U
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: HD"Pz}k4
mQ#E{{:H+
SELECT * >y<yFO{
K}^Jf;
FROM authors AS a INNER JOIN publishers AS p X
?p_O2#k
y>+xdD0+
ON a.city=p.city _y~H#r9:
BzFD_A>j;_
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): a|B^%
XRU^7@Ylks
SELECT a.*,p.pub_id,p.pub_name,p.country 9d ZE#l!Q
slSQ \;CDA
FROM authors AS a INNER JOIN publishers AS p Qg]8~^Q<
nsChNwPX
ON a.city=p.city W)rE_tw,|
z0ULB?*"
(二)外连接 zPwU'TbF
['F,
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 G/tah@N[7
rSTc4m1R
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 3wRk -sl
7 ky$9+~
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 d~[^D<5,D
9:tvkl
如下面使用左外连接将论坛内容和作者信息连接起来: n ,<`.^
MZ_+doN
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b .BLF7>
M1
fneg[K
ON a.username=b.username :v/6k
\<ohe w
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: (`0dO8
D8+68_BEM
SELECT a.*,b.* IT \Pj_
S30@|@fTz
FROM city as a FULL OUTER JOIN user as b %\=oy=f
.HTX7mA3
ON a.username=b.username 9T*%CI
g=?KpI-pn0
(三)交叉连接 ~<0!sE&y
6km{=
```
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ,}&E=5MF\
%SV"iXxY
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 %I]?xe6
m.~&n!1W*`
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 $mA+4ISK
<,~
=o
于6*8=48行。 iR-MuDM
13s0uyYU<m
SELECT type,pub_name YM9oVF-
)N
QtjB$
FROM titles CROSS JOIN publishers [,_M@g3
:j/PtNT@
ORDER BY type