一、简单查询 C?fd.2#U
DJdW$S7
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 l:-$ulAx
3,8<5)ds*
表或视图、以及搜索条件等。 ]]Sz|6 P
Sp]"Xr)
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ,,sKPj[
6U Q~Fv`]
SELECT nickname,email ,6=j'j1#a
M2W4 RovfR
FROM testtable z\]]d?d?;
_ho9}7 >
WHERE name='张三' :XC~G&HuF6
9. 6"C<eYt
(一)选择列表 p[2`H$A
F0qpJM,
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 g`i?]6c}jt
;.Zgt8/.
量和全局变量)等构成。 <wfPbzs-V
l+HmG< P
1、选择所有列 QbjO*:c4
w
&1_k:Z&
例如,下面语句显示testtable表中所有列的数据: Za_w@o
_ I"}3*
SELECT * ,bzE`6
<j,ZAA&5%Y
FROM testtable _C2iP[YwQ{
H*51GxK
2、选择部分列并指定它们的显示次序 ^hr^f;N
XD%@Y~>+
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 mM0VUSy
-+?ZJ^A
例如: OyH>N/
io%WV%1_
SELECT nickname,email i/E"E7
R&KFF'%
FROM testtable
&OQ37(<_
_JNSl2
3、更改列标题 s;e%*4
td JA?
在选择列表中,可重新指定列标题。定义格式为: `k2YH?
f8 E,.$>
列标题=列名 iY?J3nxD-:
@( p9}
列名 列标题 5, "
)-VpDW!%_
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 + -~8t^
1[p6v4qO{
标题: Nk?eVJ)
sB`.G
SELECT 昵称=nickname,电子邮件=email Vl'Gi44)3"
W5cBT?V
FROM testtable RT`.S
uN
D=1:-aLP7
4、删除重复行 ~/^q>z!\4
`&ufdn\j
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 uaghB,i'n
/M!b3bmA
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 '^B[Krs'Z`
Cq8.^=}_
5、限制返回的行数 8! eYax
~H`m"4zQ
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 i&mcM_g32
USd7gOq(
表示一百分数,指定返回的行数等于总行数的百分之几。 MTXh-9DA
^E~F,]dV=
例如: rf?%- X(V
M`V<`
SELECT TOP 2 * Z<D8{&AjS
Xna58KF/
FROM testtable Q~k5 }n8
BK 3oNDy
SELECT TOP 20 PERCENT * .w,$ TezGP
w3Lr~_j
FROM testtable {,aX|*1Ku~
=$mPReA3v
(二)FROM子句 EDAtC
Fz11/sKz
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ?}g^/g !
QNbV=*F?
它们之间用逗号分隔。 Ls<^z@I
\!LIqqX
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 aAKwC01?
6|uv+$
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 *T6*Nxs0k
+~(SeTY
使用下面语句格式加以限定: ~aPe?{yIUa
f8e :J#jbS
SELECT username,citytable.cityid hk+8s\%-
%>'Zy6C<j
FROM usertable,citytable _=Z?5{7S>
V82HO{ D
WHERE usertable.cityid=citytable.cityid S5o,\wT
hKnAWKb0
在FROM子句中可用以下两种格式为表或视图指定别名: @*Tql:Qcd^
>piVi[`
表名 as 别名 -\<\OV:c*
PI\C*_.
表名 别名 'VgEf:BS
2OVN9_D%
例如上面语句可用表的别名格式表示为: TB}6iIe
'uC=xG.*}
SELECT username,b.cityid S-'R84M,F
mF:Pplf<
FROM usertable a,citytable b =U7P\sw2
N C%96gfD
WHERE a.cityid=b.cityid 60TM!\
zfrNM9C
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 }1
,\*)5
E/V_gci
例如: @AtJO>w
(^oN, 7
SELECT a.au_fname+a.au_lname 2cEvsvw>
{8I,uQO
FROM authors a,titleauthor ta S=}1k,I
brCXimG&jo
(SELECT title_id,title t!-\:8n
{oSdVRI
FROM titles Nj;5iy
KFgq3snH
WHERE ytd_sales>10000 $J8g)cS
VBUrtx:
) AS t GQ(*k)'a
OxQ 5P;O
WHERE a.au_id=ta.au_id &V|kv"Wwj
w_h{6Kc<
AND ta.title_id=t.title_id cgnMoBIc
jB<B_"
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 oN2#Jh%dH
Q5c3C&$6
(三)使用WHERE子句设置查询条件 /!?b&N/d)
!RP0W
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: \o*w#e[M
> ^=n|%
SELECT * /WGD7\G'8
q68CU~i*
FROM usertable [tT_ z<e`
yh2)Pc[
WHERE age>20 S B~opN
zLgc j(;
WHERE子句可包括各种条件运算符: Na$.VT
Mz.C`Z>o
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< NH;e|8
0W0GSDx
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 3!
#|hI>f
`dw">z,
NOT BETWEEN…AND… egK~w8`W%
"cyRzQ6EH
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) (gnN</%
Atb`Q'Yrw
NOT IN (项1,项2……) K@<*m!%<2
qfG:vTm
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE Nw9@E R
| }L=e.
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL #.rkvoB0N
idB1%?<
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR eL>wKu:r
\q?^DI:`
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 el U %Z9
w$IUm_~waa
2、列表运算符例:country IN ('Germany','China') 4#{f8
[n2zdiiBd
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 Qo:vAv
V~VUl)
varchar、text、ntext、datetime和smalldatetime等类型查询。 F!3p )?
:pM)I5MN[
可使用以下通配字符: R%4Yg(-Q
@<3E`j'p
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Q7<Y5+
oi]XSh[_s
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 mKjTJzS
O&MH5^I
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 ;O1jf4y
/O<~n%< G
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 9 Jw,ls
>yr;Y4y7K
例如: :2H]DDg(
K\wu9z8M
限制以Publishing结尾,使用LIKE '%Publishing' +.&P$`;TZj
?%`Ph ?BZl
限制以A开头:LIKE '[A]%' !KJA)znx;(
`v@Z|rv,
限制以A开头外:LIKE '[^A]%' X&HYWH'@,
CuK>1_Dq
4、空值判断符例WHERE age IS NULL T_!F I29
cHt4L]n8n
5、逻辑运算符:优先级为NOT、AND、OR Oe
x
]h~F%
(四)查询结果排序 ZBR^$?nj
BdMd\1eMw
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: yH=<KYk
6/#+#T
ORDER BY {column_name [ASC|DESC]} [,…n] '%4fQ%ID}
*=O]^|]2
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 9+MW13?
t
#Kucde
序。 xe^M2$clb\
F53
.g/[
例如: Z'`\N@c#
<p
CD>
SELECT * p6NPWaBR
Y#I8gzv
FROM usertable yZ{N$ch5b
H\V?QDn
ORDER BY age desc,userid ASC ?A;RTM
gaQ E'qp>
另外,可以根据表达式进行排序。 S !#5
T u%XhXl:j
n_4.`vs
6eUGE 4NF(
二、联合查询 n Bd]rak'
w>\oz
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 -<k)|]8
%E/#h8oN{
合查询。UNION的语法格式为: h^_^)P+;
hSxK*.W*3
select_statement Iila|,cM
R<_VWPlj
UNION [ALL] selectstatement 2q]ZI
c7{s'ifG
[UNION [ALL] selectstatement][…n] ovOV&Zt
J~xm[^0
其中selectstatement为待联合的SELECT查询语句。 `q\F C[W
mi$C%~]5m
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 A4|7^Ay
4[#)p}V
行。 @67GVPcxl
Y'jgp Vt
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 H;NAS/OhS
n$NM
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 S"@6,
5FuV=Y uc
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 J/D~]U
B_iaty
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ={v(me0ZPb
Yr~wsE/
型,系统将低精度的数据类型转换为高精度的数据类型。 JL!^R_b&c
\D'mo
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: m>48?%
rXzq:
查询1 UNION (查询2 UNION 查询3) !~RK2d
kCEo */,
_.R]K$U
O-ENFA~E;v
@YRy)+
!<=(/4o&P
三、连接查询 gx^_bHh
6T+y m9
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 }f_@@#KB?
-xLK/QAL
数据库管理系统的一个标志。 l"
~
CAw;
a#+$.e5
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 |A,.mOT
'5*&
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 8@+<W%+th
N-b'O`C
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 fj['M6+wd
Cq7 uy
查询。 mXhC-8P
p
%.Adxx
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 r QNm2h
+~YoP>
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 BMQ4i&kF|
J=8Y D"1
SQL-92标准所定义的FROM子句的连接语法格式为: 4,W,E4 7
J!RRG~
FROM join_table join_type join_table pYm#iz
mJd8?d
[ON (join_condition)] "[k>pzl6
%"oGJp
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 G;#xcld
YahW%mv`d
个表操作的连接又称做自连接。 T`j{2
55TFBDc
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 kI04<!
Het>G{
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 6C<GYzzo
Avyer/{
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 K$GQc"
a%a0/!U[
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) >dgq2ok!u
ar
7.O;e
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 _qk&W_u
\(=xc2
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 v9,cL.0&
|;(P+Q4lB
数据行。 9ghUiBPiL:
A /c
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 /E{tNd^S
-Jv3D$f]a
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 "".a(ZGg
pZ[|Q 2(
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 v8'XchJ
.}eM"Kv
运算符等构成。 .waj.9&[l
R}3th/ qf
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 K0o${%'@7
wpC.!T
连接。例如: +_vf=d
=zrfh-lwH
SELECT p1.pub_id,p2.pub_id,p1.pr_info @c"s6h&
c;(Fz^&_
FROM pub_info AS p1 INNER JOIN pub_info AS p2 yKK9b
@].!}tz
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) \kY:|T
z{PPPFk4J
(一)内连接 }X=c|]6i^
#PPHxh*S
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 *wX[zO+o
[AIqKyIr
三种: 9m_~Zs}Z
nQ|($V1?W
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Y`$\o
50A\Y)i_mZ
表中的所有列,包括其中的重复列。 0wSy[z4V
iqB%sIP
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 %qE"A6j
FL^t}vA
运算符包括>、>=、<=、<、!>、!<和<>。 VK,{Mu=.9
{[/A?AV;F
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ?dv-`)S&
~Al3Dv9x
结果集合中所包括的列,并删除连接表中的重复列。 .q:6F*,1M
huyfo1(
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: :i
{;
81V
cD!E.2[
SELECT * c05-1
_*{Lha
FROM authors AS a INNER JOIN publishers AS p `D=d!!1eUi
2u5\tp?8
ON a.city=p.city L:?Ew9Lf
/[/{m ]
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): $\1M"a}F
omPxU2Jw
SELECT a.*,p.pub_id,p.pub_name,p.country -bSM]86
Pf?&ys6
FROM authors AS a INNER JOIN publishers AS p CK|AXz+EN
VG$;ri>
ON a.city=p.city z%JN| 5
y] O&w{m$
(二)外连接 Fo%`X[ ?
#4"eQ*.*"
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 r4X\/
SD8>,
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 /F|VYl^_
Slv:CM
M
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 `)KGajB
ea`6J
如下面使用左外连接将论坛内容和作者信息连接起来: ,z`D}<3
<}c7E3Uc
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b %BMlcm7Ec
:f_oN3F p
ON a.username=b.username #uC}IX2n
FzCXA=m
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: }y J,&N'p
p0l.f`B
SELECT a.*,b.* VQ2'a/s
GiK,+M"d
FROM city as a FULL OUTER JOIN user as b q|s:&&Wf
` l'QAIo
ON a.username=b.username *A}td8(
BXxJra/V
(三)交叉连接 xb9^WvV
4f~q$Sf]<
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 lg ,%
N:#$S$
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 QGGBI Ku
R3piI&u
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ;Oq>c=9%
iYw1{U
于6*8=48行。 i$hWX4L
QR~4Fe
SELECT type,pub_name /P46k4M1U
i|/G!ht^e
FROM titles CROSS JOIN publishers /|h+,]<
>
YD9vWk\/
ORDER BY type