一、简单查询 I _KHQ&Z*
pTCD1)
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 rWTaCU^qV
y||
n9
表或视图、以及搜索条件等。 :^]Po$fl
$VmV>NZ
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 a51(ySC}<s
;\7`G!q
SELECT nickname,email I6^y` 2X
|HycBTN#E
FROM testtable OkciL]
%unn{92)
WHERE name='张三' y~+LzDV
}k VC]+
(一)选择列表 NPH(v`
%@PcQJg U<
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 X%YZQc9
`,V&@}&"n
量和全局变量)等构成。 6>WkisxG
jWUrw
1、选择所有列 9K&$8aD
5;XC!Gz
例如,下面语句显示testtable表中所有列的数据: %$&eC
?ES{t4"
SELECT * >V^8<^?G
R|RGoGE6g
FROM testtable MGF!ZZ\
JP Dxzp
2、选择部分列并指定它们的显示次序 lf(+]k30
wrkw,H
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 P'Y(f!%
u0wu\
例如: 96\FJHtZ
1|p\rHGd
SELECT nickname,email <sC(a7i1
fQ 9af)d
FROM testtable )zWu\JRp
(Mfqzy
3、更改列标题 \Q#pu;Y*N]
^6l5@#)w
在选择列表中,可重新指定列标题。定义格式为: usc/DQ1
Z2W&_(^.h
列标题=列名 l iY/BkpH
@g[ijs\
列名 列标题 Ov(k:"N
hWt_}'
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 i|h{<X7[
ikZYc ${
标题: c^_+<C-F
5i6Ji(
SELECT 昵称=nickname,电子邮件=email \ ERBb.
Ge)G.> c
FROM testtable KYTXf+ oh
~[!Tpq5
4、删除重复行 htYfIy{5w
t]sk[
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 3x(Y+
ymP
67/@J)z0%
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 p!E*ANwX
HAc"pG
5、限制返回的行数 lGet)/w;c
k'X"jon
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 HE*^!2f
ZXhNn<
表示一百分数,指定返回的行数等于总行数的百分之几。 ^d>m`*px
.&u
@-Vm
例如: .5HD i-
<OiH%:G/1
SELECT TOP 2 * "wVisL2+.
hXH+C-%{
FROM testtable 7yG%E
Eb,M+c?
SELECT TOP 20 PERCENT * &gh>'z;`r
.mnkV -m
FROM testtable )1R[~]y
0}Kyj"-3
(二)FROM子句 s&%r?
p>U= Jg
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ,jnaa (n
']!wc8m1"
它们之间用逗号分隔。 fG?a"6~
uKY1AC__
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ;Gu(Yoa}y
Ut%{pc 7^F
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 4U$M0 =
9G1ZW=83
使用下面语句格式加以限定: ,\T `gh
(\'lV8}U
SELECT username,citytable.cityid [IyC}lSW^-
>y!R}`&0^t
FROM usertable,citytable Y|#<kS
ZP:+ '\&J
WHERE usertable.cityid=citytable.cityid X~*/ ~f
B$q5/ L$}
在FROM子句中可用以下两种格式为表或视图指定别名: `OZiN;*|
WK#c* rsij
表名 as 别名 @]]\r.DG
ZlMS=<hgFx
表名 别名 N7q6pBA"E
fn5!Nr ,
例如上面语句可用表的别名格式表示为: 1Si$Q
g/!tp;e
SELECT username,b.cityid =FAIbM>u
X=jD^"-
FROM usertable a,citytable b 5o^\jTEl^
r.]IGE|
WHERE a.cityid=b.cityid T0o0_R
CQ{pv3)
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 y?iW^>|?L=
=QwT)KRB%
例如: FbCuXS=+`
7a4Z~r27/
SELECT a.au_fname+a.au_lname t#!AfTY$w
GG4FS
FROM authors a,titleauthor ta U]M5&R=?
<`BDN
(SELECT title_id,title HSACaTVK
Gg^gK*D
FROM titles z>*\nomOn=
y=}o|/5"
WHERE ytd_sales>10000 GCrsf
%YG[?"P'
) AS t S`h yRw
U_wIx
WHERE a.au_id=ta.au_id a!&<jM
5hDm[*83
AND ta.title_id=t.title_id =|V#~p*
Jn\>Sz(96
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 MZ^(BOe_
,C^u8Z|T
(三)使用WHERE子句设置查询条件 cj|Urt
F>k/;@d
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Hr(%y&0
0>3Sn\gZ(
SELECT * T9YrB
{afIr1j/m
FROM usertable A ?[Wfq|
%\1W0%w
WHERE age>20 fHgvh&FU
!dwa. lZ&X
WHERE子句可包括各种条件运算符: u"U7aYGkY
T=[/x=
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< dSE"G>l8
S0lt_~
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… % 3<7HY]~
GjX6noqT
NOT BETWEEN…AND… V?n=yg
-]Aqt/w"l
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) V17!~
4mm>6w8NT
NOT IN (项1,项2……) {Lsl2@22
Z)<lPg!YAR
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE n"Wlfd0
a-NicjV#
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL Oh,]"(+
=tc!"{
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 5p~hUP]tT
aAgQ^LY
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 +9B .}t#
7\yh<?`V8
2、列表运算符例:country IN ('Germany','China') .Gb!mG
TrBW0Bn>p
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 9A *gW j
$ByP 9=|
varchar、text、ntext、datetime和smalldatetime等类型查询。 P=Su)c
|^"0bu"
可使用以下通配字符: `i<Z<
<c>
$dG:29w
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 ~7m+N)5
;3o7>yEv
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 BlqISyrY
&d\ y:7
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 !@ {sM6U
BAtjYPX'w
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 /@I`V?Q!a
`@#rAW D
例如: M~~)tJYsu
?hViOh$.
限制以Publishing结尾,使用LIKE '%Publishing' .eLd0{JtN
(%mV,2|:20
限制以A开头:LIKE '[A]%' }_5 R9w]"
lnRL^ }
限制以A开头外:LIKE '[^A]%' h`iOs>
;; ;=)'o
4、空值判断符例WHERE age IS NULL Q!_d6-*u
m=SI *V
5、逻辑运算符:优先级为NOT、AND、OR 6@eF|GoP
]sJC%/
(四)查询结果排序 7Gy:T47T\@
wE}Wh5
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: dCeLW
e5
}amrz
ORDER BY {column_name [ASC|DESC]} [,…n] vrcIwCa
u@CQ+pnf:(
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 <'N:K@Cs
[FLR&=.(
序。 {Ay dt8
,~DV0#"
例如: niKfat?
}pIn3B)
SELECT * Pc2!OQC'""
-$DfnAh
FROM usertable Ri~$hs!
ex6R=97uA
ORDER BY age desc,userid ASC 4QTHBT+2`
]!&$&t8.
另外,可以根据表达式进行排序。 {_/ o' 6
P%gA`j
.ESvMK~x
Od)y4nr3~
二、联合查询 *tgu@9b
"r*`*1
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 Cs7ol-\)
n\3#69VY
合查询。UNION的语法格式为: "RN]
@p#m
E6ZkO/
select_statement Kk6=61} A
,w3-*z
UNION [ALL] selectstatement p6R+t]oH
f&mi nBU
[UNION [ALL] selectstatement][…n] }Sbk qd5
!*Eu(abD
其中selectstatement为待联合的SELECT查询语句。 6#!CBY^{
J E7m5kTa
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 [`t ;or
`SsoRPW&$
行。 )38%E;T{X
fg3Jv*
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 OtmDZ.t;`
YLGE{bS
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ?'z/S5&j
9`*Eeb>
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ^`'\eEa
h_[{-WC
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ds9'k.
rB$~,q&.V
型,系统将低精度的数据类型转换为高精度的数据类型。 j2<+[h-
{zvaZY|K"
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: Nw1*);b[y
{pIh/0
查询1 UNION (查询2 UNION 查询3) ]690ey$E:j
,"(G
:5,~CtF5 `
`\62 iUN
$t):r@L
QQ .?A(U7
三、连接查询 -je} PwT
Fm0d0j
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 R+Hu?Dv&F
mG&A_/e!9
数据库管理系统的一个标志。 BX0lk
kk-<+R2
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 M/=36{,w-
|6JKB'
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 /=m AVA
9f( X7kt
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 C!*!n^qA
]u|v7}I4
查询。 f47]gtB-
FpRYffT 9u
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 [! $NTt_
d^aVP
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 +M0pmK!
\Mg_Q$
SQL-92标准所定义的FROM子句的连接语法格式为: %;k Hnl
H~+A6g]T
FROM join_table join_type join_table R VatGa0
z3+@[I$
[ON (join_condition)] .d1ff];
9;e!r DW,#
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 .C%
28fH
)y,^M3$?C
个表操作的连接又称做自连接。 5)!g.8-!
:snO*Zg
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 $ZBYOA
yDafNH
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 A9MM^jV8
<giBL L!
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 10FiA;
|:1{B1sqA
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) .xsfq*3e5
N; g@lyo
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ^?VQ$o2
<=*f
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Gaix6@X6'
4b2d(x)0X
数据行。 k XSX<b <%
uAn}qrqE9
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 5daq}hsQs
@L3XBV2
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 T$%|=gq
p\w<~pN[
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 4nsJZo#S/
H$h#n~W~
运算符等构成。 j<p.#jkT
I%3[aBz4
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 M|*YeVs9#
XIdh9)]^}
连接。例如: 32YbBGDN!f
[s(D==8
SELECT p1.pub_id,p2.pub_id,p1.pr_info K;RH,o1
l[/`kK
FROM pub_info AS p1 INNER JOIN pub_info AS p2 _ox+5?>
b7QE
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Za:j;u
Y
gg/`{
(一)内连接 e}UQN:1
|THpkfW
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 >pv.,cj
entU+O r
三种: h aAY =:
|?!i},Ki;
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 N6Mr#A-{
!"L.g u-'
表中的所有列,包括其中的重复列。 1$>+rW{a
'UX.Q7W
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 Og\k5.! ,
80=0S^gEZ
运算符包括>、>=、<=、<、!>、!<和<>。
BQ-x#[%s
&$MC!iMh
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 FZHA19Kb
b,xZY1a
结果集合中所包括的列,并删除连接表中的重复列。 w*qj0:i5as
]S6Gz/4aV+
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: nKx)R^]k
$^]K611w9
SELECT * XiW1X6
Zy}tZ RG
FROM authors AS a INNER JOIN publishers AS p 02-ql
F@i
w#"\*SKK
ON a.city=p.city @>2pY_
$V~@w.-Z#
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): I?e5h@uE
:`bC3Mr
SELECT a.*,p.pub_id,p.pub_name,p.country >US*7m }
@oXGa>Ru
FROM authors AS a INNER JOIN publishers AS p W2vL<
]VI^ hhf
ON a.city=p.city zggnDkC5
P'W} ]mCD
(二)外连接 1!#N-^qk
I
]m
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 |2(q9j
@Cj!MZ=T
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 v] m/$X2
Blpk
n1
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 yJA~4
aacy5E
如下面使用左外连接将论坛内容和作者信息连接起来: 78&|^sq
<L}@p8Lq
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b >*-%:ub
GP}; ~
ON a.username=b.username c./\sN@
T+Oqd\05.+
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: d ^bSV4
HbTVuf o
SELECT a.*,b.* =2R4Z8G
":]Xr!e
FROM city as a FULL OUTER JOIN user as b g3^s_*A
8g#$Y2P
ON a.username=b.username LmrdVSs_
j\y;~
V
(三)交叉连接 Ymut]`dX
@C;1e7
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 +f3Rzx]
y{<e4{
!
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 !<[+u
Xoj"rR9|
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 IiYL2JS;t|
xR+vu>f
于6*8=48行。 N`8K1{>BH
9CDei~
SELECT type,pub_name I Xc `Ec
0z8(9DlTc
FROM titles CROSS JOIN publishers MB]E[&Q!
2#wnJdr6E
ORDER BY type