一、简单查询 "[L+LPET
Tt0]G_
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 LwQYO'X
`$;%%/tx
表或视图、以及搜索条件等。 MGKSaP;x
g( eA?
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 w~9Y=|YI7
[9CBTSr
SELECT nickname,email 4%jSqT@
v>Kv!OY:c
FROM testtable ir)~T0
Vc|QW
WHERE name='张三' Mm"0Ip2"
g>f_'7F&
(一)选择列表 $xj>j
euh rEjwkH
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 \" =@uqar2
`Yu4h+T
量和全局变量)等构成。 8bEii1EM
9fqCE619a
1、选择所有列 z"@UNypc,
8nRxx`U\q
例如,下面语句显示testtable表中所有列的数据: r?n3v[B
*3Ci4\Ew
SELECT * @z.HyQ_v
A,|lDsvM
FROM testtable ->YF</I
a: OuDjFp
2、选择部分列并指定它们的显示次序 h IUO=f
[E%Ov0OC
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 z 4`H<Pn
e#uF?v]O
例如: |S VL%agZ
_/[(&}M
SELECT nickname,email w8AHs/'r
F1zsGlObu}
FROM testtable ZNbb8v
4^BHJOvs
3、更改列标题 NA8$G|.?
T
.L>PL?=
在选择列表中,可重新指定列标题。定义格式为: mOi 8W,2
c3aF lxW
列标题=列名 K0?:?>*b#
f9&po2Pzf
列名 列标题 6m{1im=
=arrp:
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 .
!;K5U
!"x&tF
标题: 7j L.\O
IOOAaa @(
SELECT 昵称=nickname,电子邮件=email A 4|a{\|$
.Cf`D tK
FROM testtable nqyB,vv0
MXU8QVSY"
4、删除重复行 41`&/9:"_M
L9)nRV8
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 vb Mv8Nk
];o[Yn'>o
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 /F6=iHK(l
h/n&&J
5、限制返回的行数 |d8x55dk
:s OsG&y
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 U
ORoj )$I
[P23.`G~J
表示一百分数,指定返回的行数等于总行数的百分之几。 UDz#?ZWnd
C_DXg-a2lu
例如: f"G?#dW/1
aC2\C=ru_
SELECT TOP 2 * N-Nq*
GE[J`?E]
FROM testtable #!X4\+)
}EZd=_kAq~
SELECT TOP 20 PERCENT * 9nPc>O$
kMLWF
FROM testtable As7Y4w* +
Ui`Z>,0sFi
(二)FROM子句 (AnM_s
mxV0"$'Fm
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, KoNJ;YiKtN
-NyfW+T={
它们之间用逗号分隔。 *^&2L,w
+8AGs,
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 9n${M:F
36U
zfBa
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ?R}a,k
gjVKk
使用下面语句格式加以限定: )N4_SA
#\]:lr{>?4
SELECT username,citytable.cityid }XiV$[xHd
.UuCTH;6`
FROM usertable,citytable 4>&%N\$*
^l4=/=RR
WHERE usertable.cityid=citytable.cityid .:b|imgiv
-C|1O%.
在FROM子句中可用以下两种格式为表或视图指定别名: >f$>Odqe
yJ&`@gB
表名 as 别名 p|z\L}0
^sp+ sr :
表名 别名 BM&.Tw|x
VSlIeZ
例如上面语句可用表的别名格式表示为: Xn'{g
}qf)L.
SELECT username,b.cityid CcZ\QOet&C
lklMdsIdj
FROM usertable a,citytable b M8BN'%S
Ok=RhoZZ
WHERE a.cityid=b.cityid CN$wlhs
ljij/ C=
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 DhwFD8tT
X;I;CZ={
例如: Lii,L}
$Xf gY1S
SELECT a.au_fname+a.au_lname 9w Pc03a
B%c):`w8]
FROM authors a,titleauthor ta e.<$G'
oc>ne]_'
(SELECT title_id,title v^ a.
b
gm63dE>
FROM titles Q}a 1P8?S
tf?u ;n
WHERE ytd_sales>10000 \)=X=yn2
yk4Huq&2
) AS t q#$4Kt;
q89#Ftkt
WHERE a.au_id=ta.au_id 9~^%v zM
n y7G
AND ta.title_id=t.title_id $W46!U3
J2BW>T!tuw
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 MjAF&bD^
Cw<bu|?
(三)使用WHERE子句设置查询条件 gF@51K
d?RKobk
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: (=d%Bn$6b
<m"yPi3TY
SELECT * MZGN,[~)6
{CM%QMM
FROM usertable I@ l'Fx
$q]:m+Fm
WHERE age>20 ?-
5{XrNm
T>l=0a #
WHERE子句可包括各种条件运算符: W2VH? -Gw
xr uQ=Q
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< tK3.HvD
4}FuoQL
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… NJG-~w
A#gmKS<J/7
NOT BETWEEN…AND… 7u"t4Or
2,c{Z$\kn
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) #<X+)B6t
#:{Bd8PS
NOT IN (项1,项2……) OXy>Tlv
36154*q
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE N#-P}\Q9
;?>xuC$
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL +1j@n.)ft
[-)N}rL>
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR (Yz EsY
`p@YV(
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ~yH<,e
*~F\k):>
2、列表运算符例:country IN ('Germany','China') tN&x6O+@
8Yr_$5R
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 lHBk&UN'
3;(6tWWLT
varchar、text、ntext、datetime和smalldatetime等类型查询。 @|:_ ?
)_P|_(
可使用以下通配字符: VC
"66\d&
eeX^zaKl]
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 }(h_ztw
>t|u 8/P
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 =.9L/74@
Xqt3p6
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 uXiAN#1
<StyO[
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 G992{B
!/W[6'M#p
例如: *ip2|2G$
8=rD'*
限制以Publishing结尾,使用LIKE '%Publishing' e_Na_l]
EQDsbG0x
限制以A开头:LIKE '[A]%' c"w}<8
[hs_HYqJ
限制以A开头外:LIKE '[^A]%' _&TA|Da
%./vh=5)
4、空值判断符例WHERE age IS NULL H]V@Q~?e
{VBx;A3*I
5、逻辑运算符:优先级为NOT、AND、OR 3okh'P%+
#9Z\jW6b
(四)查询结果排序 0?} ),8v>
MA\"JAP/
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: A;nrr1-0
5mwtlC':l?
ORDER BY {column_name [ASC|DESC]} [,…n] h}&WBN
T8&
kxp
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 V)M+dhl
Q}p+/-U\
序。 }D_h*9
L>~wcoB
例如: 3+mC96wN
OOy]:t4 /
SELECT * @= f2\hU
~^((tT
FROM usertable [5
Mt,skC:
HS3]8nJW
ORDER BY age desc,userid ASC T
`x:80
TwBwqQ)t
另外,可以根据表达式进行排序。 b/IT8Cm3
km1{Oh
QR<z%4
|QwX
二、联合查询 Xx_v>Jn!
Y !e
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 BdcTKC
4G`7]<
合查询。UNION的语法格式为: C$o#zu q-
ydo"H9NOS
select_statement qgd#BJ=
u_[^gS7
UNION [ALL] selectstatement /QDlm>FM4
W99MA5P
[UNION [ALL] selectstatement][…n] G8%Q$
H)&6I33`
其中selectstatement为待联合的SELECT查询语句。 x/*ndH
4.)hC b
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 +b_g,RNs!
7=yC*]BH-=
行。 @/i;/$\
qLkn a
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Rg3 Lo ?
o<@b]ukl&
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 #L[-WC]1y
0PIiG-o9
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 CR*R'KX D%
EgO=7?(pW
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Hn"xn79nc
__HPwOCG7
型,系统将低精度的数据类型转换为高精度的数据类型。 e;KZTH;
Mf)0Y~_:R#
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: F(*~[*Ff
9U1cH qV
查询1 UNION (查询2 UNION 查询3) |:_WdU"Q]
ft oz0Vb
'f0*~Wq|
C2RR(n=N^
\a]JH\T)Q
bl. y4
三、连接查询 eekp&H$'s
~e,k71
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 N yT|=`;
RUHQ]@d#T
数据库管理系统的一个标志。 @T53%v<5
b~?FV>gl
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 u/?s_OR
:A%|'HxH3
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 G0p|44_~t
&9bsTm
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 k2Yh?OH
!~5;Jb>s[/
查询。 HMsTm}d
1 FTxbw@
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 -QR&]U+
=Q985)Y&
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 49b#$Xq
&|( 'z\k
SQL-92标准所定义的FROM子句的连接语法格式为: n(^{s5 Rr
bQG2tDvu[
FROM join_table join_type join_table D 3m4:z
[4uTp[U!r
[ON (join_condition)] <4,hrx&.
,4$ZB(\
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 L{fKZ
r )8[LN-
个表操作的连接又称做自连接。 `I+G7KK
vt0XCUnK
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 {KJ !rT
7\*_/[B
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 W]Z;=-CBr
rUjK1A{V
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 {qO[93yg)/
L\d"|87lX
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) S]3K5Z|
4QbD DvRQ^
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ^Glmg}>q
_l$V|
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 39| W(,
,!U._ic'B
数据行。 ZdbZ^DUR<(
^`ah\L
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 : vN'eL|#
o*OYZ/_L
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 XOsPKq
` #Qlr+X
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 !#0Lo->OO
^|yw)N]Q/
运算符等构成。 s=0z%~H
-*8 |J;
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 9\9:)q
w"Gci~]bXU
连接。例如: ">='l9
/wplP+w2
SELECT p1.pub_id,p2.pub_id,p1.pr_info G gmv(!
xa+=9=<AQ
FROM pub_info AS p1 INNER JOIN pub_info AS p2 R;+vE'&CO
??&Q"6Oe
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) KF^5 C
P]]re,&R
(一)内连接 jOL $kiW0
"
`rkp=
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 +3]1AJa
H_gY)m
三种: R5M/Ho 4
$X1T!i[.X
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 8Jnb/A}
kSJWXNC
表中的所有列,包括其中的重复列。 &%M!!28X:
];& @T\Rj
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 yhzC 9nTH
.U.Knn
运算符包括>、>=、<=、<、!>、!<和<>。 &''lOS|
(tQ#('(w
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 "G. L)oD
9[yW&t;#
结果集合中所包括的列,并删除连接表中的重复列。 $yG>=GN
s;!TB6b@
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: chw6_ctR>
Wk1o H
SELECT * bgD4;)?5b
[(Z{5gK
FROM authors AS a INNER JOIN publishers AS p I8*_\Ez
QWL$F:9:
ON a.city=p.city mS)|i+5
^P30g2gv>
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): G 3))3]
)l 0\TF
SELECT a.*,p.pub_id,p.pub_name,p.country N l~'W
$07;gpZt
FROM authors AS a INNER JOIN publishers AS p HRX}r$
3 !W
M'i
ON a.city=p.city CK4C:`YG
TmI~P+5w
(二)外连接 \F`%vZrKR
}HdibCAOf
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 } a#RX$d&
"u#,#z_
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 p0c*)_a*
sw<GlF"
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 R_?Q`+X
]w7wwU^^*U
如下面使用左外连接将论坛内容和作者信息连接起来: R@ksYC3 F
l/WQqT
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b u7Z-kZ
3zC<k2B
ON a.username=b.username p'SclH[
~kHWh8\b:
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 0?@;zTE0
bH6i1c8
SELECT a.*,b.* #8xP,2&zf
[wp(s2=
FROM city as a FULL OUTER JOIN user as b mdzUL
d5J
W(~7e?fO
ON a.username=b.username C/34K(
. W ~&d_n
(三)交叉连接 Z=c&</9e
),DLrGOl
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ~`Uil=
{=3&_/9s){
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 /6Bm
<k%
{,:yZ&(
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 Fa]|Y
EA#{N<
于6*8=48行。 ^l;N;5L
iX]tL:,~i
SELECT type,pub_name LN=6u
*;E\,,Io
FROM titles CROSS JOIN publishers 8.`*O
Q)mYy
ORDER BY type