一、简单查询 2izBB,# "
@ScC32X
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 d`%7Pk
JbMp /
表或视图、以及搜索条件等。 *P&lAyt6
ePxAZg$ `>
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 GiXs`Yt|
sGpAaGY>
SELECT nickname,email D9hq$?
q'IMt7}
FROM testtable x}=Q)|)]
AJ3Byb=.
WHERE name='张三' J,s:CBCGL
.Yz^r?3t
(一)选择列表 @\>7
wt_'
NLUO{'uUW
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 6E(..fo:"
Rm6i[y&
量和全局变量)等构成。 CkNh3'<wg
DJqJ6 z:'
1、选择所有列 !1A< jL
dP>FXgY
例如,下面语句显示testtable表中所有列的数据: jM-5aj[K
g_?Q3
SELECT * uD[T l
<AP.m4N) _
FROM testtable 563ExibH
}wI+eMr
2、选择部分列并指定它们的显示次序 v yt|x5
a=v H:D
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 FPPl^
rj?c
例如: 7(P4KvkI
%c%`<y<~L
SELECT nickname,email kpNp}b8']
LvZ',u}
FROM testtable 0F%?<:
&
fvV"H{V,
3、更改列标题 \MPbG$ ^
TefPxvd
在选择列表中,可重新指定列标题。定义格式为: "5?1S-Vl
rhly.f7N=A
列标题=列名 3Wx\Liw,
T21?~jS
列名 列标题 FU.?n)P
zJ:%iL@
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 <:mK&quf
7#7|+%W0
标题: `O;4b#!g
FJxb!-0&
SELECT 昵称=nickname,电子邮件=email Q}a(vlZ
r:4]:NKCi
FROM testtable <(V~eo
e
.])X.7@x
4、删除重复行 "CREls,
JZE@W-2
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Kltqe5
z<0/#OP'
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
/<%L&
5r~hs6H
5、限制返回的行数 M-q5Jfm
whrDw1>(
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 %Y5F@=>&
'fk6]&-I
表示一百分数,指定返回的行数等于总行数的百分之几。 <U\8&Uv>
"V`DhOG&
例如: ^!n|j]aw
I:YgKs)[
SELECT TOP 2 * &2O~BIRE
jB0Ts;5
FROM testtable 'iDkAmvD
?du*ITim
SELECT TOP 20 PERCENT * >&F:/
3SPXJa\i
FROM testtable u]ps-R_$G
-z
se+]O`
(二)FROM子句 oJ/=&c
"ctZ"*
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, , q{~lf-
S-</(,E}|
它们之间用逗号分隔。 aVr =7PeF
TqOH(={
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 <E^;RG
uK1VFW
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 3a=\$x@
~C3Ada@4
使用下面语句格式加以限定: 9|OOT[
"QD>:G;u
SELECT username,citytable.cityid o#BI_#b
b@K1;A! S
FROM usertable,citytable imhE=6{
aH8]$e8_,\
WHERE usertable.cityid=citytable.cityid (XFF}~>B.
HW#@e kh
在FROM子句中可用以下两种格式为表或视图指定别名: }jdmeD:
-pQ?ybQ
表名 as 别名 W`TSR?4~t?
I
}8b]
表名 别名 hb)C"q=
kVG+Wr7l0F
例如上面语句可用表的别名格式表示为: c>+68<H
e+>$4Jq
SELECT username,b.cityid jtE'T}! d
*m`x/_y+
FROM usertable a,citytable b r>CBp$
\0 &$n
WHERE a.cityid=b.cityid \pSRG=`
];N/KHeZ
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 \(`C*d
hFhC&2HN
例如: Ra:UnA
6k<3,`VV|
SELECT a.au_fname+a.au_lname G{Uqp'=G
roe_H>
FROM authors a,titleauthor ta LW">9;n
CUBL/U\=
(SELECT title_id,title %|j`;gYV
aOsc_5XDR;
FROM titles r@wE?hK
TB84}
WHERE ytd_sales>10000 ((^vsKT
^BW8zu@=O
) AS t &+H\ST(/
cFuQ>xR1
WHERE a.au_id=ta.au_id ,_=LV
PGVP0H+RV
AND ta.title_id=t.title_id 7_rDNK@e
,Z7Ky*<j
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ng6E&<Z
#c'}_s2F[
(三)使用WHERE子句设置查询条件 w=0zVh_`(
P4c}@Mq3
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: h53G$Ol.
Ln/*lLIOb
SELECT * f2v~: u
54RexB o
FROM usertable [=u@6Y
47A[-&y*X
WHERE age>20 st#^pWL
]5MT-qU
WHERE子句可包括各种条件运算符: + EKp*Vje
vVsaGW
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Lw?>1rTT/
0G+qF96
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… :X7O4?ww
5Z#(C#
NOT BETWEEN…AND… vB5mOXGN q
I+jc
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) \\d8ulu
r "\<+$ 7
NOT IN (项1,项2……) Wv,?xm
N~S#(.}[
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE WM=)K1p0u
Lu[Hz8
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 9,"gXsvx(
tlI]);iE,
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR th0>u.hJ
-;i:bE
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 CL t(_!q
aFh'KPhe
2、列表运算符例:country IN ('Germany','China') :z|$K^)7Z
V_|HzYJJ5
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 )_?H BTG
UM0#S}
varchar、text、ntext、datetime和smalldatetime等类型查询。 Cwji,*
(@O,U
可使用以下通配字符: zNEN[
tM;+U
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 +|4olK$[
N2u4MI2
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 avXBCvP+h
ax2#XSCO
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 >F/E,U ]
l[nf"'
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 a"k,x-EL(
*_ajb:
例如: ma`sv<f4-!
f
uH3C~u7<
限制以Publishing结尾,使用LIKE '%Publishing' c5[~2e
?9*[\m?-
限制以A开头:LIKE '[A]%' E6- ~
5yroi@KT
限制以A开头外:LIKE '[^A]%' |m$]I4Jr
'sk M$jr
4、空值判断符例WHERE age IS NULL q1|@v#kH6
4!?4Tc!X
5、逻辑运算符:优先级为NOT、AND、OR 5?E;YyA
W,nn,%
(四)查询结果排序 -^rdB6O6j
Lk-h AN{[
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: c&`]O\D-c
q1/ mp){
ORDER BY {column_name [ASC|DESC]} [,…n] ;;EFiaA
,%y!F3m
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 T7M];@q
gf8~Zlq4v
序。 Jp~[Dm
Maiy d
例如: b1Ba}
)_Iu7b
SELECT * gO]8hLT
3BB/u%N}
FROM usertable L 1q]
>R\!Qk
ORDER BY age desc,userid ASC X(C=O?A
7TZ,bD_
另外,可以根据表达式进行排序。 pWb8X}M
|j$$0N
ZYz8ul$E
os+]ct
二、联合查询 Mo4igP
3E8 Gh>J_
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 c{i\F D
9}d^ll&
合查询。UNION的语法格式为: *
a VT
36 ]?4, .
select_statement 2W)KfS
<?!%dV{z
UNION [ALL] selectstatement &tlU.Whk+
m;u :_4
[UNION [ALL] selectstatement][…n] \YH*x`
$rQi$w/
其中selectstatement为待联合的SELECT查询语句。 $,1KD3;+]
7+P-MT
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 74KR.ABd
kyD*b3MN
行。 /J&_ZDNV~
rX|{nb
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 k_ijVfI9
x0q`Uc
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 R!:F}*
mFBuKp+0)h
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 0}$R4<"{Y>
:U'Oc3l#Y
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 XC,by&nY<y
-qB{TA-.\
型,系统将低精度的数据类型转换为高精度的数据类型。 z*/}rk4i
F\+!\b*lP
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: WAGU|t#."
.[vYT.LE
查询1 UNION (查询2 UNION 查询3) va;fT+k=
K`kWfPwp
G5$YXNV
FC8#XZp
5Yx
7Q:D
-p20UP 1I
三、连接查询 ?#u_x4==e
= /=?l
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 U~<~>^[
>]?!9@#IH
数据库管理系统的一个标志。 OJ)XJL
S6c>D&Q
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 WNiM&iU
N-Sjd%Z
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 +J:wAmY4
j 4eq.{$
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 B..> *Xb
]goPjfWvU"
查询。 Yr 1k\q
8Y~\:3&1<
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 WL1$LLzN
:n$?wp
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 O[HBw~
Qy|6A@
SQL-92标准所定义的FROM子句的连接语法格式为: =b#,OXQ
DMd&9EsRG
FROM join_table join_type join_table Q%_MO`<]$
Wvwjj~HP2}
[ON (join_condition)] wZ~eE'zx+
HmRmZ3~
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 DM*u;t{i
RVa{%
个表操作的连接又称做自连接。 S(hT3MAW
E>`gj~
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 0J1&6b
C)+%9Edg
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 @s~*>k#"#
&uG@I=}TIY
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 Yj>ezFo
lgh+\pj
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 87:V-*8
v^(J+d_>
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 '=>l& ;
P<IZ%eS3B
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 e2MjV8Bs
B3V+/o6
数据行。 H@ .1cO
hg}R(.1K=
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 {$)pkhJ
Oftjm
X_
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ]YwvwmZ
)r:gDd#/X
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 H.[t&VO
hquN+eIDH
运算符等构成。 !i?aRI/6
S *K0OUq
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 9l:vVp7Uk
H4g1@[{|0O
连接。例如: qwHP8GU
>7nOR
SELECT p1.pub_id,p2.pub_id,p1.pr_info jMQ7^(9-
[fr!J?/@
FROM pub_info AS p1 INNER JOIN pub_info AS p2 $C9['GGR
G0pqiU6
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) >Gxh=**F
&3bh K5P
(一)内连接 ;&]oV`Ib
F}=O Mo:.
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 F48W8'un
u_X(c'aE;
三种: ]ag^~8bG
@
OiMr,
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ='\E+*[$I
*|&&3&7
表中的所有列,包括其中的重复列。 Z6_E/S
C+Pw
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 AWz|HF#-
%2EHYBQjN
运算符包括>、>=、<=、<、!>、!<和<>。 `NARJ9M
w.R2' WR
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 qJT|om
LY
uPBtR
结果集合中所包括的列,并删除连接表中的重复列。 u1_NC;
&=hkB9
;
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: vy1N,8a
'=]|"
SELECT * `& }C*i"
ThJ`-Ro
FROM authors AS a INNER JOIN publishers AS p _$BH.I
299uZz}Y
ON a.city=p.city >'2=3L^Q
nTxN>?l2E
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): [p&2k&.XYe
k{w
SELECT a.*,p.pub_id,p.pub_name,p.country C+X-Cp
OA{PKC
FROM authors AS a INNER JOIN publishers AS p ,ku3;58O<
$%0A#&DVh
ON a.city=p.city c-bTf$6}
f
l*O)r
(二)外连接 Gjo&~*;
8c0ugM
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 &1,{.:@e
LXx`Vk>ky
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外
o
C#W
uEcK0>xp
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 a&s&6Q|Y
5R/k8UZ
如下面使用左外连接将论坛内容和作者信息连接起来: /F7X"_(H
NGOyd1$7N
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b >q)VHV9P
rwvCp_pN.
ON a.username=b.username f`"@7-N
`w/b];e1)
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: %8~g#Z
S# sar}-I
SELECT a.*,b.* Sx}61 ?
R\,qL-Br
FROM city as a FULL OUTER JOIN user as b V[baGNe
`} :~,E
ON a.username=b.username F=r`'\JV[
x|q|> dPB
(三)交叉连接 i+eDBg6
-Gmg&yQ9
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 qASV\
<n
GP;UuQz
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 I18<brZJ
Vf] ;hm
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 9>hK4&m^
UJhUb)}^
于6*8=48行。 _omz74
^P}c0}^
SELECT type,pub_name ]aTF0 R
)ME'qA3K
FROM titles CROSS JOIN publishers Ki(
r0/o{Y|l6
ORDER BY type