一、简单查询 l5HWZs^
@/(@/*+"
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ppFYc\&=
n ,1tD
表或视图、以及搜索条件等。 6(.H3bu
1J'pB;.]s
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 =qX*]
$',3Pv
SELECT nickname,email ^ $wJi9D6
"l2bx
FROM testtable ]#5^&w)'
oZ-FF'
WHERE name='张三' nuxd S,
;dOs0/UM&
(一)选择列表 QT;Va#a
gVA; `<
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 xE1rxPuq)d
XNlhu^jh
量和全局变量)等构成。 6F-JK1i
9gR.RwR X
1、选择所有列 n.Vtc-yZU
"*bk{)dz}
例如,下面语句显示testtable表中所有列的数据: bP03G=`6w
>b43%^yii
SELECT * n$
dw<y
_uJVuCc
FROM testtable 6V
P)$h8
ZOn_dYjC
2、选择部分列并指定它们的显示次序 J|q^+K
BkV(81"C
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 jN {Zw*
0d`5Gy_ D%
例如: M8zE3;5
gD1+]am
SELECT nickname,email j8c6[ih
$l#{_~
"m7
FROM testtable '%ebcL
Efvq?cG&
3、更改列标题 ~?-qZ<9/
ctK65h{Eo
在选择列表中,可重新指定列标题。定义格式为: )2]a8JVf
RF!'K
ko
列标题=列名 ZYDWv/u
<N-=fad]
列名 列标题 QXB|!'
"qgu$N4/>
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 {NV:|M !
\=Nm5:
标题: &D)2KD"N
0#
l#,Y6#I
SELECT 昵称=nickname,电子邮件=email J[6VBM.Y
Ju4.@
FROM testtable hk.yR1Y|
0+|>-b/%
4、删除重复行 eK*W=c#@
kXMP=j8
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 >fg4x+0 %
tO`?{?W7
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 T*R{L
sxk*$jO[]
5、限制返回的行数 uR^.
yYk|YX(7U
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ;.AV;C"
wsI5F&R,
表示一百分数,指定返回的行数等于总行数的百分之几。 ?CFoe$M
tJz^DXqAc
例如: 2md.S$V$,
"]UIz_^'`U
SELECT TOP 2 * MISE C[/
@sdS0pC
FROM testtable 19) !$Hl
VAg68EbnF
SELECT TOP 20 PERCENT * dxntGH< O
EZ `}*Yrd
FROM testtable V $>"f(
([tG y
(二)FROM子句 s{B_N/^
Wxc^_iqA1
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, h&P
{p _Y
4a?r` '
它们之间用逗号分隔。 ozuIwzi7N
s|E%~j[9
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 E^82==R
"\<P$&`HA
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 58PKx5`D
_)q4I(s*
使用下面语句格式加以限定: HGb.656r
V>r j$Nc]
SELECT username,citytable.cityid Z7oaQ\fR
&<@%{h@=
FROM usertable,citytable SKW;MVC
{<r`5
WHERE usertable.cityid=citytable.cityid G_0)oC@Jl:
@~hz_Nm@8
在FROM子句中可用以下两种格式为表或视图指定别名: Q84t9b
;!:F#gahv
表名 as 别名 )6g&v'dq
"d2LyQy
表名 别名 l)H9J]
g/6nwa
例如上面语句可用表的别名格式表示为: TRo4I{L6S
=<TO"
SELECT username,b.cityid Nv{eE<<6
_Po#ZGm~
FROM usertable a,citytable b RpjSTV8Tkm
pb6 Q?QG,
WHERE a.cityid=b.cityid Z+Xc1W^
OK.-]()!
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 1-/4Y5?}
dw3'T4TC?
例如: bYK]G+Ww
hg{ &Y(J!U
SELECT a.au_fname+a.au_lname M{G$Pk8[
6z PV'~q
FROM authors a,titleauthor ta K/~Y!?:Jr
unpfA#&!"
(SELECT title_id,title O4n8MM|`
_m" ^lo
FROM titles pL%4= ]m
}0vtc[!
WHERE ytd_sales>10000 |KTpK(6p
nwhm[AaNs
) AS t FRc |D
I51M}b,[d
WHERE a.au_id=ta.au_id sBbL~ce50?
FDl,Ey^r/
AND ta.title_id=t.title_id A7.JFf>
rpx0|{m
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 k -io$
yB|]LYh
(三)使用WHERE子句设置查询条件 +A&EKk%$ |
P&h/IBA_
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 7G?Ia%u
r,QJG$ Jo
SELECT * j\nE8WH
Pb*q;9
FROM usertable V2lp7"
UP5%C;
WHERE age>20 xcsFODx~
OCvml 2
vP
WHERE子句可包括各种条件运算符: %+D-y+hn
/E;;j9
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< :jl
u
neK*jdaP
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… [f/vLLK
kbD*=d}3{
NOT BETWEEN…AND… &Jrq5Q C
vR<fdV
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) M^Q&A R'F
,HQ1C8
NOT IN (项1,项2……) F]hx
Z#srQD3].(
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ^
yY{o/6
S83]O!w0
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL *;>V2!N=U
-WQ_[t9l
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR uPM8GIvZX.
Wdei`u[
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 iH($rSE
K]*g, s+
2、列表运算符例:country IN ('Germany','China') *Pa2bY3:
|^
2rtI
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 QJ[(Y@ O6a
C]aOgt/U
varchar、text、ntext、datetime和smalldatetime等类型查询。 ru#T^AI*^
Z $ p^v*y
可使用以下通配字符: )6PJ*;p-
,?P8m"
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 `;zu1o
eTLI/?|+N
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 i528e{&
_%AJmt}
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Wm];p qN
5d)'`hACe
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 fhVbJU
?{y:s!!
例如: tf.q~@Pi
olUqBQ&ol
限制以Publishing结尾,使用LIKE '%Publishing' #fJ/KYJU
WO.}DUfG+
限制以A开头:LIKE '[A]%' 'YBLU )v[
Lf$Q
%eM0
限制以A开头外:LIKE '[^A]%' <=B1"'\
IM l9\U
4、空值判断符例WHERE age IS NULL b(+w.R(+Ti
&!H~bzg
5、逻辑运算符:优先级为NOT、AND、OR g~bf!
BH.:_Qrbh[
(四)查询结果排序 I,?Fqg'sq
k~'?"'
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: l}U~I
3}).
[)C)p*!Y)
ORDER BY {column_name [ASC|DESC]} [,…n] PV5TG39qQ
3fbD"gL
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 *K0j5dx
*DPTkMQN
序。 #QJ4o_
EF*oPn0|
例如: w>/pQ6=OFR
Wwa41z
SELECT * t?3{s\z 8+
)]0[`iLe
FROM usertable ]4LT#
Vz=j)[
ORDER BY age desc,userid ASC \N'hbT=
XL"v21X
另外,可以根据表达式进行排序。 es*_Oo1
sWojQ-8}
Wo1V$[`Dy
F3H:I"4
二、联合查询 P?WT)C2)u
$=@9 D,R
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 h4$OXKme?
C+Fh$
合查询。UNION的语法格式为: \'}/&PCkr
jL>I5f
select_statement h&:Q$*A>
sqMNon`5
UNION [ALL] selectstatement TnMVHO-
Kq@m?h
[UNION [ALL] selectstatement][…n] [Ls2k&)0
g0;&/;"
其中selectstatement为待联合的SELECT查询语句。 `E4!u=%
g:uaI
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 cLN[o8ZU
]HZa:aPY
行。 goBKr: &]w
@+T{M:&l
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Wf+Cc?/4
>M8^Jgh
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 qxecp2>U
@wAr[.lZ
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 %$9)1"T0Y
UG^?a
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 *x#&[>
/pSUn"3
型,系统将低精度的数据类型转换为高精度的数据类型。 /v|68x6
~(l2%(3G
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: CHdet(_=v
1o5Y9#7
查询1 UNION (查询2 UNION 查询3) x1 &b@u
sg9x?Bx9
21)-:rS
hVt+%tmNy
.SKNIct
M
-G^t-I
三、连接查询 L(!!7B_,
tc49Ty9$[
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 j4
&
X T)hPwg.
数据库管理系统的一个标志。 @88z{
}77=<N br
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 `pv89aO
mw4'z,1Q
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 9 FFfRIVY
F~d7;x=g
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 Ep,0Z*j
5LhJ8$W
查询。 6{Cu~G{]N
J:TI>*tn
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 [/fwt!
{pQ@0b
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 hAxuZb7 ?
^&Rxui
SQL-92标准所定义的FROM子句的连接语法格式为: \aJ-q?=
-<}>YtB
Q
FROM join_table join_type join_table /PB3^d>Q2
j
O5:{%
[ON (join_condition)] ym,Ot1
`Hp.%G(
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 n[cyK$"
#&`WMLl+8
个表操作的连接又称做自连接。 &Ow?Hd0
,j(p}t
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 luxKgcU
+<9q]V
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 $=QGua V
lj SR?:\
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 KiRt'
@)juP- o%
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 2Ws/0c
r1az=$
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 Cak/#1
"<n"A7e
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 /x8C70W^
:]z-Rz
数据行。 M]/wei"X
.V )2Tz
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ??e#E[bI
OTtanJ?
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ]JCB^)tM
c7TWAG_+
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ZX5A%`<M
9{^B
Tc
运算符等构成。 :7PSZc:xE
~C*6V{Tj
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 a ~iEps
$j4?'-i=e
连接。例如: Kg0\Pvg8?T
CO)b'V,
SELECT p1.pub_id,p2.pub_id,p1.pr_info ]v,y(yl
F~@1n,[
FROM pub_info AS p1 INNER JOIN pub_info AS p2 6x3Ew2
OD@A+"
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) bHo?Rw!.
RKJWLofX&
(一)内连接 JjO/u>A3;7
@Q1F#IU
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 -mYI[AG)
|u@>[*k'=
三种: 1eR{~ ,
%?G.lej,x
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 s8I77._s
YrcC"
表中的所有列,包括其中的重复列。 =z/mI y<
c$SxDYG
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ~x^+OXf!^g
Fe2-;o
运算符包括>、>=、<=、<、!>、!<和<>。 d?qO`-
~$
$Qc%9p
@i
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 :tDGNz*zG
XxU}|jTO#
结果集合中所包括的列,并删除连接表中的重复列。 SrU
3z. >b
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: bDh(;%=
0c;"bA0>Sx
SELECT * o!dkS/u-m
=
Ow&UI
FROM authors AS a INNER JOIN publishers AS p *l8vCa9Y
]8cX#N,M
ON a.city=p.city +CHO0n
F-OZIo
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): P>,D$-3
4a-F4j'
SELECT a.*,p.pub_id,p.pub_name,p.country e5\1k#@
KNyD}1
FROM authors AS a INNER JOIN publishers AS p S5 oHe4#89
|;1:$E"
ON a.city=p.city l:C0:m%
}8KL]11b
(二)外连接 !-o||rt
a}]@o"
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 &aht K}u
lukRFN>c"
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 G u I sM
/OtQk-E
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 iQR})=Q
jQlK-U=oi
如下面使用左外连接将论坛内容和作者信息连接起来: [5#/&k{
{7s zo`U2
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b x@\'@>_GM
G8c}re
ON a.username=b.username 6Kc7@oO~
NOr*+N\
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ^[NmNi*
zi 14]FWo
SELECT a.*,b.* 8[p6C Jl)
!8M'ms>s=
FROM city as a FULL OUTER JOIN user as b J)&+y;.
,>%r|YSJ)
ON a.username=b.username *iN]#)3>
t/BiZo|zl
(三)交叉连接 <iqyDPj
13@| {H CB
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ! yUKNR
_NN{Wk/3w
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 P@![P Ij
]h8V{%H
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
W/QOG&g
g2_df3Q
于6*8=48行。 qUg4-Z4
J4^cd
SELECT type,pub_name !@ '2
LBi>D`]
FROM titles CROSS JOIN publishers JKbB,
*zht(~%
ORDER BY type