一、简单查询 JX'}+.\
P:g!~&Q
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 e_!h>=$%8
Jm ,:6T
表或视图、以及搜索条件等。 lfBCzxifC
`0ZH=*P
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 9L7z<ntn
X(Af`KOg[
SELECT nickname,email ?n<F?~
"6]oi*_8
FROM testtable G739Ne[gL
G9xl-ag+z
WHERE name='张三' iAe"oXK|
#TUm&2 +V
(一)选择列表 #reR<qp&]
n$ByTmKxv
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 =9,mt
K~
]+G\1SN~
量和全局变量)等构成。 Jb{g{a/
9V)cf
1、选择所有列 J4]"@0 ?6
Rm3W&hQ
例如,下面语句显示testtable表中所有列的数据: zecM|S _
7r,GdP .
SELECT * &=t~_ Dc
],AtR1k
FROM testtable At>e4t2@
}vZfp5Y
2、选择部分列并指定它们的显示次序 G l/3*J
2G|}ENC
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 2KXFXR
C=;}7g
例如: w*'DlP<7
gD%o0jt"
SELECT nickname,email .z
CkB86
^Zs^
FROM testtable =l2 @'Y Q
W\Il@Je;
3、更改列标题 y-@`3hYM@
>mQD/U
在选择列表中,可重新指定列标题。定义格式为: a%y*e+oM
NjS<DzKhK
列标题=列名 {<IHiB35q
pV<K=;:x>
列名 列标题 ?`vGpi~
e]1)_;b*
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 =Q;dYx%I5
4WlBQ<5
标题: k=t{o
wR 2`*.O
SELECT 昵称=nickname,电子邮件=email 1_&W1o
O|m-[]
FROM testtable IF&edP[V
-=
c&K&
4、删除重复行 S]E|a@kD3
DM6(8df(
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 5 3+C;]J
ixy:S1pI
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 o7tlkSZ
l [ m_<1L
5、限制返回的行数 S41S+#7t*
<F}j;mX
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Lz9|"F"V
~A/vP-
表示一百分数,指定返回的行数等于总行数的百分之几。 <qoc)p=__
NxH%%>o>
例如: xE_~.EoB
{niV63$m
SELECT TOP 2 * MR,>]|
^
|I]G=.*E
FROM testtable O?#<kmd/)
=585TR;
V
SELECT TOP 20 PERCENT * 9u^za!pE
(<`>B
FROM testtable M;g"rpM
)fuAdG
(二)FROM子句 4,`t9f^:
q.hpnE~#lh
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ;[C_ho
KVC18"|f
它们之间用逗号分隔。 aB&a#^5CI
gW G>}M@
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 N+UBXhh
oj6=.
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 )CH\]>-FO
7CU<R9Kl
使用下面语句格式加以限定: 6C_H0a/h&
j%S}
T)pX
SELECT username,citytable.cityid &x.5TDB>%
o
-x=/b
FROM usertable,citytable ^6UE/4x!y
pmUC4=&e
WHERE usertable.cityid=citytable.cityid &)Vuh=
T~lHm
在FROM子句中可用以下两种格式为表或视图指定别名: %
y` tDR
#cl|5jm+m#
表名 as 别名 IjPtJwW`A
Y,KSr|vG
表名 别名 KWVl7Kw#e
-<\hcV`&
例如上面语句可用表的别名格式表示为: rgv$MnG
Wsw/ D
SELECT username,b.cityid 6
#jpA.;
cW{ Bsr
FROM usertable a,citytable b p?s[I)e
`cmzmQC
WHERE a.cityid=b.cityid bhjJH,%_>
]D>\Z(b
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 x50ZwV&j
Nk\/lK\
例如: {tXyz[;i1}
AbMf8$$3SH
SELECT a.au_fname+a.au_lname k
_Bz@^J
D<4cpH
FROM authors a,titleauthor ta .L3D]
&K"qnng/y
(SELECT title_id,title lt C
GZiN&}5e
FROM titles 0@jhNtL
"V4ru&a
WHERE ytd_sales>10000 I(Q3YDdb
y $>U[^G[
) AS t 5F5)Bh
8 }OII\
WHERE a.au_id=ta.au_id [@/x
=eeZtj.
AND ta.title_id=t.title_id ]#O~lq
/kFw(l_.
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 T;Ra/H
O1z3(
(三)使用WHERE子句设置查询条件 -[A=\]RfJ
x1.yi-
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 3AC/;WB9
JW=P}h
SELECT * g/z7_Aq/
Q[% +y.
FROM usertable ^' b[#DG>F
s+]6X*)
WHERE age>20 HqKD]1
4q`e<!MP)q
WHERE子句可包括各种条件运算符: ,6T3:qkkvF
8|S}!P"
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ARJ} h
>~* w
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… X=X
dj:6c@n
NOT BETWEEN…AND… 5uvFCY./c
II}3w#r4
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) +Ft@S(IE
cY%6+uJ1
NOT IN (项1,项2……) IaYy5Rw
2u^/yl
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ;fKFmY41
iriF'(1
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL /c52w"WW
{b]V
e/\
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR l 1Ns~
!Im{-t
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 {$qLMx';
+m1y#|08
2、列表运算符例:country IN ('Germany','China') v^Pjvv =
LLW\1 cxi
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 N:e5=;6s
5|bc*iqU
varchar、text、ntext、datetime和smalldatetime等类型查询。 Q$=X
?{
H1kxY]_/
可使用以下通配字符: gK>aR ^*
3q$"`w
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 ]=T-Cv=t
+ Awo\;@,
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ~&T%u.u7
lX|d:HFtP
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 "midC(rTm
^q)s
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 l]__!X
u+,
例如: z+qrsT/?L
qHra9yuSh
限制以Publishing结尾,使用LIKE '%Publishing' EPGp8VGXp~
+G?nmXG[vj
限制以A开头:LIKE '[A]%' .0u@PcE:O
C:@JLZB
限制以A开头外:LIKE '[^A]%' HD{2nZT
VF] ~J=>i
4、空值判断符例WHERE age IS NULL ^,N=GZRWW
t73" d#+
5、逻辑运算符:优先级为NOT、AND、OR =?gDM[t^
B|6_4ry0U
(四)查询结果排序 QwgP+ M+
"1%YtV5R{
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: EnnE@BJ"
u40<>A
ORDER BY {column_name [ASC|DESC]} [,…n] f"g-Hbl5
t7qY!S (
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Jde@Th
;-!j,V+$h
序。 I<^&~==
%cFqD
& 6
例如: 7c
aV-8:
ntt:>j$
SELECT * gj-MkeI)
sAfNu~d
FROM usertable "YePd*W
kB $?A8Olu
ORDER BY age desc,userid ASC &3%V%_
MY"8!
另外,可以根据表达式进行排序。 eg
Zb)pP
4vbtB2
G [$u`mxV^
/D&7 \3}
二、联合查询 /r@~"Rx '
l#k&&rI5x.
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 4<Q^/-W
X4Y!Z/b
合查询。UNION的语法格式为: T?V!%AqY:
v[I,N$:
select_statement AI\|8[kf0
we;QrS(Hi
UNION [ALL] selectstatement c&a.<e3mL
TIre,s)_
[UNION [ALL] selectstatement][…n] 2u?k;"]V
f15f)P
其中selectstatement为待联合的SELECT查询语句。 |ww@V<'/#
1a>TJdoa
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ( ,!G$~Sy
vv5 u U8
行。 OX[pK_:`l
$~FnBD%|{
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 }hyl)?*~
pGdo:L?
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ( !=^ (Nd
mx;1'!'fr
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 GFppcL@a
Tq*K
=^
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 o"-*,:Qe
C3>`e3v
型,系统将低精度的数据类型转换为高精度的数据类型。 =#|K-X0d=
~s4o1^6L
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 3C7}V{?
J2d3&6
查询1 UNION (查询2 UNION 查询3) T.x"a$AU
W2W4w
.1#G*A|
N!iugGL
5}MjS$2og
1DT}_0{0Q
三、连接查询 7r,h[9~e
o1?bqVF;6
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 99tKs
$=GnoS
数据库管理系统的一个标志。 }Z Nyd
]p5]n*0X
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 E[2>je
5w$\x+no
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 0` \!O(jJ
Os>^z@x
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 6< O|,7=_
0JS#{EDh+
查询。 y|(C L^(
eB,eu4+-
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 q6a7o=BP]
D +Ui1h-
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 w:+wx/\
T i!<{>
SQL-92标准所定义的FROM子句的连接语法格式为: asd3J
Xah-*]ET
FROM join_table join_type join_table M:QM*?+)
9~ JeI /
[ON (join_condition)] 7ts`uI<E@7
oW\kJ>!
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 xR`M#d5"
R-lpsvDDL2
个表操作的连接又称做自连接。 |h(05Kbk
?&rt)/DV,
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 M'-Z"
V4>qR{5
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 )o%sN'U,1
Lk>o`<*
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ~"8D]
3L1MMUACL
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) !5zDnv
2=V~n)'a
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 $$f89, h
b^q8s4(
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 %Z]c[V.
!Un&OAy.!
数据行。 _Z{EO|L
P'Diie
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 8k|&&3_[?
[,86||^
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 dDxb}dx8
5g\>x;cc
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 H2
Gj(Nc-
|Ta-D++]'
运算符等构成。 2?)8s"Y
)Lb?ZXT3
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 2vh@KnNU
"f |xIK`c
连接。例如: wpI_yp
j Wjp0ii
SELECT p1.pub_id,p2.pub_id,p1.pr_info WkUV)/j
B57MzIZi]
FROM pub_info AS p1 INNER JOIN pub_info AS p2 #WqpU.
}eq*dr1`
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) YQ$EN>.eO
v-ZTl4j$
(一)内连接 u|{(m_"H
CEHtr90P
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 B+r$_L&I
E hw2o-s^
三种: !LAC_b
A-*y[/
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 2PTAIm Rq
#_?m.~`g[
表中的所有列,包括其中的重复列。 aPRXK1
%|AXVv7IN>
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 VV$4NV&`Q
EV.F/Wh
运算符包括>、>=、<=、<、!>、!<和<>。 zz**HwRt
T:!f_mu|
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Sk7sxy<F'
/C\tJs
结果集合中所包括的列,并删除连接表中的重复列。 |9Pi*)E
;6AanwR6
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: \S]` { kY,
YU ,fx<c
SELECT * ] =*G[
V ah&)&n
FROM authors AS a INNER JOIN publishers AS p -,a@bF:
1<;RI?R[9
ON a.city=p.city T]UrKj/iF
,+GS.]8<
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): j{&$_
Bk2j|7
SELECT a.*,p.pub_id,p.pub_name,p.country tTE]j-uT
$eiW2@
FROM authors AS a INNER JOIN publishers AS p yE{\]j|Zf
OuMj%I
ON a.city=p.city dC(5I{I|
=)YDjd_=z
(二)外连接 FaQz03N\
V:<Z
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 >QSlH]M
>1 %|T
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 twP%+/g]<
}Yargj_Gn
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 \]|(w*C
0`KR8# A@
如下面使用左外连接将论坛内容和作者信息连接起来: !D|c2
f)1*%zg%
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b \__xTL\
Hj97&C{Q^
ON a.username=b.username 1A}#j
V~MyX&`
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: T6nc/|Ot
MWq1 "c
SELECT a.*,b.* (i;,D-
;Z.sK-NJ4
FROM city as a FULL OUTER JOIN user as b p)Fi{%bc
'y&DOy/|
ON a.username=b.username ~c`%k>$
eZ8DW6 l*
(三)交叉连接 ^TEFKx}PX
vlC$0P
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 I3;03X<2
LbUH`0:%t
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 p`)Mk<`dYD
C8KV<k
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 {HbSty
^;'FC vd
于6*8=48行。 Xmw%f[Xl
h{ T{3
SELECT type,pub_name }6"l`$=Ev
&G)/i*
FROM titles CROSS JOIN publishers nSpOTQ
V;d<S@$
ORDER BY type