一、简单查询 T&dNjx
H\oxj,+N
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ]jxyaE&%4
jH9PD8D\
表或视图、以及搜索条件等。 @I?,!3`jS
<Y7j' n
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 /~u^@@.
+bLP+]7oZ
SELECT nickname,email =o~+R\1ux+
6Q7=6
FROM testtable nt$PA(Y
dxAGO(
WHERE name='张三' ,$:u^;V(
.O1w-,=
(一)选择列表 nMzt_Il I
5@%Gq)z5
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 \ YF@r7
Zt!$"N.,
量和全局变量)等构成。 1[O cZCS
Z,2?TT|p
1、选择所有列 \#]%S/_ A
'RKpMdoz
例如,下面语句显示testtable表中所有列的数据: ,]wQ]fpt
xaVX@ 3r.3
SELECT * Kt*fQ
`9
3]?='Qq.(
FROM testtable Ebs]]a>PO
01-rBto$
2、选择部分列并指定它们的显示次序 h<3b+*wYJC
OP=brLGu0
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 x}K|\KXy
HJN GO[*g
例如: 1?H;
c5?d&
NzyEsZ]$
SELECT nickname,email "=s}xAM|A
pP":,8Q{
FROM testtable ^g6v#]&WA
KJoa^e;~
3、更改列标题 X5/j8=G H`
'uL$j=vB
在选择列表中,可重新指定列标题。定义格式为: 0vfMJzk
j[gqS%
列标题=列名 7QTS@o-
6AJ`)8HX
列名 列标题 j1g$LAe
ffL]_E
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 plB8iN`x<
59D'*!l-
标题: !Z2h?..O
A4@z+ebb l
SELECT 昵称=nickname,电子邮件=email zqdkt `
ty['yV-;a
FROM testtable h SS9mQ
dNf9,P_}
4、删除重复行 +BtLd+)R
.jqil0#)Y"
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ]I,&Bme
:j3'+%'2
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 >$rH,Er
}w35fG^
5、限制返回的行数 ]lfufjj
Hif|z[0$
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 xI?'Nh
9?ll(5E
表示一百分数,指定返回的行数等于总行数的百分之几。 Q3l>xh
|+Rx)
例如: Z1q<) O1QX
!%t@wQ]\hG
SELECT TOP 2 * `;}qjm0a
%IVM1
FROM testtable Xk%eU>d
vo
}4N[]Sb
SELECT TOP 20 PERCENT * o'$-
.jP|b~
FROM testtable i`l;k~rP
|khFQ(
(二)FROM子句 h='&^1
9'H:pb2
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, XkqsL0\
G2wSd'n*y
它们之间用逗号分隔。 0N!rIz
t&43)TPb.
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 U`~L}w"
RjUrpS[I
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 h~sTi
^^ix4[1$Z
使用下面语句格式加以限定: J#wf`VR%
,|$1(z*a{c
SELECT username,citytable.cityid 9s5s;ntz"
dRzeHuF92
FROM usertable,citytable SbUac<
\PN*gDmX
WHERE usertable.cityid=citytable.cityid ckFPx l.
sSKD"
在FROM子句中可用以下两种格式为表或视图指定别名: KS5a8'U
ehr\lcS<
表名 as 别名 8hww({S2
X=?9-z]
QO
表名 别名 u8?$W%eW
cy6YajOk7
例如上面语句可用表的别名格式表示为: 9
AD*
s7}-j2riq
SELECT username,b.cityid m\&99-j:@b
3%9XJ]Qao
FROM usertable a,citytable b M<l<n$rYS
eVMnI yr
WHERE a.cityid=b.cityid ]:F!h2
ZZkc) @
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 DS4y@,/)'
bydI+pVMo
例如: Q1kM 4Up
e9'0CH<
SELECT a.au_fname+a.au_lname DQu)?Rsk
Zp{K_ec{
FROM authors a,titleauthor ta x76;wQ
nvQX)Xf
(SELECT title_id,title R!"`Po
KIY`3Fl09
FROM titles N?rE:0SJ
L^CB#5uG
WHERE ytd_sales>10000 5>S1lyam
mmjWLrhlu
) AS t ?vWF[ DRd'
{l/`m.Z
WHERE a.au_id=ta.au_id 1jzu-s,F
2H8\P+
AND ta.title_id=t.title_id cna%;f.
er
BerbEEH
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 Yevd h<
*@@dO_%6
(三)使用WHERE子句设置查询条件 "-:g.x*d
\L?A4Qx)_
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: h~%8p
]
#t Pc<p6m
SELECT * @[\zO'|
w?*79 u
FROM usertable 4k{xo~+%,
Xep2)3k>
WHERE age>20 4,YL15.
^u90N>Dvq
WHERE子句可包括各种条件运算符: q3v5gz^t
;c|_z 9+
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ^XYK
}J
c*<BU6y
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… "ig)7X+Wz|
!w/fwOo
NOT BETWEEN…AND… EcytNYn
I%Z=O=
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) b!J?>du
i&\ >/ 1
NOT IN (项1,项2……) CO,{/
B )\;Ja
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE zFYzus`>
'O2/PU2_
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL Y HS/|-
yZoJD{'?Sw
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR ON>l%Ae4G
ZhRdml4U2
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 iM1E**WCtv
g^po$%I '
2、列表运算符例:country IN ('Germany','China') k
MV1$
OM7AK
B=S
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 hZo f
7#Fcn
varchar、text、ntext、datetime和smalldatetime等类型查询。 e=#D1
2*gB ~Jn4
可使用以下通配字符: p,(W?.ZDN?
c*R\fQd
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 S5H}
h~._R6y
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 I;?PDhDb
nHF~a?|FT
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 hVFZQJ?cv
;1_3E2E$
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Fwvc+ a
Tk 'Pv
例如: 9G7Br s:
Bz%wV-
限制以Publishing结尾,使用LIKE '%Publishing' Wi\k&V.mE
\fvm6$ rZ^
限制以A开头:LIKE '[A]%' _ q>|pt.W
|h/{qpsu
限制以A开头外:LIKE '[^A]%' K0I.3|6C
Ix(,gDN
4、空值判断符例WHERE age IS NULL Ne3YhCC>
tK# /S+l
5、逻辑运算符:优先级为NOT、AND、OR G~_D'o<r
,5T1QWn^f
(四)查询结果排序 /#t::b+>x
1@TL>jq
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 8NNs_~+x}
k1P'Q&Na
ORDER BY {column_name [ASC|DESC]} [,…n] ]j*uD317
kPA g*
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 '<e$ c
qf@P9M
序。 vwa*'C
Bk5 ELf8pL
例如: "So"oT1
+RiI5.$=Z
SELECT * $i!r> .Jo
z/WGL
FROM usertable !`W0;0'Zg
#_IuB) qy
ORDER BY age desc,userid ASC {+Wknm%
S
{+Z.P
另外,可以根据表达式进行排序。 v<(+ l)Ln
dd
+lQJ c
a>d`g
oe<@mz/
二、联合查询 X(#8EY}X
*c$UIg
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 mxpw4
AG;KXL[V
合查询。UNION的语法格式为: eZhF<<Y
B:cQsaty
select_statement Ty7`&
F$:UvW@e1
UNION [ALL] selectstatement @FF{lK?[
ofI,[z3
[UNION [ALL] selectstatement][…n] /+ais3
JFNjc:4{0
其中selectstatement为待联合的SELECT查询语句。 +o0yx U
7t
=@hCc
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 4?
rEO(SZ
~Dw%
d;
行。 n\BV*AH
0pH$MkQ
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 @~5Fcfmm
_^ n>kLd$
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 tqp i{e
0G Q8}r
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 2#/sIu-L
X(8LhsP
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ^q%f~m,O<
nYvkeT
型,系统将低精度的数据类型转换为高精度的数据类型。 Lm1JiPs d
_)YB*z5
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: U 17=/E
&%(SkL_]
查询1 UNION (查询2 UNION 查询3) *%atE
l0ZK)
SD@ 0X[
?=-/5A4K
7:JGr O
];=|))ky"
三、连接查询 q& KNK
W?ghG
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 S&'s/jB
KilN`?EJ
数据库管理系统的一个标志。 %@q2
vkG%w;
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
j>.1RG
vI48*&]wTf
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ^R(=4%8%"
$?[pcgv
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ?zVE7;r4U
D)S_ p&
查询。 1r*@1y<0"
VuK>lY&
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 gt~u/Z%
pQ4HX)<P
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ~[BGKqh
WZTv
SQL-92标准所定义的FROM子句的连接语法格式为: '[_.mx|cd`
1C*mR%Q
FROM join_table join_type join_table YZ<5-C
x[+bLlb
[ON (join_condition)] ,&* BhUC
YOvhMi
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 {aK3'-7
)}_}D+2
个表操作的连接又称做自连接。 q$ j
A\E ))b9+
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 #~w~k+E4
ol
{N^fiK
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 k!6m'}v
]j$(so"
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 mGF)Ot R
d+0= a]
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) W58%Zz4a
yKm6
8n^
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 I58$N+#
IfI:|w}:"r
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 /pLf?m9
oBo |eRIt|
数据行。 6 lEv<)cC
vuJEPn%
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 AOV{@b(
T+%P+
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 #)S&Z><<
7lwFxP5QT
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 aQ&K a
XSh[#qJ
运算符等构成。 ztp2j%'
- _%~b
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 pXA|'U5]
$uRi/%Q9
连接。例如: $}us+hGZ
l$R9c+L=
SELECT p1.pub_id,p2.pub_id,p1.pr_info t"MrrK>T
P1Iy>%3
FROM pub_info AS p1 INNER JOIN pub_info AS p2 r-]%R:U*
w:=:D=xH2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ={o)82LV
# |OA>[
(一)内连接 GR 1%(,
:C={Z}t/F
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 B9c
gVTLj
~JS@$ #
三种: /o}i,i$
^^a%Lz)U
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 xjrL@LO#
1/?K/gL
表中的所有列,包括其中的重复列。 L{&Yh|}
>>8{N)c5E
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ?<Mx* l
nm%7 e!{m
运算符包括>、>=、<=、<、!>、!<和<>。 Re*~C:
g+?2@L$L
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 \,lIPA/L
;(K"w*
结果集合中所包括的列,并删除连接表中的重复列。 ,<s:*
k
aH_FBY
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: k_gl$`A
>CHb;*U
SELECT * T?tZ?!6
ph%t
#R
FROM authors AS a INNER JOIN publishers AS p M.EL^;r
nD!t*P
ON a.city=p.city K @:t6
]xbMMax
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ]A1'+!1$
u4 ~.[3E*
SELECT a.*,p.pub_id,p.pub_name,p.country kD)]\
)Z\Zw~L
FROM authors AS a INNER JOIN publishers AS p /2tPd
J?hs\nA
ON a.city=p.city +NeoGnj
$)6M@S
(二)外连接 Wo,93]
o/=61K8D
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Qx_N,1>S
TnQW~_:
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 l701$>>
w")m]LV
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ? YluX
~b4kV)[ q
如下面使用左外连接将论坛内容和作者信息连接起来: `-?`H>+OG
N-45LS@
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b "}oo`+]Cq
UoSc<h|
ON a.username=b.username 8~|v:qk
VAe[x
`
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: N0 mhgEA
<KI>:@|Sc
SELECT a.*,b.* :EH>&vm
us.IdG
FROM city as a FULL OUTER JOIN user as b O.-A)S@
kX)*:~*
ON a.username=b.username 0+.<BOcW5
Xc~BHEp
(三)交叉连接 n_wF_K\h
O]@s`w
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 IfY?P(P
o5m]Gqa
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 P5GV9SA
Rh)%;
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 RRl`;w?
XQtV$Lw
于6*8=48行。 HJd{j,M
?>gr9w\
SELECT type,pub_name $-s8tc(
/wkrfYRs
FROM titles CROSS JOIN publishers MIN}5kc<
O:imX>|u
ORDER BY type