一、简单查询 `@ObM[0p(
n4:WM+f4
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 2}`OjVS
rnW i<Se
表或视图、以及搜索条件等。 DCNuvrZ
U{ Y)\hR-
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 XhS<GF%
OTRTa{TB
SELECT nickname,email fF9vV. }
(YR1ML3N
FROM testtable 4fN<pG,
jQc0_F\
WHERE name='张三' m^ILcp!
i^n&K:6
(一)选择列表 }SYvGp{J,
=IUTU4!]
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 <%!@cE+y
;%U`P8b!
量和全局变量)等构成。 :!R+/5a
0$UE|yDs>
1、选择所有列 Z6Mh`:7
IE|$>q0Z
例如,下面语句显示testtable表中所有列的数据: !rXyw`6N
]6%| L
SELECT * 3A+d8fwi
\Wo,^qR
FROM testtable hWUZn``U$|
#bGt%*Re p
2、选择部分列并指定它们的显示次序 $GcVC (]
lAoH@+dyA+
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 DukCXyB*l
?(mlt"tPk
例如: K(_nfE{
-JcfP+{wS
SELECT nickname,email ;}r#08I
)37|rB E
FROM testtable <AB]FBo(
< B'BlqTS
3、更改列标题 HK }C<gg
YS;Ql\4
在选择列表中,可重新指定列标题。定义格式为: i |C'_gw`n
YpAjZQZ,
列标题=列名 TEY%OIzU+
\s,ZE6dQ
列名 列标题 nlJxF5/
Fd3V5h
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 N5g!,3
0{ \AP<
标题: Q|;8\5
iLgWzA
SELECT 昵称=nickname,电子邮件=email Yw./V0Z{@
' (ql7
FROM testtable q),yY]5
JD,/oL.KA
4、删除重复行 HogT#BMs
1}'|HAu
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 O[$&]>x]]
TJ+yBMd*%
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 v\&Wb_;A
}"A.[9 b
5、限制返回的行数 |E|d"_Ma
V,lz}&3L
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 F(mm0:lT
)/Ul"QF
表示一百分数,指定返回的行数等于总行数的百分之几。 ,zO!`|I
,\ov$biL
例如: Yf<6[(6 O
lLl^2[4k5
SELECT TOP 2 * 8M!If
`N$<]i]s5
FROM testtable gLU #\d]
9z,V]v=
SELECT TOP 20 PERCENT * rtC.!].;%
iE>T5XV8$B
FROM testtable TTu<~GH
!@5B:n*
(二)FROM子句 u|i.6:/=
fmFh.m.+N
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, fsb_*sh&
r;SA1n#
它们之间用逗号分隔。 F~4oPB K<
BlMc<k
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 k\I+T~~xD
n-0RA~5z
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 Q`'w)aV
g"^<LX-
使用下面语句格式加以限定: fn]f$n*`
``DS?pUY
SELECT username,citytable.cityid F^z&s]^~
9F@ Q
FROM usertable,citytable !3E33
n](Q)h'nlo
WHERE usertable.cityid=citytable.cityid Jwgd9a5
.gzNdSE
在FROM子句中可用以下两种格式为表或视图指定别名: } U\n:@:2B
(w`9*1NO
表名 as 别名 cl/}PmYIZ
G?v]p~6
表名 别名 )w=ehjV^m
*\L\Bzm
例如上面语句可用表的别名格式表示为: ncjtv"2R
?%d]iTZE
SELECT username,b.cityid *;5P65:u$>
1#/>[B
FROM usertable a,citytable b #+>8gq^5
&3#19v7/
WHERE a.cityid=b.cityid ===M/}r
/J9|.];%r
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 unY+/p $
H}Z\r2
例如: N D`?T
&PK
t Y'fFz^Ho
SELECT a.au_fname+a.au_lname fq-e2MCX5
Bs:INvhYW
FROM authors a,titleauthor ta f_I6g uDPz
xJlf}LEyF
(SELECT title_id,title * `1W})
/N>f#:}
FROM titles ER-X1fD
Rw-!P>S$
WHERE ytd_sales>10000 2 ,RO
bVO{,P2o
) AS t
qp;eBa
G
|033(j
WHERE a.au_id=ta.au_id Ti:PKpc
LpN_s#
AND ta.title_id=t.title_id =n7QL QU
mhpaPin*JS
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 EVYICR 5g
X+dLk(jI`u
(三)使用WHERE子句设置查询条件 1g<jr.
)i|0Ubn[|
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Jga;nrU
l/ufu[x!a
SELECT * U|yXJ.Z3
vM5yiHI(jb
FROM usertable F8Y_L\q
+J[<zxh\
WHERE age>20 dPvRbwH<
M5\$+Tu
WHERE子句可包括各种条件运算符: jjLx60|{
_ x8gEK8
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ~FCkr&Ky3
;@/^hk{A
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ZMa@/\pf1
! W2dMD/
NOT BETWEEN…AND… A~0eJaq+
lFJDdf2:$C
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) z'"e|)
Es]:-TR
NOT IN (项1,项2……) !:BmDX[<n
,r_%p<lOFu
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ?/3'j(Gk
oyC5M+shP9
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL VkW N1A
eICavp
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR ykMdH:
n[+$a)$8
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 w{+G/Ea
}aSTo"~m#
2、列表运算符例:country IN ('Germany','China') VB&`S+-
[a201I0 -
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 1|bg;X9+
<b>g^ `}?D
varchar、text、ntext、datetime和smalldatetime等类型查询。 +PAb+E|,
^L4"X~eM
可使用以下通配字符: Rq`d I~5!b
hlKM4JT\
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 @{V bu
T@H<Fm_
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Te d1Ky2O
xky +"
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 4>R)2g
RwyX,|
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 CNMcQP
VPi*9(LS
例如: H6/n
KATu7)e&~^
限制以Publishing结尾,使用LIKE '%Publishing' SB
x<-^
ks19e>'5Q
限制以A开头:LIKE '[A]%' 'Bx"i
,::f?
Gc7j
限制以A开头外:LIKE '[^A]%' (baBi9<P=
H3#rFO"C*
4、空值判断符例WHERE age IS NULL W6^YFN
fug
Fk
5、逻辑运算符:优先级为NOT、AND、OR Gg TrIF
Ht4A
(四)查询结果排序 6N<
snBmd
r}nz )=\Cj
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: z{m%^,Cs,
(Q(=MEar
ORDER BY {column_name [ASC|DESC]} [,…n] XP%/*am
(/$a*$
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Bcl6n@{2f
g>*P}r~;^b
序。
:q34KP
/<
-+*79G
例如: M!4}B
i+@t_pxc
SELECT * D;! aix3
\%/Y(YVm
FROM usertable &"6%D|Z0
Um%$TGw5
ORDER BY age desc,userid ASC 1c4@qQyo
JRr'81\
另外,可以根据表达式进行排序。 v{8W+
NTV@,
Xn6'*u>+;[
PN"SBsc*j-
二、联合查询 zBjbH=
|V-)3#c
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 PblO?@~O
;&9wG`
合查询。UNION的语法格式为: %X -G(Z
}rA
_4%
select_statement FR^(1+lx&
*f-8egt-
UNION [ALL] selectstatement ]k)h<)nY
v43FU3
[UNION [ALL] selectstatement][…n] :{=2ih-}
\5DOp-2
其中selectstatement为待联合的SELECT查询语句。 Z/oP?2/Afh
|2!cPf^8
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
*\# ?)q
WfH4*e
行。 hQ _gOI
m{?uR.O
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 U2CCjAgRs
yL#2|t(
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 qr'P0+|~5
v=J[p;H^H
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 1kczlTF
3?r?)$Jk
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 4l?"zv1
L(`Rf0smt
型,系统将低精度的数据类型转换为高精度的数据类型。 Dssecc'
BvqypLI
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: k.6(Q_TS
4l~B/"}
查询1 UNION (查询2 UNION 查询3) }ZB:nnG
@QbTO'UzK`
O
Ce;8 ^
X;QhK] Z
XK,l9 {*
;@s'JSPt
三、连接查询 ss'`[QhR2
JAU:Wqlg1
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 EF8'ycJk+
f0ME$:2
数据库管理系统的一个标志。 VQ/Jz5^
"
"{#~X}
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 u Tvck6
RGz NZc
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 q-D|96>8
vN$j@h .
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ;S}_/'
f[+N=vr
查询。 Q}|QgN
(4"Azo*~![
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 L9^h.Y7
M&ec%<lM
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 !A=>B=.|D
Q|Go7MQZ@k
SQL-92标准所定义的FROM子句的连接语法格式为: <~iA{sY)O
'w`3( ':=
FROM join_table join_type join_table &-2i+KjEX
n+H);Dg<8
[ON (join_condition)] DcX,o*ec!
B`/p[ U5
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 ,#hx%$f}d
BiI`oCX
个表操作的连接又称做自连接。 {N`<THPP
c5AEn -Q
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 a[A*9%a
X%]m^[6
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 We:b1sZR
-=VGXd
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 tY0C& u2
e> Q_&6L
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) b^C2<'
'G8.)eTA'
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 [.LbX`K:
n81z0lnr
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 [O\[,E"K
#7"*Pxb#A
数据行。 65AG#O5R
D9-D%R,
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 D/TEx2.=J3
i5CBLv
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 /p7-D;
vj4n=F,Z
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 WN9K*Tt~o&
C
]+J
运算符等构成。 ';Ew-u
ylPDM7Ka
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 _H)>U[
4@1C$|k
连接。例如: QTbv3#
9vw0box
SELECT p1.pub_id,p2.pub_id,p1.pr_info q<>aZ|r
h+d3 JM
FROM pub_info AS p1 INNER JOIN pub_info AS p2 A-5'OI
* vW#XDx
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) V7q-Pfh!y
)Y
9JP@}T
(一)内连接 MrFi0G7u
5@< D6>6
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 Y=tx
kN
U]W+ers
三种: 5,u'p8}.
~|. vz!A
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 $Oi@B)=4d+
]q<Zc>OC
表中的所有列,包括其中的重复列。 3e7P
w`gLl
\&.]!!Q
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 1k?k{Ri
iES?}K/q
运算符包括>、>=、<=、<、!>、!<和<>。 @-G^Jm9~\m
.7v
.DR>
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 <