一、简单查询 lgTavs
%of#VSk
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 -R
4t
vKppXm1
表或视图、以及搜索条件等。 pX
]K-
ye1kI~LO(
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 is`Eqcj`dr
iQpKcBx
SELECT nickname,email dxlaoyv:
E 5PefD\m
FROM testtable 7-81,ADv(
HABMFv
WHERE name='张三' -fu=RR
SesJg~8
(一)选择列表 %RgCU$s[>
c;l
d
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 C.dN)?O
P`wp`HI
量和全局变量)等构成。 kBd #=J
T!eb=oy
1、选择所有列 &Mbpv)V8
$-9m8}U(Y
例如,下面语句显示testtable表中所有列的数据: R?g
qPi-
UPgjf
SELECT * Riid,n
IGs!SXclCs
FROM testtable
C,:3z
'S<ebwRd=
2、选择部分列并指定它们的显示次序 TfK$tTkM
N ?0T3-/K
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ?1 $.^
@qH{;
例如: A<.`HCv2
0hK)/!Y
SELECT nickname,email s<x2*yVUA
?}y?e}y*xZ
FROM testtable <N^2|*3
ipfiarT~)
3、更改列标题 `WHP#z
iF2/:iP
在选择列表中,可重新指定列标题。定义格式为: `V[{(&?,n
+~Ri CZt
列标题=列名 u(\O
#kT3Sx
列名 列标题 rz0~W6 U
wYZFW'5p
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 gl-O"%rMcL
-%"Kxe
标题: _
v\=ag
Y(
n# =
SELECT 昵称=nickname,电子邮件=email -#=v~vE
U.UN=uv_
FROM testtable 2'W3:
y)?Sn
4、删除重复行 0 }jB/Z_T
DWZ!B7Ts
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 H
`Fe|6I&
9r%O
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Ak[}s|,)
{Cnz7TVB
5、限制返回的行数 4)ez0[i$X
I?@9;0R
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 >lxhXYp
HjUs}#</
表示一百分数,指定返回的行数等于总行数的百分之几。 n\&[^Q#b|
CGvU{n,"
例如: h{I)^8,M
D U#6%8~
SELECT TOP 2 * &^^zm9{
*?%DdVrO@
FROM testtable 0m_c43+^
r8rU+4\8<
SELECT TOP 20 PERCENT * K1a$
m2
AjB-&Z
FROM testtable -4{sr|
lm
+s.r!?49+
(二)FROM子句 b_@MoL@A!
dM8`!~#&PI
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 0t?:
lpLjfHr
它们之间用逗号分隔。 $5T3JOFz
_!kL7qJ"
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 !_)*L+7f_
hSE\RX 9
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 hl?G_%a
Oe=7z'o
使用下面语句格式加以限定: rI)op1K
GZQy~Uk~
SELECT username,citytable.cityid w N9I )hB
F?xbVN
FROM usertable,citytable jHq.W95+P
~itrM3^"w
WHERE usertable.cityid=citytable.cityid ZAVj q;bq
iE>E*!aBg
在FROM子句中可用以下两种格式为表或视图指定别名: EE5I~k5
IGEs1
表名 as 别名 U~ QIO O
8R}CvzI
表名 别名 XqMJe'%r
&=y)C/u
例如上面语句可用表的别名格式表示为: {b~l[
4JSf t
t
SELECT username,b.cityid -bT1Qh
X
7<DlA>(oUX
FROM usertable a,citytable b 7(AB5.O
Sb I %|
WHERE a.cityid=b.cityid rAq2
| u{NM1,
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 $TS4YaJ%
(mIw3d8Tz
例如: AdDlS~\?
X-O/&WRYQ
SELECT a.au_fname+a.au_lname CEjMHP$=
$-'p6^5
FROM authors a,titleauthor ta tb#. Y
5SKj% %B2,
(SELECT title_id,title [=imF^=3Vb
hs< )<
FROM titles ;LM`B^Q]s
:G\f(2@
WHERE ytd_sales>10000 n!e4"|4~z
;@xSJqT
) AS t o8c4h<,
Cc7PhoPK
WHERE a.au_id=ta.au_id (;-<
@~2
'N#,,d/G
AND ta.title_id=t.title_id H$Om{r1j
R@Ch3l@
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 X}C}
^Rriu $\
(三)使用WHERE子句设置查询条件 H7!j5^
A7,TM&
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: R,?7|x
qELy'\
SELECT * k_$:?$
}cuU5WQ?%
FROM usertable `) s]T.-
]Gm"U!h*
WHERE age>20 p\T.l<p
70IBE[T&
WHERE子句可包括各种条件运算符: 1,q&A
RTS
jA9&hbQuL
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< uBp"YX9rx
j}~3m$
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Ao>] ~r0
z4
4(
NOT BETWEEN…AND… 9D,`9L5-=
\UZlFE
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 2Ur9*#~kGp
`{BY
{
NOT IN (项1,项2……) = rDoXm
*m$P17/C
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE SJ4[n.tPI
Q@zD'G>
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL uM|*y-4
L}r#KfIb
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR _qwKFC
X}Heaqn
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 /, T@/
uR#aO''
2、列表运算符例:country IN ('Germany','China') P:,@2el
^p3"_;p)h
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 \!D <u'n
[k qx%4q)
varchar、text、ntext、datetime和smalldatetime等类型查询。 ^i>Tm9vM
$e>(M&9,
可使用以下通配字符: &|cg`m
GcXh
V
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 VnqgN
k$j4~C'$
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Kxs_R#k
tB-0wD=PR
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 JRfG]u6GU
N,N9K
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 BWRM
gN'.
vhe[:`=a
例如: R0|dKKzS
i}d^a28
限制以Publishing结尾,使用LIKE '%Publishing' a'3|EWS
?
<7-Qn(m,
限制以A开头:LIKE '[A]%' zF'LbQz0[
^lADq']
限制以A开头外:LIKE '[^A]%' xz5V.
:Y/>] tS4
4、空值判断符例WHERE age IS NULL VHwAO:+-
7{0;<@
5、逻辑运算符:优先级为NOT、AND、OR =z_.RE
`1;m:,9
(四)查询结果排序 tCZ3n
E8$k}I
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: QnHb*4<
4KH8dau.fF
ORDER BY {column_name [ASC|DESC]} [,…n] .;),e#
`xb\)
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 r57CyO
,|:TML
序。 IY$v%%2WZ
C%#%_
"N
例如: :x85:pa
`[.b>ztqgJ
SELECT * |%p;4b
LU'<EXUbY
FROM usertable la37cG
\53(D7+
ORDER BY age desc,userid ASC Ph{7S43
-|Z[GN:
另外,可以根据表达式进行排序。 #j!RbW
V 5ve
ST'eJ5P7!5
b@6hGiqx
二、联合查询 {w/{)BnPG
8OV;&Z,x
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 W|C>X=zTi
v2Lx4:dzi
合查询。UNION的语法格式为: l~_]k
e+'PRVc
select_statement zVeQKN9^Z
Xaz`L
UNION [ALL] selectstatement =t@8Y`9w
v@_^h}h/,=
[UNION [ALL] selectstatement][…n] |AgdD
j%_{tB
其中selectstatement为待联合的SELECT查询语句。 .
#+ N?D<
yHYqJ|t
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 F ?APDGAN
..Q$q2.
行。 0#$<2
qeM`z
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 |r|<cc#
T;?=,'u
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 c~,OU7[
c)L1@ qdZ
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 NOzAk%s3I
ZeB"k)FI>
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 WD`z\{hcom
pv
LA:LW2
型,系统将低精度的数据类型转换为高精度的数据类型。 $-x@P9im
}MW7,F
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: $_ &Lp\
.k_>
BD];
查询1 UNION (查询2 UNION 查询3) $C&y-Hnar
H]zi>;D
]x;*Z&
gfr
y5e
gAFu
A(j9T,!
三、连接查询 oR``Jiob|
O1C|{
M
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 '3<AzR2
/=y _#l
数据库管理系统的一个标志。 u*W6fg/"
/Soc,PjZ
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 7dg2-4
[unK5l4_!
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ^0x0 rY
%$'YP
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 Q/u2Q;j>
0`=>/Wr39
查询。 DK6^\k][V
xAZ-_}'tW
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 q3_ceXYU
uT\|jv,
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 {jK:hQX
;$il_xA)\>
SQL-92标准所定义的FROM子句的连接语法格式为: aAT!$0H
47/14rY
2
FROM join_table join_type join_table +VE]
.*T
>14x.c
[ON (join_condition)] c] '-:=
xJNV^u
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 @Yu=65h
>GV(\In
个表操作的连接又称做自连接。 $vC}Fq
N(7UlS,u'
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 EFk9G2@_
,NA _pvH)
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 I1Jhvyd?$
6Fe$'TP
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 `!um)4
9ZYT#h
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ntZl(] l
Y8s.Q
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 K{vn[}
.%x1%TN
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 W Z_yaG$U
3hD\6,@
数据行。 9w"kxAN
Cih~cwE
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ge[hAI2I
wf,B/[,d
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 4.t72*ML
R= co2 5
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 Y3n6y+Uzk
Y}n$s/O:u8
运算符等构成。 H,Y+n)5
'v~%rhq3
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 xG7/[ jG
5Z<y||=
连接。例如: pWm==Ds|
141G~@-
SELECT p1.pub_id,p2.pub_id,p1.pr_info NB.s2I7
|Nf90.dL
FROM pub_info AS p1 INNER JOIN pub_info AS p2 ?TLzOYJp
xIb"8,N
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ->u}b?aF
c H7Gb|,M
(一)内连接 v>!tws5e
{gkY:$xnrG
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 9sId2py]W
Z`jSpgWR
三种: r9vO(m~
rGt/ /6
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 6!|/(~
71I: P|.>
表中的所有列,包括其中的重复列。 g.]S5(
U=vh_NHj
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 G@=H='
:~
3[UB3F4K
运算符包括>、>=、<=、<、!>、!<和<>。 i2yE-sgF
p_:bt7
B
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 `JZ`j7f
6|@\\\l
结果集合中所包括的列,并删除连接表中的重复列。 1:j[p=Q&
VX+:C(m~
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: b9L"?{
9l&4mt;+&<
SELECT * I$Ra*r
SKdh!*G
FROM authors AS a INNER JOIN publishers AS p D>`lN
\pwg8p[4Q
ON a.city=p.city
IPDQ
qi]"`\
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): d#>iFD+
6%\&m|S
SELECT a.*,p.pub_id,p.pub_name,p.country C8bBOC(
lWRRB&8
FROM authors AS a INNER JOIN publishers AS p F4|U\,g
U^~jB= =]
ON a.city=p.city N_Q\+x}zq
rsPo~nA
(二)外连接 }M|,Z'@*
L
>HyBB
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 k%TjRf{p
^ - H
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 hTS?+l
[39
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 YkJnZ_k/P
%1UdG6&J_
如下面使用左外连接将论坛内容和作者信息连接起来: tGVC"a
M\L^ Wf9
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ;UPI%DnE]
gQ;1SY!
ON a.username=b.username v$]eCj'
0NFYFd-50
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: cP,bob]
<"HbX
SELECT a.*,b.* <UE-9g5?G
3OvQ,^[J4
FROM city as a FULL OUTER JOIN user as b 2(s-8E:
1
[D,Mu%E
ON a.username=b.username 6U?z
/^9K Zj
(三)交叉连接 fb;y*-?#
K)_DaTmi)
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 j3_vh<U\
/{sFrEMP\
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 n*nsFvt%o
$PbwC6>8
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 KOYcT'J@vR
Nt/#Qu2#br
于6*8=48行。 kW.it5Z#
i&',g
SELECT type,pub_name 4PDxmH]y
-j"]1JLQ
FROM titles CROSS JOIN publishers r{
}&* Y
%DIZgPd\
ORDER BY type