一、简单查询 mjI
$z3
O^_$cq
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 VOa7qnh4:[
#K4lnC2qz
表或视图、以及搜索条件等。 >}p'E9J?r
4Gsbcl{
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 B.T|e,g26
+YNN$i
SELECT nickname,email i+Fk
h%0FKi^
FROM testtable ,iy;L_N
Z'V"nhL
WHERE name='张三' y?}R,5k
/ Ml d.
(一)选择列表 g(b:^_Nep
;"1
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 br[n5
~t,-y*=
量和全局变量)等构成。 g3h:oQCS
]CnqPLqL
1、选择所有列 -:P`Rln
E979qKl
例如,下面语句显示testtable表中所有列的数据: $YPQi.
x392uS$#
SELECT * jWX^h^n7K
:8CYTEc
FROM testtable D$vP&7pOr4
\U\k$ (
2、选择部分列并指定它们的显示次序 7Gs0DwV
;/-X;!a>
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 K;NaiRP#k
N =0R6{'
例如: H"n@=DMLm
'a6:3*
SELECT nickname,email ,<cF<9h
w~S~
FROM testtable '-?t^@
q@6Je(H
3、更改列标题 yrgb6)]nm@
z"*$ .
在选择列表中,可重新指定列标题。定义格式为: WokQ
X"
k@RIM(^t
列标题=列名 %CaUC'
->0OqVQA
列名 列标题 1}#RUqFrvS
,iYKtS3
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 OpT0V]k^"9
2TZ+R7B?
标题: @?gN
&Z)I
6z2_b wo
SELECT 昵称=nickname,电子邮件=email OD~TWT_
P?Fm<s:
FROM testtable /EXubU73
1$^=M[v
4、删除重复行 o@! !I w
==W`qC4n?n
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 tG"lI/
S$egsK"~
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 :87HXz6]jS
rQ!X
5、限制返回的行数 p#T^o]+
"v9i;Ba>+
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Z?o?"|o
Ac@zTK6>
表示一百分数,指定返回的行数等于总行数的百分之几。 7lJs{$
P
R8K?!Z
例如: ~H+W[r}
S}T*g UO
SELECT TOP 2 * OlJkyL8|
%w0Vf$
FROM testtable (q|EC;
[L+VvO%cT
SELECT TOP 20 PERCENT * <s737Rl
SA'c}gP
FROM testtable oO8opS7F
.^}
vDA
(二)FROM子句 ::Nhs/B/
faJ>,^V#
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, N!hS`< }
G;CB%qXI
它们之间用逗号分隔。 F]"Hs>
lbg^ 2|o~~
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 V.8pxD5s
mn;Wqb/
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 &\_cU?0d
?7:?OX
使用下面语句格式加以限定: 8pQ:B/3=
#!n"),3
SELECT username,citytable.cityid + mqz)-x
^^{gn3xJ
FROM usertable,citytable ,svj(HP$
ZGHh!Ds;
WHERE usertable.cityid=citytable.cityid NL-<K
!]v &/
在FROM子句中可用以下两种格式为表或视图指定别名: .bT|:Q~@{
\XUG-\$p
表名 as 别名 ~_YU%y
5Tt%<#4
表名 别名 o3oAk10
YV 5kzq
例如上面语句可用表的别名格式表示为: t ;~H6
E{-W#}#
SELECT username,b.cityid KJf~9w9U
5jYZ+OB
FROM usertable a,citytable b Q5N;MpJ-
^:yg,cS|Be
WHERE a.cityid=b.cityid pOz4>R
*YI>Q@F9
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 9u->.O: p
v G7aT
例如: ^z^ UFW
:<}.3 Q?&
SELECT a.au_fname+a.au_lname -}W`
WRWcB
FROM authors a,titleauthor ta ji|`S\u#b
H:DTvv8e{
(SELECT title_id,title mh4`,N
tl:+wp7P`
FROM titles ~D9VjXfL)
)L%i"=<Bdy
WHERE ytd_sales>10000 &>Ko}?w
J6)&b7
) AS t =:!$'q:
!/},k"p6
WHERE a.au_id=ta.au_id PI~W6a7p
SuHv{u45
AND ta.title_id=t.title_id mN9Uyz5G
7JedS
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 m#(tBfH[
(M5{y`Kk
(三)使用WHERE子句设置查询条件 2[*r9%W
R&OqmhT!
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: (;11xu
9_6.%qj&
SELECT * #]@<YKoV{
<Rl:=(]i~
FROM usertable V`n;W6Q17
-UPlQL
WHERE age>20 3]X9 z
Jhyb{i8RR
WHERE子句可包括各种条件运算符: G|p3NhLgO=
~4Gs\U:!Q
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< QqC4g]
Eoj 2l&\
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… iuX82z`
CulU?-[i
NOT BETWEEN…AND… \rw/d5.
iE|qU_2Y
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) S!<1CFh
8"#Ix1#
NOT IN (项1,项2……) b$24${*'
KXgC]IO~
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE &tULSp@J
}Ot
I8;>
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 2g6G\F
fCMH<}w
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR *hT1_
6PS #Zydb
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 e*Gm()Vu,
e$E~@{[1)
2、列表运算符例:country IN ('Germany','China') (X
rrnoz
M@>EZ
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 h9McC 3
ohdWEU,
varchar、text、ntext、datetime和smalldatetime等类型查询。 86^xq#+Uw
`FP)-^A8
可使用以下通配字符: G n_AXN
$Yr'`(Cbc
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 XcS8{
y1JxAj
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 OZF^w[ `w
zs@#.OEH
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 9q2 >_Mv
P}%0YJ$6
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 J{gqm
Sd3KY9,
例如: 4DVkycM
u#8J`%g
限制以Publishing结尾,使用LIKE '%Publishing' b"ypS7
_
1$q>\
限制以A开头:LIKE '[A]%' u7=jtB
LvJ')HG
限制以A开头外:LIKE '[^A]%' D<rO:Er?*a
Ty"OJ
4、空值判断符例WHERE age IS NULL D&{7Av
s<I[)FQVr
5、逻辑运算符:优先级为NOT、AND、OR XIu3n9g^#
959i2z
(四)查询结果排序 l_lm)'ag
|k wkikGQS
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: qzVmsxBNP
w$9aTL7
ORDER BY {column_name [ASC|DESC]} [,…n] uA?_\z?
#rZk&q
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 \(a9rZ9
fq){?hk~O
序。 g<[_h(xDeG
G\\zk
例如: ];waK2'2
.(Gq9m[~8H
SELECT * E6SGK,f0D
J~5VL |ca
FROM usertable Vrf+~KO7
gY],
(*v
ORDER BY age desc,userid ASC B)F2SK<@
YC:>)
另外,可以根据表达式进行排序。 -R,[/7zj
;SzOa7
n%w36_
&(fB+VNrOH
二、联合查询 # E'g{.N
|H.(?!nTb
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 q|,I\H5}
V8>%$O
sw
合查询。UNION的语法格式为: Y8I$JBO
A/W-'%+`
select_statement ex8mA6g
P5ii3a?R
UNION [ALL] selectstatement X6mY#T'fQ
VVdgNT|}W
[UNION [ALL] selectstatement][…n] G?)vqmJ%
)-824?Nl:
其中selectstatement为待联合的SELECT查询语句。 W:uIG-y~
v7O&9a;
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 9n!<M)E
4uv'l3
行。 =6t)-53
LSQ2pB2V
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 E[J7FgU)<S
tr2@{xb
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 22L#\qVkl
XF1x*zc
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 f/9]o
&oevgG
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ,cs`6Bd4
i=%wZHc;
型,系统将低精度的数据类型转换为高精度的数据类型。 vJ$#m_aa
`j088<?j
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: yzhr"5_
o}p6qB=;1
查询1 UNION (查询2 UNION 查询3) YJ]]6 K+
!!ZNemXct$
#.0^;M5Nh
/<Cl\q2
A
c"%XE#D
2.Ym
三、连接查询 w
.l2
7ZHM;_
-
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 -^8gZk/(W
4YkH;!M>ji
数据库管理系统的一个标志。 {4&G\2<^^
@B$ Y`eK\
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 E7+y
W
*5 FSq
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 j_SRCm~:
]%(hZZ
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 :|oH11y
>`8r 52
查询。 )Y@
^;GJ7y&,d
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ecA[
FsZF>vaV
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 G*e/Ft.wf8
`9eE139V='
SQL-92标准所定义的FROM子句的连接语法格式为: E/:<9xl
?gjM]Ki%:
FROM join_table join_type join_table _ Onsfv
3A]Y=gfa
[ON (join_condition)] \`r5tQ r
BCF-lrZ&
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 a3
wUB
aT"q}UTK
个表操作的连接又称做自连接。 [i.2lt#]
N\DEY]
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 fR!'i):u
v')Fq[H
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 t#oY|G3O}
$k*E^~qT
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 !l@IG C
V@<tIui$
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) D M{7x77
I(/W+o
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 -O3^q.
r#rQ3&Vn
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 #b []-L!
o`\l&jUNe
数据行。 ^V v7u@y
bAt%^pc=y
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ^x%yIS
E=GCq=Uw
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 JAen=%2b
W'rft@J$
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 wH~Q4)#=o
]q7\
运算符等构成。 aDR<5_Yb
k&ujr:)5Y5
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 "m ):"
{
dw m>a
连接。例如: nK1XJp
l%.3hId-
SELECT p1.pub_id,p2.pub_id,p1.pr_info =&xamA)
d~uK/R-KD
FROM pub_info AS p1 INNER JOIN pub_info AS p2 -ZH]i}$
U/Z!c\r
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) jE2k\\<a
"P.7FD
(一)内连接 {w}PV5<
q
.nsGbl
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 \TkBV?W
pNr3u
三种: zm\=4^X
w<&Nn`V
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ]K?z|&N|HK
4vPQuk!
表中的所有列,包括其中的重复列。 EU
TTeFp
beEdH>
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 bSU9sg\
2X;,s`)
运算符包括>、>=、<=、<、!>、!<和<>。 BgJ;\NV
${ad[hs
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 J %jfuj
AnG/A!G
结果集合中所包括的列,并删除连接表中的重复列。 FVT_%"%C9
]pl g@
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: '81$8xxdY
,sP7/S)FR
SELECT * qbu Lcy3
#* j
FROM authors AS a INNER JOIN publishers AS p {l.) *#O
1$?O5.X:
ON a.city=p.city 5W>i'6*
ypwVzCUG
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): Duj9PV`2
K=M5d^K<E
SELECT a.*,p.pub_id,p.pub_name,p.country NtkEb :
.<^dv?@
FROM authors AS a INNER JOIN publishers AS p l~AmHw
e
,*?bET
$
ON a.city=p.city k]`I3>/L
7=u\D
(二)外连接 LR]P?
/@lXQM9T
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 G#@o6r
QL"fC;xUn,
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ?Q="w5OOD
8<Asg2]6
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 -uqJ~g D
Hwklk9U
如下面使用左外连接将论坛内容和作者信息连接起来: [IF3,C
;gTdiwfgZ=
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b <tMiI)0%
sKB])mf]
ON a.username=b.username |L.QIr,jCC
`Q<hL {AH
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: {tk42}8k
IX']s;b
SELECT a.*,b.* D&0*+6j((
aN}yS=(Ff
FROM city as a FULL OUTER JOIN user as b 4(& W>E
lE`hC#m
ON a.username=b.username R"];`F(#
gsGwf[X dJ
(三)交叉连接 H5S>|"`e`e
Q*ZqY
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 Z9cch-u~
@ T'!;)
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Dh BUMDoB
.8uJ%'$)
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 qS*qHT(u19
(\e,,C%;
于6*8=48行。 W=&\d`><k
HtgVD~[]
SELECT type,pub_name 8TD:~ee
;iy]mPd
FROM titles CROSS JOIN publishers 73A1+2
/P<RYA~
ORDER BY type