一、简单查询 X3;|h93.a
a).bk!G
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 }[*BC5{>
o w<.Dh
表或视图、以及搜索条件等。 hM @F|t3
,V2,FoJ 9
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 r(QjVLjj`k
rN%aP-sa<
SELECT nickname,email :svRn9_8H
5n'C6q "
FROM testtable !`%3?}mv,
7'9~Kx&+
WHERE name='张三' Iz<}>J B
IT_Fs|$
(一)选择列表 Ad:)5R o
@SV.F
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 i0-zGEMB.
8_@#5
量和全局变量)等构成。 hE"a ( i
_PeBV<
1、选择所有列 NbtNu$%t
Fn~?YN
例如,下面语句显示testtable表中所有列的数据: ^s&1,
>O:j.(*!
SELECT * @4N@cM0
K)C9)J<
FROM testtable H%:~&_D
8'B
2、选择部分列并指定它们的显示次序 %2)'dtPD~
"##Ylq( "
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 J9
iQ W
=c, m)\u/8
例如: |tU4(hC
J`8bh~7
SELECT nickname,email 8UyYN$7V
LL1HDG>l
FROM testtable 0 oFRcU
x!o>zT\
3、更改列标题 F(i@Gm=J]
<e
'S'
在选择列表中,可重新指定列标题。定义格式为: j7|r^
;nbUbRb
列标题=列名 yF}l.>7D
BtN@P23>k.
列名 列标题 )wROPA\uA
> ^b6\
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 OBCRZ
4M&6q(389
标题: M"eiKX
wtDy-H n
SELECT 昵称=nickname,电子邮件=email `
qqUuFMM
C=6 Vd
FROM testtable [p+6HF
O)qedy*&
4、删除重复行 p9[J9D3~
> T,^n
{_v
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 \?_eQKiZ3
K 5SHt'P
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 d&x1uso%L
G:e9}
5、限制返回的行数 %hzl3>().
x7=5 ;gf/X
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Jm|eZDp
Ub8|x]ix
表示一百分数,指定返回的行数等于总行数的百分之几。 DV(^h$1_
Gmi w(T
例如: -$#'
9:!<=rk
SELECT TOP 2 * R30{/KK
h-Q3q:
FROM testtable :6 ?&L
u~,@Zg87
SELECT TOP 20 PERCENT * 5__8+R
<B*}W2\
FROM testtable %{*}KsS`p
TlD)E
(二)FROM子句 9WaKs d f
Azun"F_f
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, piE9qXn
I|?zSFa
它们之间用逗号分隔。 X#$mBRK7
,nJYYM
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 C%8jWc
?\C7.of
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 dHnR)[?e
ON{&-
使用下面语句格式加以限定: ceDe!Iu
H=OKm
SELECT username,citytable.cityid xA DjQ%B
.R/`Y)4
FROM usertable,citytable |@]`" k
}%B^Vl%ZZ
WHERE usertable.cityid=citytable.cityid ~G!>2 +L
F^Yt\V~T
在FROM子句中可用以下两种格式为表或视图指定别名: UC)-Fd
T&Y?IE}
表名 as 别名 3_JxpQg
E"e <9
表名 别名 $=/.oh
Hf
]aA_:
例如上面语句可用表的别名格式表示为: $0C1';=^}
8}FZ1h2
4
SELECT username,b.cityid Tz H*?bpP
S.bB.<
FROM usertable a,citytable b 8S_i;
#\kYGr-G)
WHERE a.cityid=b.cityid %Y"@VcN
[:geDk9O#'
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Tti]H9g_
N'nI
^=
例如: =FkU:q$
$*ujX,}xG
SELECT a.au_fname+a.au_lname zT[[WY4
] 8sVXZ
FROM authors a,titleauthor ta Ij_Y+Mnl4:
Suixk'-
(SELECT title_id,title k\UDZ)TQV
>y%*HC!G
FROM titles S&jZYq**
H@$\SUc{
WHERE ytd_sales>10000 a)'^'jm)4
v%|^\A"V
) AS t v%(2l|M
`}/&}Sp
WHERE a.au_id=ta.au_id VY)!bjW.
{O-,JCq/
AND ta.title_id=t.title_id aZGX`;3
w,(e,8#:
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 )K2,h5zU
F0O"rN{
(三)使用WHERE子句设置查询条件 2)DrZI
EGYYSoBLU
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: {FO>^~>l
6$TE-l
SELECT * xWX1P%`
jX5lwP
Q|F
FROM usertable nmlQ-V-
: [o0Va2 d
WHERE age>20 k23*F0Dv
Vk/CV2
WHERE子句可包括各种条件运算符: mAkR<\?iTF
*Z*4L|zT
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< IP'gN-#i
^J3\
U{B
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… %zx=rn(K
&?\ h[3
NOT BETWEEN…AND… LJK<Xen
ngM>Tzirt
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) W)I)QinOH
x/Pi#X m
NOT IN (项1,项2……) 1df}gG
+$Q33@F5l
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE E5.3wOE
LyM"
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL hC@oyC(4
L
M
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR tmF->~|
F%!ZHE7
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 PDaD:}9
H~1&hF"d
2、列表运算符例:country IN ('Germany','China') b_xn80O
p!<Y 'G
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 wjGD[~mB
1A;>@4iC0
varchar、text、ntext、datetime和smalldatetime等类型查询。 ;C=C`$Q
tZR%s
可使用以下通配字符: 5/<?Y&x
vzVXRX
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
zj.;O#hW
>]?!c5=
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 c`w YQUg(
8KKI.i8`
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 F+r3~T%
M&Aeh8>uX
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 $i&u\iL
"*O(3L.c-
例如: epa)~/sA
.K>rao'
限制以Publishing结尾,使用LIKE '%Publishing' 6XPf0Gl
..RCR_DIp
限制以A开头:LIKE '[A]%' 1Wzm51RU
.JIn(
限制以A开头外:LIKE '[^A]%' XPnN"Y"y
,B]kX/W
4、空值判断符例WHERE age IS NULL p`ai2`qC`
DDh$n?2fd
5、逻辑运算符:优先级为NOT、AND、OR QEIu}e6b
_MfXN$I?}
(四)查询结果排序 g+Z~"O]$M
&Pu}"M$[MH
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 1:S75~b-`
QGE)Xn#_bN
ORDER BY {column_name [ASC|DESC]} [,…n] <4Z;a2l}U
5!Y51R^c
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 A<esMDX
FV|/o%XqK
序。 ]i\C4*
Gz)]1Z{%$
例如: ,zmGKn#n2
z7X[$T$V
SELECT * _:4n&1{.E
#Pi}2RBRu
FROM usertable hawE2k0p(
S~auwY ,<
ORDER BY age desc,userid ASC 6A$
\I44
cl s-x@
Kd
另外,可以根据表达式进行排序。 Q$_S/d%*
G%N3h'zDi
u`Kjs}F'
_:|/4.]`_
二、联合查询 \Q[u ?/TF
n DLr17
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 zx
vr#_pu)f4
合查询。UNION的语法格式为: p-QD(+@M
fy at-wbb
select_statement K1c@]]y)
TqURYnNd
UNION [ALL] selectstatement SenDJv00
\yeo-uN8
[UNION [ALL] selectstatement][…n] %G!BbXlz
/lBx}o'
其中selectstatement为待联合的SELECT查询语句。 > D:(HWL
GY9CU=-
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 A
i`
PfKIaW<
行。 =#qf0
Vm
NCknG
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 {%!.aQ,
; n tq%
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 :BFecS&i5
*G|w#-\.c
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 !
Ff/RRo
x5/O.5>f
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
)L}6to
9Tbi_6[
型,系统将低精度的数据类型转换为高精度的数据类型。 F)x^AJie
<0!/7*;#ZT
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ]<\FtH
8:V:^`KaSs
查询1 UNION (查询2 UNION 查询3) 8t3,}}TJ
"0al"?
G[7Z5)2B
Ph(bgQg
% j4
&HdzbKO=
三、连接查询 I8=p_Ie
G-?y;V 1
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 Cnp\2Fu/
XD>(M{~
数据库管理系统的一个标志。 at_~b Ox6X
Na8%TT>
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
[0v`E5
7Ddo^Gtx
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 9z)p*+rUK
w-9FF%@<
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 R~nbJx$
}F'B!8n
查询。 |FK##8
u;$g13
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 $6~ J#;
Y_qRW. k
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 Kfho:e,
Dk$[b9b
SQL-92标准所定义的FROM子句的连接语法格式为: :_R[@?c
X.)caF^j
FROM join_table join_type join_table fh rS7f'Zd
~s_n\r&23
[ON (join_condition)] }[a
c=?=u
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 saMv.;s
1^
a#i;*J
个表操作的连接又称做自连接。 ":t'}Eg=6
Sl@$
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 n_}=G
RR
|L
XYF$
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 \-A=??@H
vb 2mY
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 }%z {tn
e.X*x4*>~
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 9|19ia@[\
8*O]
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 9H$$Og
k"-2OT
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 V-Ebi^gz5W
# fvt:iE
数据行。 6|q\ M
Qs24b
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 NYS|fa
{Vy2uow0
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 }cDw9;~D
laVqI|0q
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 [v7)xV@c
5&}~W)"9
运算符等构成。 iwJeV J
>l|ao&z>bm
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ".Lwq_
F/ BB]gUB
连接。例如: 5r#0/1ym!
EA@p]+P
SELECT p1.pub_id,p2.pub_id,p1.pr_info 7GN>o@ t
O>P792)
FROM pub_info AS p1 INNER JOIN pub_info AS p2 )TNAgTmqK
@f<q&K%FJ
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) :__z?<?(
obYXDj2
(一)内连接 2)O-EAn
pwq a/Yi
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 &PJ&XTR
Hggp*(AQK
三种: yht|0mZV
')ZM#
:G
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 D[d+lq#p
*;(wtMg
表中的所有列,包括其中的重复列。 r`? bYoz
U/v }4b
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 FjUf|
4.?tP7UE
运算符包括>、>=、<=、<、!>、!<和<>。 N7/eF9
1A>>#M=A
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Y",
:u@R
P.G`ED|K!Y
结果集合中所包括的列,并删除连接表中的重复列。 {(o$? =
9
gt$z}oU
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 9 F"2$;
Bismd21F6=
SELECT *
{*EA5;
nP9zTa
FROM authors AS a INNER JOIN publishers AS p eUa2"=M
Yv="oG!xL
ON a.city=p.city '`.bmiM
BT?)-wS
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): dEz7 @T
,yZvT7
SELECT a.*,p.pub_id,p.pub_name,p.country a>1_|QB.
zq(R !a6
FROM authors AS a INNER JOIN publishers AS p .W>LsEk
Dwvd
ON a.city=p.city VK7lm|J+
gEFs4;
CN
(二)外连接 }E?{M~"<
sA(
e
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Q?e]N I^
lIs<&-0
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 y]dA<d?u
lRIS&9vA3
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 6rBXC <Z
#;l~Y}7'
如下面使用左外连接将论坛内容和作者信息连接起来: 9d4Agj
M
0~.OMG:=
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b x RV@_
Ne6]?\Z
ON a.username=b.username !1g2'
<,r(^Ntz
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: G}MJWf Hl
l$j/Ye]
SELECT a.*,b.* f$\gm+&hXE
qXI>x6?*
FROM city as a FULL OUTER JOIN user as b e
MX?x7
"oZ$/ap\
ON a.username=b.username /wF*@ /PTH
)U>JFgpIW
(三)交叉连接 Ucj
eB
l]pHj4`uv
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 _z`g@[m:t
cjTV~(i'4A
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 .fZ*N/
AD_aI
%7
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 !KYX\HRW
,!m][
于6*8=48行。 C(t>ZR
}ioHSkCD
SELECT type,pub_name 0vu$dxb[
BQ We8D
FROM titles CROSS JOIN publishers .{pc5eUf
Lm-yTMNPn
ORDER BY type