一、简单查询 l|P"^;*zq
1)ue-(o5
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 uE-(^u
4ax{Chn
表或视图、以及搜索条件等。 /eF@a!
S
/hx\TzC
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 /Z:j:l
sdFHr4
SELECT nickname,email KGz Nj%
C= ~c`V5>r
FROM testtable f[@96p?a[
v"USD<
WHERE name='张三' )9]a
".?4`@7F\
(一)选择列表 [C'bfX5HB5
n|( lPbD
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 wPlM=
.Hq?
jm}CrqU
量和全局变量)等构成。 Y{YbKKM
2HE@!*z9H
1、选择所有列 Pe`(9&iT.
C8U3+ s
例如,下面语句显示testtable表中所有列的数据: sg2;"E@
i}-uK,^
SELECT * d54iZ`
@(t3<g
FROM testtable =+zDE0Qs
uzYB`H<
2、选择部分列并指定它们的显示次序 VmS_(bM
|7qt/z
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 &N~Eu-@b
Q_5l.M/9]
例如: Qs6<(zaqkt
,2@o`R.27
SELECT nickname,email 3_(_yEKx
.WSyL
FROM testtable qE[S>/R"
3JnpI,By
3、更改列标题 l2D*b93
bJ~H
在选择列表中,可重新指定列标题。定义格式为:
Y t(D
9]4Q@%
列标题=列名 sPH2KwEv
lSxb:$g
列名 列标题 Br1R++]
{)[o*+9
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 pSs*Z6c)@
r/Y J, 2!
标题: ij"~]I
acd[rjeT
SELECT 昵称=nickname,电子邮件=email A;oHji#*
ci0A!wWD
FROM testtable Q]ersA8 V>
|Y9>kXM l
4、删除重复行 F.9}jd{
hZ&KE78?
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 @@65t'3S
+7_qg
i7:
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 broLC5hbQU
){^J8]b7#
5、限制返回的行数 cD!,ZL
8=8hbdy;
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 lx)^wAO4
@X==[gQ
表示一百分数,指定返回的行数等于总行数的百分之几。 Q:}]-lJg
MpV<E0CmE
例如: 0SQ!lr
~ao:9ynY
SELECT TOP 2 * YQBLbtn6(
>3 o4 U2
FROM testtable 6(n0{A
djd/QAfSC
SELECT TOP 20 PERCENT * PDNl]?
VYk:c`E
FROM testtable fvu{(Tb
]Q^)9uE\D
(二)FROM子句 Cf%
qap#
7=^{~5#
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, U3(+8}Q
ohx[_}xN
它们之间用逗号分隔。 /*0t_
n]%-2`}(
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ).~
"
mZ)>^.N6
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 }EK{UM9y
K~W(ZmB
使用下面语句格式加以限定: X/5m}-6d]
c~ss^[qx|
SELECT username,citytable.cityid i]8O?Ab>?
zakhJ
FROM usertable,citytable dlu*s(O"
?qh-#,O9B
WHERE usertable.cityid=citytable.cityid "{q#)N
,9&cIUH
在FROM子句中可用以下两种格式为表或视图指定别名: !_fDL6a-
?UnQ?F(+G<
表名 as 别名 Jf YgZ\#
rH@Rh}#yp
表名 别名 \8vP"Kr
a4Q@sn;]
例如上面语句可用表的别名格式表示为: O1c%XwMn^
!fOPYgAGKn
SELECT username,b.cityid VotC YJ
DiFLat]X
FROM usertable a,citytable b 9+ 'i(q
z
Lqgrt]L_"
WHERE a.cityid=b.cityid -TUJ"ep]QJ
!KHgHKEW^
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 uibmQ|AQ
XKp&GE@Y
例如: MAh1tYs4D
I)rnF
SELECT a.au_fname+a.au_lname qng ~,m
a5*r1,
FROM authors a,titleauthor ta ImXYI7PL
4fLRl-)
(SELECT title_id,title \xYVnjG,
hD6BP
FROM titles dNACE*g;q
^<I(
WHERE ytd_sales>10000 >pq~ &)^u
@16GF!.
) AS t p9v:T1?
7=-Yxt
WHERE a.au_id=ta.au_id d$!Q6ux;
g=Xf&}&=x
AND ta.title_id=t.title_id ?sN{U\
DDE-$)lf>
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 4 m:h&^`N
X[B P0:`t
(三)使用WHERE子句设置查询条件 kR =sr/{
!%>RHh[
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: { _9O4 +
&
$1f2'_`8~
SELECT * BgQEd@cN
g'.OzD
FROM usertable ;1k&}v&
rA~f68h|
WHERE age>20 Z?)g'n
BJ|l
WHERE子句可包括各种条件运算符: fU>l:BzJK
&@iOB #H
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< nFnM9
pdMK
ON2o^-%=
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… H|%J"
IeYYG^V<A
NOT BETWEEN…AND… g~hMOI?KK^
omE- c
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) =AIts[!qd
v[dUUR f
NOT IN (项1,项2……) dq93P%X24
]?^V xB7L
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 4]o+)d.`(
Y'U1=w~E
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL W!{RJWe
D<WnPLA$g
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Xa`Q;J"h
5kGniG?T#
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 tZ_'>7)
ale'-V)5
2、列表运算符例:country IN ('Germany','China') gd;!1GNi]
#Oka7.yz
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 8(1*,CJQg
sfF ~k-
varchar、text、ntext、datetime和smalldatetime等类型查询。 $1yy;IyR
G6p gG+w
可使用以下通配字符: e=i X]%^
'1mk;%
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 O= S[n
VLXA6+
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ddQ+EY@!
k]m ~DVS
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 P$EiD+5#z
L
FWp}#%
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 lV\iYX2#
1K Vit{
例如: yqN`R\d
E)-;sFz
限制以Publishing结尾,使用LIKE '%Publishing' 7zu\tCWb
P< OH{l
限制以A开头:LIKE '[A]%' ,,Qg"C
2!#g\"
限制以A开头外:LIKE '[^A]%' #^}H)>jWy
'z|Da &d P
4、空值判断符例WHERE age IS NULL UoxlEec
nxZz{&
5、逻辑运算符:优先级为NOT、AND、OR Z^kE]Ir#EV
A8-[EBkK
(四)查询结果排序 6KddHyFz
Ci`o;KVj
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: f@i#Znkf*?
n0KpKH<&
ORDER BY {column_name [ASC|DESC]} [,…n] ,L& yKS@
Xb"i/gfxt
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 eoiz]L
p/Pus;*s
序。 aC1z.?!U
(L(7)WbH
例如: Z9vMz3^N
-06G.;W\^
SELECT * Bsa;,
TiD#t+g
FROM usertable ~4fE`-O
mG[jR*JW
ORDER BY age desc,userid ASC 6 byeO&d
i-|N6J
另外,可以根据表达式进行排序。 7yE\,
z~t0l
VeQGdyhY
\5a.JfF
二、联合查询 Mt.Cj;h@^[
/43l}6I
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 wV )\M]@
G_+/ e]P
合查询。UNION的语法格式为: u+8"W[ZULq
M'%4BOpI6`
select_statement }u8(7
uWJJ\
UNION [ALL] selectstatement [/a
AH<9b
Sr
\y1nt
[UNION [ALL] selectstatement][…n] ;"M6}5dQ4
~vXbh(MX
其中selectstatement为待联合的SELECT查询语句。 k
A3K
toGiG|L
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 t4oD> =,92
rl}<&aPH
行。 KKC%!Xy
F!z ^0+H(
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 8:0/Cj
h*R@ d
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 r^5%0_F]
bTJ<8q
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 p8'$@:M\
qur2t8gnxq
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 -riX=K>$
f#z:ILG=
型,系统将低精度的数据类型转换为高精度的数据类型。 ~dS15E4-Pp
e@P(+.Ke
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ~cc }yDe
Y"lEMY
查询1 UNION (查询2 UNION 查询3) PhyIea
35l%iaj]G5
BL&AZv/T
]W;6gmV
`df!-\#
3CD#OCz7&
三、连接查询 ),yar9C
dFBFXy
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 x$q} lJv_
W5Jw^,iPd
数据库管理系统的一个标志。 #1-WiweO
x+cL(R
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 uH*6@aYPo
j""ZFh04
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 $
64up!
*Z#OfB4}
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 /0}Z>iK
x=cucZ
查询。 6 J>A U
4'z)J1M
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 pVc+}Wzh
Qs\a&Q=0H
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 U)G.Bst
e*Wk;D&
SQL-92标准所定义的FROM子句的连接语法格式为: qb[hKp5K6
-6+7&.A+
FROM join_table join_type join_table ah*{NR)
~B|m"qY{i
[ON (join_condition)] 1_t+lJI9j
OjhX:{"59
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 t+a.,$U
^i|R6oO_5
个表操作的连接又称做自连接。 MsXw
8D
nYSe0w
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 [2-n*a(q
*k7BE_&*0Z
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 kqCsEtm]
Bf*>q*%B{
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 l WYp
Fq~uuQ
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) o MJ`_
eyKxnBz
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 Go{,<
gm
fJlNxdVr
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 n5=U.r
A1/@KC"&{G
数据行。 :&wb+tV
xnMcxys~
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 y@!M<#SEzG
2 {?]W/&fS
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ;j%I1k%A
T3fQ #p
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 (ODwdN7;
7_\F$bp`
运算符等构成。 P7F"#R0QB
d/R!x{$-f
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 I(^0/]'
d1/WUKmbZ
连接。例如: }. &ellNQ
U${W3Ra
SELECT p1.pub_id,p2.pub_id,p1.pr_info hnFpC1TO
d%|l)JF*5
FROM pub_info AS p1 INNER JOIN pub_info AS p2 v82wnP-~7
=sk[I0W
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) To(I<W|{
:\|A.#
U
(一)内连接 7(1`,Y
Kkp dcc
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 U,P>P+\@
o,WjM[e
三种: l(NQk> w
hY.i`sp*/
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 3q'AgiW
d~~kJKK
表中的所有列,包括其中的重复列。 e4` L8
3A`Gx#
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 YTyrX
At\(/Zy
运算符包括>、>=、<=、<、!>、!<和<>。 1<G+KC[F
x.-d)]a!
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 ?Ujg.xo\
gl+d0<Rzw
结果集合中所包括的列,并删除连接表中的重复列。 Z jmQ
/-p!|T}w
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: K#+?oFo:
{|u"I@M*O
SELECT * @#4-4.6I<x
2yK">xYY@
FROM authors AS a INNER JOIN publishers AS p d#v@NuO6
h
CIIjZ)T
ON a.city=p.city T`!R
ki%~
VVDN3
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): @F5Af/
tQ{/9bN?P
SELECT a.*,p.pub_id,p.pub_name,p.country ;+wB!/k,
W#bYz{s.
FROM authors AS a INNER JOIN publishers AS p '|4+<#
{[2o
ON a.city=p.city WrGA7&!+
Qel)%|dOn
(二)外连接 i"G'#n~e
?z1v_Jh
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Oin9lg-jR
(j'\h/
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 R `tJ7MB
3Cj)upc
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 I&+.I K_
w&?XsO@0W
如下面使用左外连接将论坛内容和作者信息连接起来: nW)+-Wxq
/i"hViCrlG
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b &q>8D'
6=;:[
ON a.username=b.username $/M-@3wro
x{:U$[_
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: _uO$=4Sd
AU\=n,K7
SELECT a.*,b.* *Y(59J2
Y ]([K.I=
FROM city as a FULL OUTER JOIN user as b 1w=.vj<d8
NVb}uH*i
ON a.username=b.username Y2DL%'K^
8b?nr;@
(三)交叉连接 x/O;8^b
SxYz)aF~
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 i]c{(gd`
W p)!G
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 'oIE:#b
zufphS|
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 y5sH7`2+5
tL OGj?/r
于6*8=48行。 Gk~aTO
r)|~Rs!y,
SELECT type,pub_name W+i^tmj
9}6_B|
FROM titles CROSS JOIN publishers mEJ7e#
]pvHsiI:
ORDER BY type