一、简单查询 rLXn35O
tvH)I px
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 \G"/Myi
.5z|g@
6
表或视图、以及搜索条件等。 Zu hT \l
tO0+~Wm
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 h}d7M55#|
G?g7G,|d
SELECT nickname,email YS~x-5OE\
}v!6BU6<Q
FROM testtable 0qZ)$YKq
Af%?WZlOq
WHERE name='张三' FPMk&
GJ$,@
(一)选择列表 g-s@m}[T
V:+bq`
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 oe<Y,%u"6
hh{liS% 10
量和全局变量)等构成。 d"cfSH;h
WT)")0)[
1、选择所有列 >fdN`W}M
\X`P
W
例如,下面语句显示testtable表中所有列的数据: ^
Q}1&w%
zhe5i;M
SELECT * tv{.iM|V c
t5qAH++axN
FROM testtable ][mc^eI0s|
|q>Mw-=
2、选择部分列并指定它们的显示次序 }:irjeI,
n"
~*9'
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 pWp2{G^XB
M}<=~/k`j
例如: +u2Co_FJ&
; n@C(hG
SELECT nickname,email {MtB!x
O
o:jP6r
FROM testtable t<7WM'2<y
7AiCQWf9
3、更改列标题 [ bW=>M
Yp)U'8{h c
在选择列表中,可重新指定列标题。定义格式为: w~&]gyf
Ed-gYL^<
列标题=列名 2I<T<hFW]
mI0r,Z*+M
列名 列标题 Dfo9jYPf
8GP}g?%
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 l_%~X9"
lN'/Z&62
标题: 7y\g~?5N
a*hThr+$M
SELECT 昵称=nickname,电子邮件=email 6Ts`5$e
"=(;l3-o
FROM testtable {Jc!T:vJ
/z5lxS@#
4、删除重复行 #V6
-*
m5pVt4
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 }}_uN-m
*PEuaRDN
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 pYG,5+g
A] 9JbNV
5、限制返回的行数 bAiw]xi
O m
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 {p
0'Lc<3n
B>ZPn6?y
表示一百分数,指定返回的行数等于总行数的百分之几。 A&F4;>dms
q@9i3*q;
例如: mmL~`i/
H~i],WD
SELECT TOP 2 * 81cmG`G7
<T[N.mB
FROM testtable }D+8K
zf~zYZSr
SELECT TOP 20 PERCENT * t]
wM_]+
to 6Q90(
FROM testtable y7OG[L/
BT3O_X`u
(二)FROM子句 @E2nF|N
ntV>m*^
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ?m1$*j
]LTc)[5Zj
它们之间用逗号分隔。 <h=M
Rw,l
GJs[m~`8#
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 c!Vc_@V,
J36@Pf]h
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 L@r.R_*H?s
sV[Z|$&Z
使用下面语句格式加以限定: )yW_O:
hhAC@EGG
SELECT username,citytable.cityid M[u3]dN
rj~ian
FROM usertable,citytable Z!reX6
(dF;Gcw+
WHERE usertable.cityid=citytable.cityid ;;!{m(;LS}
9Oyi:2A
在FROM子句中可用以下两种格式为表或视图指定别名: ]4mj 1g&C
->I{
:#
表名 as 别名 ~iZF~PQ1_
HDyZzjgG
表名 别名 QV$dKjMS
B5HdC%8/}
例如上面语句可用表的别名格式表示为: IGT_
5te
:QV6z*#zD
SELECT username,b.cityid B:4qW[U#
~^~RltY
FROM usertable a,citytable b tq[",&K
\)ZX4rs{8
WHERE a.cityid=b.cityid t[,T}BCy.
(B,t
1+%
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 *u'`XRJU/
Wmxw!
例如: ]wpYxos
+A ?+G
SELECT a.au_fname+a.au_lname >5O y^u6Ly
$Wzv$4;
FROM authors a,titleauthor ta r/sRXM:3cZ
Ko|xEz=
(SELECT title_id,title OW}j4-~wL
zl
0^EltiU
FROM titles ;n{j,HB
5qQ(V)ah
WHERE ytd_sales>10000 \Ntdl:fSw
}|"*"kxi!
) AS t `OReSg
2
%GCd?cFF
WHERE a.au_id=ta.au_id 50bP&dj&
|uwteG5?$s
AND ta.title_id=t.title_id TL{pc=eBo
.N5R?fmD
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 rbun5&RCyW
gc7:Rb^E5t
(三)使用WHERE子句设置查询条件 Rn(F#tI
I+?$4SC
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: u$,Wyi )L
rI66frbj
SELECT * JvJ!\6Q@
GVc[p\h(
FROM usertable /\uH[[s
.Xz"NyW
WHERE age>20 Doc'7P
:G=1$gb
WHERE子句可包括各种条件运算符: b;`#Sea
VE"0VB.
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< &R FM
d=
lPQ
Ut!xI
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… \]#;!6ge
.y_bV=
NOT BETWEEN…AND… \3(|c#c
UH,4b`b
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) NT9- j#V
!na0 Y
NOT IN (项1,项2……) t2%@py*bU
2X;0z$
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE y#Za|nt
&T/q0bwd
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ^_S-s\DW
(9 z.IH7}k
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR UNcJ=
JvWs/AG1
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 {S"
,-IF++q
2、列表运算符例:country IN ('Germany','China') ]G
o~]7(5|
l)rvh#D
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 :f
!=_^}
@uM3iO7&
varchar、text、ntext、datetime和smalldatetime等类型查询。 k#:@fH4{PA
vl{_M*w
;
可使用以下通配字符: m57tOX
OG?j6qhpl
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 tqwk?[y}+l
];{l$-$$
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 O$umu_
v6DxxE2n
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 )"c]FI[}
L1!hF3G
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 MV;Y?%>
GKsL~;8"
例如: )bCG]OM7<
Jn@Mbl
限制以Publishing结尾,使用LIKE '%Publishing' cM<hG:4%wX
5)n:<U*
限制以A开头:LIKE '[A]%' W
"\tkh2
vz#wP
限制以A开头外:LIKE '[^A]%' Zc\h15+P
0O['-x
4、空值判断符例WHERE age IS NULL
vD)A)
T.w}6?2
5、逻辑运算符:优先级为NOT、AND、OR $L&9x3+?Kg
$7gB&T.x
(四)查询结果排序 vLK\X$4
J,0WQQnb
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: q%kj[ZOY$]
6(q`Oj
ORDER BY {column_name [ASC|DESC]} [,…n] o|^?IQ7bpf
5)>ZO)F&
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 qnk,E-
7ru9dg1?
序。 wp]7Lx?F
D_19sN@0m
例如: =y-!k)t
9>[.=
SELECT * Rqb{)L
X*
?4,*RCaI
FROM usertable ~q]|pD"\K|
:af;yu
ORDER BY age desc,userid ASC "U5Ln2X{J
}2BH_
2
另外,可以根据表达式进行排序。 [>M*_1F
cxP9n8CuT
mb~=Xyk&
'^oGDlkr H
二、联合查询 ahi57r[
fdq^!MWTi
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 6PQJgki
)*TW\v`B
合查询。UNION的语法格式为: kTiPZZI
++Ys9Y)*,
select_statement 4<3?al&
i^s`6:rNu
UNION [ALL] selectstatement ej"o?1l@
8F`BJ6='
[UNION [ALL] selectstatement][…n] eA*Jfb
v-7Rb)EP
其中selectstatement为待联合的SELECT查询语句。 B
)1<`nJA
msqxPC^I
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 _L:i=.hxN
]2xx+P#Y
行。 5;K-,"UQ
@cS1w'=
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 sx-Hw4.a"
I"F
.%re
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 5}d/8tS
kh>SrW]B%
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 '!yS72{$2
g@k#J"Q'[
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ,2
g M-
vU8FHVytV
型,系统将低精度的数据类型转换为高精度的数据类型。 7i+!^Qj?y
M]4 =(Vv+5
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: }4\!7]FVYX
\%-E"[!
查询1 UNION (查询2 UNION 查询3) C$'D]fX
fZw9zqg
2Pem%HE~P
oXQ<9t1(
x#:BE
ni"$[8U
三、连接查询 tkdBlG]!
k binf
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 Re kb?|{z
/+x#V!zM
数据库管理系统的一个标志。 wzDk{4U
6HEqm>Yau
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Ha=_u+@
d Y:|Ef|v(
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 }:RT,<
%EJ\|@N:
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ]8xc?*i8
c4ZuW_&:
查询。 #LN5&i;s
!sfXq"F
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 8z."X$
O ':0V
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 $TD~k;
=.qm8+
SQL-92标准所定义的FROM子句的连接语法格式为: 9k=U0]!ch
't0+:o">:
FROM join_table join_type join_table v.l7Q
kb"_6,[Ms
[ON (join_condition)] xb+RRTgj
qLQ <1>u
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 u{OS6Ky
X6LhM
个表操作的连接又称做自连接。 q3AJwELXw
9lZAa8Rx i
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 nOAJ9
<THZ2`tTK3
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 d}{LM!s
7xv4E<r2
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 yyY~ *Le
`2xH7a-
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) {)
:%WnM9
?Do^stq'4
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 c-4m8Kg?L
vU_d=T%$
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 (~j,mk
fBf4]^
数据行。 74@lo-/LY
&v5G92
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 r/NSD$-n
heE}_,$|
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ia%z+:G
@uI?
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 f7XQ~b
&a%WM
运算符等构成。 a|DsHZ^6^
Q^z=w![z
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 mR{CVU
Y7<zm}=(/
连接。例如: Vq3gceo'0A
Zg
-]sp]
SELECT p1.pub_id,p2.pub_id,p1.pr_info &8[ZN$Xe"
[>W"R1/
FROM pub_info AS p1 INNER JOIN pub_info AS p2 KQG-2oW
7d&DrI@~
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) %
v;e
d]tv'|E13
(一)内连接 _iG2J&1'L
tigT@!`$Y
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 J>rka]*
9R9__w;
三种: Y3#Nux%
6g5PM4\
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 QWrIa1.JC
j$3rJA%rN
表中的所有列,包括其中的重复列。 %KGq*|GUu
yJ!OsD
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些
!M
Ye9Y^+-
运算符包括>、>=、<=、<、!>、!<和<>。 x(L(l=^"
/b{o3, #.M
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 WtEI] WO
)PR3s1S^
结果集合中所包括的列,并删除连接表中的重复列。 9n1ZVP.ag
Og,Y)a;=
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 95=gY
kOw=c Gt
SELECT * J,f/fPaf7
z{ptm7
FROM authors AS a INNER JOIN publishers AS p 7;&(}
y|$R`P
ON a.city=p.city *)u?~r(F
5L8&/EN9-
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): HF"Eys
>~_Jq|KBB
SELECT a.*,p.pub_id,p.pub_name,p.country 6+.>5e
a:85L!~:l
FROM authors AS a INNER JOIN publishers AS p *HR+a#o
9B
/s
ON a.city=p.city {P-xCmZ~Wt
GL1'Zo
(二)外连接 .*BA 1sjE
#~L!pKM
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 5sCFzo<=vh
;HDZ+B
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 }g~g50ci
Kx~$Bor_!
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 &VDl/qnaL
2d*_Qq1
如下面使用左外连接将论坛内容和作者信息连接起来: Fh K&@@_
z
v>Oh#
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b `ncNEHh7K
(
#*"c
ON a.username=b.username ~.J,A\F
tJNIr5o
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: h4_b!E@
[)^mBVht
SELECT a.*,b.* GF8 -_X
sYJL-2JX
FROM city as a FULL OUTER JOIN user as b C5|db{=\.*
<47k@Ym
ON a.username=b.username 7h%4]
&iNwvA%9D
(三)交叉连接 gV8"VZg2
hoenQ6N^:
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 #uSK#>H_!
.wmnnvtl,
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 wd[eJcQ ,
ad9CsvW
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 4WC9US-k
C-m*?))go
于6*8=48行。 u)a'
,>n%
~'gb
SELECT type,pub_name 5Fmav5
8TE>IPjm
FROM titles CROSS JOIN publishers v?%LQKO
]IZ>2!6r
ORDER BY type