一、简单查询 FB.!`%{
j$%yw4dsj
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 )j(fWshP
w1.MhA
表或视图、以及搜索条件等。 haik
w+3>DEfz
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 u,!4vKx
be_C>v
SELECT nickname,email @?j@yRe
)MMhlcNC
FROM testtable <Q\H
g!.Ut:8L9
WHERE name='张三' sOjF?bCdO
\/X{n*Hw?
(一)选择列表 1wU=WE(kKZ
f^ywW[dF
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 /H.(d 4C
\ p1K(H
量和全局变量)等构成。 T:dX4=z
Y+OYoI
1、选择所有列 _u`B3iG
6S2r
例如,下面语句显示testtable表中所有列的数据: i)GeX:
olHH9R9:
SELECT * c-ttds
sio)_8tp
FROM testtable CF,8f$:2
/bu'6/!`
2、选择部分列并指定它们的显示次序 KuU3DTS85Z
HgS<Vxmq
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 65;|cmjv
4LJ]l:m
例如: zuUQ."#i
Q*,6X*W!~
SELECT nickname,email u~
VswXc4
JO}#f+w}
FROM testtable f<) Ro$
0P3j+?
N%
3、更改列标题 -??!@R7V
b1eK(F
在选择列表中,可重新指定列标题。定义格式为: ^!$}
BY
A8#.1uEgNb
列标题=列名 V@LN
1|
0,;E.Py?.
列名 列标题 M"
xZz
%H 8A=
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 l7!U),x%/U
)PsN_ 42~
标题: XKpL4]{&q4
u-8X$aJ
SELECT 昵称=nickname,电子邮件=email "sz.v<F0:s
y|FBYcn#F
FROM testtable W\nHX I
lNq:JVJ#\r
4、删除重复行 16a_GwfM
E\
K
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 "
whO}
Wg}B@:`T
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 =}B4I
;"d?_{>7
5、限制返回的行数 7Qm;g-)f
=) mXCA^
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 #Nu%]
?ZSXoy-kr
表示一百分数,指定返回的行数等于总行数的百分之几。 </K%i;l
6ctHL<^
例如: a7XXhsZ
Xtu:
SELECT TOP 2 * /%N31
K> c8r8!
FROM testtable Z/XM`Cy
Vy?R/
Uu
SELECT TOP 20 PERCENT * ccHLL6F{
\O8Y3|<
FROM testtable m1~qaD<DZ$
{^PO3I
(二)FROM子句 2LhfXBWf
ZXFAuF
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, &:!ZT=
&4w\6IR
它们之间用逗号分隔。 V6DBKq
d,GtH)( s
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 [ u`17hyX
o2[vM$]
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 .g6PrhzFbk
Pg!;o=
{M
使用下面语句格式加以限定: 1qB!RIau
I_"Hgx<
SELECT username,citytable.cityid -13P 2<i+
WHpUjyBP
FROM usertable,citytable PK:o}IWn~x
1q}u?7nnSG
WHERE usertable.cityid=citytable.cityid 3{2^G@j
@%I_&!d
在FROM子句中可用以下两种格式为表或视图指定别名: >?\v@
zIAu3
表名 as 别名 FR@PhMUS
= )JVT$]w
表名 别名 7- *(a
AF9[2AH=Y
例如上面语句可用表的别名格式表示为: VuX>
}skRlC
SELECT username,b.cityid m>Yo9/XpZ
7dM6;`V^
FROM usertable a,citytable b &;~2sEo,
X]&;8
WHERE a.cityid=b.cityid LK
ei+9G,
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 !]{1h
uFm(R/V
例如: QoT3;<r}
~RZJ/%6F
SELECT a.au_fname+a.au_lname 8xD<A|
4."o.:8x
FROM authors a,titleauthor ta bo~{<UT
&6,Yjs:T m
(SELECT title_id,title |dB1R%
@dWS*@
FROM titles /P?|4D}<
oPBg+Bh*
WHERE ytd_sales>10000 &.+n
L
s{1Deek=
) AS t `PQ?8z|
DJD ]aI
WHERE a.au_id=ta.au_id V#-qKV
9QX~aX
AND ta.title_id=t.title_id OW63^wA`s
iSZctsqE
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 -A-hxK*^
</+%R"`
(三)使用WHERE子句设置查询条件 !%Hl#Pv}
(A] m=
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: k+7M|t.?4
R$T[%AGZ.
SELECT * &k_wqV
Bah.\ZsYQP
FROM usertable [d^:
[U3D`V$xD
WHERE age>20 -hU>1ux&V
{l *&l2
WHERE子句可包括各种条件运算符: c:@OX[##
]9KQP-p'
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< cAKoPU>U
v0hfY
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… }`<>$2b
.j:.WnW
NOT BETWEEN…AND… ^M"=A}h
Rvu3Qo+
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ~J. Fl[
FVC2 XxP
NOT IN (项1,项2……) <*r<+S
}n2-*{)x
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE aaqd:N)
O{i_?V_
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL &JXHDpd$a^
U>plv
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR xvx\H'
g+KzlS[6
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Rbj+P;t&
Kt4\&l-De
2、列表运算符例:country IN ('Germany','China') z:i X]df
w
/W
Cj4`
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 fN"oa>X
-'H+lrmv
varchar、text、ntext、datetime和smalldatetime等类型查询。 Br ^rK}|l
!OZhfMVd
可使用以下通配字符: ^ ]6
80h
?N!j.E4=
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 }N#>q.M
_iboTcUF
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 |3<ehvKy
uuUVE/^V'
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 ev: !,}]w
,~j$rs`Z
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Q~w G(0'8
1$!RKqT
例如: q@MjeGs%
.e
_D3Xp<
限制以Publishing结尾,使用LIKE '%Publishing' 4QKE{0NE
,m?UFRi
限制以A开头:LIKE '[A]%' U:P3Z3Y%
d-N"m I-
限制以A开头外:LIKE '[^A]%' gh #w%g1g
y~A7pzBZ=
4、空值判断符例WHERE age IS NULL z$BnEd.y=:
NKUI! [
5、逻辑运算符:优先级为NOT、AND、OR $vGEY7,
iq^L~RW5e
(四)查询结果排序 :UhFou_D4l
6kF
uMtjc
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: dXo'#.
'G3OZj8
ORDER BY {column_name [ASC|DESC]} [,…n] $m: a-.I
n 8OdRv
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 w)m0Z4*
9-E>n)
序。 55\X\>
0C7
_6-/S!7Y\
例如: *UL|{_)c
^qus `6
SELECT * <9k}CXv2PK
kz VI:
FROM usertable +@],$=aE?
&9lc\Y4PY
ORDER BY age desc,userid ASC etK,zEd
*ckrn>E{h
另外,可以根据表达式进行排序。 t`1]U4s&I
K7O?{/
K!:
,l
zHs
二、联合查询 ][5p.owJse
8rG&CxI
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 ?jn6Op
g1*H|nh2
合查询。UNION的语法格式为: W &wDH
7}1Kafs
select_statement zl#&Qm4Ot
sV'.Bomq
UNION [ALL] selectstatement :XQ
3F'dT[;
[UNION [ALL] selectstatement][…n] WmVw>.]@~
]ifHA# z`~
其中selectstatement为待联合的SELECT查询语句。 |p4OlUq
OI}HvgV^!
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 vlN. OQ
"A1yqK
行。 W>|b98NPu
Y6Qb_X:
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 hic$13KuP
Rw{v"n
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 VaIP
K
y4y
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 S2
h
;Kq?*H
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
DPxu3,Y
BG8)bhk;/
型,系统将低精度的数据类型转换为高精度的数据类型。 0o=)&%G
Z%9^6kdY
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: dVt@D&
=XBXSW8)DJ
查询1 UNION (查询2 UNION 查询3) %y7wF'_Y
ft qW3VW
R:R@sU
-*q2Y^A^l
bfI -!,
u
R%R]X
三、连接查询 J o(}#_y?
l(#Y8
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 %y\7
}qdJ8K
数据库管理系统的一个标志。 f EiEfu
,$qs9b~
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 :(p
rx
<({eOh5N
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 {]Iu">*
U`p<lxRgQ
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 _w/N[E
`LU,uz
查询。 uv!qE1z@':
~S>ba']
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 .*f4e3
#R PB;#{
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 L0VR(
?HyioLO
SQL-92标准所定义的FROM子句的连接语法格式为: e CUcE(
ZWW8Hr
FROM join_table join_type join_table $K5s)!
\ g(#)f
[ON (join_condition)] eRy'N|'
YY<?w
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 ^k<$N
RWQW/Gwx
个表操作的连接又称做自连接。
Q<ExfJm
9S1V!Jp
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 64>[pZF8
w&cyGd D5
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 uBkny;
xa0%;nFKe
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 TXl9c6
c] R![sa
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 3&Rqz9 W
RX\O'Zwl j
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 $K fk=@
!jq6cND
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 3i}B\
{
|3@Pt>Ikl
数据行。 kj=2+)!E7
:|Nbk58
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 TC#B^m`'p
2U+p@}cQUA
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Ol[IC
<!(n5y_
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 2`U&,,-Mf
-XG$ 0
运算符等构成。 h5keYBA
9d}nyJ
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 [te7uZv-
5g2+Ar(
连接。例如: ]LOtwY
}jgAV
SELECT p1.pub_id,p2.pub_id,p1.pr_info B:.;:AEbT
Ud*[2Oi|R
FROM pub_info AS p1 INNER JOIN pub_info AS p2 <ijmkNVS
$*-L8An?
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) }0>/G?2Yp
ppP?1Il`kb
(一)内连接 2`m _"y
I>Yp=R
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 6l7a9IJ
bLF0MVLM
三种: v[3sg2.
d`7] reh
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 8E%*o
x,_Ucc.
表中的所有列,包括其中的重复列。 |YFlJ2w
uhLmyK
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 OR8o%AxL7
M?u)H&kEl
运算符包括>、>=、<=、<、!>、!<和<>。 Sxu
v}y\
S]g)^f'a65
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 liP{Mu/LO
e,UgTxZ
结果集合中所包括的列,并删除连接表中的重复列。 ^D[;JV
k>hZ
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: k8V0-.UL}
Wh_c<E}&
SELECT * I
GtH<0Du
n_meJm.
FROM authors AS a INNER JOIN publishers AS p BZshTP[`
5xUPqW%3
ON a.city=p.city y<(.,Nb8
TaT&x_v^~a
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): nCB3d[/B
*?fBmq[j
SELECT a.*,p.pub_id,p.pub_name,p.country 1<|I[EI
P[i/o#
FROM authors AS a INNER JOIN publishers AS p ix`x dVj`
^dD?riFAk
ON a.city=p.city fZgU@!z
\RO Sd
(二)外连接 >WX'oP(<
mIodD)?{
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 $7YLU{0
a$8?0`(
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 rID]!7~
gHshG;z*
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 {Aw3Itef
RUu'9#fq
如下面使用左外连接将论坛内容和作者信息连接起来: nQ~L.V
3om-,gfZ
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b .R5z>:A
4*X$Jle|
ON a.username=b.username N2J!7uoQ
blv6
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: f}eVfAf
5GkM7Zu!{j
SELECT a.*,b.* kGP?Jx\PkH
6suc:rp";
FROM city as a FULL OUTER JOIN user as b 7Y:s6 R|
N> Y3[G+
ON a.username=b.username iwJgU
b
^)~M,rW8c
(三)交叉连接 v^G5
N)F
?VsZo6Z"
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 +%v4Ci"%y
;7>--_?=
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 S(l^TF
WcFZRy-erc
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 !
+ 7ve[z
HfPeR8I%i
于6*8=48行。 "RA$Twhj
OQvJdjST
SELECT type,pub_name n0q(EQy1U
P_g
FROM titles CROSS JOIN publishers |0-L08DW
$49tV?q5
ORDER BY type