一、简单查询 wx(|$2{h
_w+sx5
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 8[f]9P/i
(5-"5<-@R
表或视图、以及搜索条件等。 o'myo.k{
/c/!13|
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 xi;SKv;p
3X0^xUA6
SELECT nickname,email +ls *04
QEUg=*3W=
FROM testtable K"Nq_Ddwd
kp<9o!?)
WHERE name='张三' p`{<q
-
"5XD+qi
(一)选择列表 l:Ci'=
`U p<;
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 bL
*; N3#E
xkUsZ*X8B
量和全局变量)等构成。 ^fnRzX
? ]kIztH
1、选择所有列 M P0ww$(
f=~@e#U
例如,下面语句显示testtable表中所有列的数据: /;HytFP
zd#qBj]g
SELECT * Vl^jTX5N
s.zH.q,
FROM testtable *I'O_D
jGI!}4_
2、选择部分列并指定它们的显示次序 (jY.S|%
( }JX ]-
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 K<Yh'RvTD
'O\K Wj{
例如: +|#sF,,X4g
k qwS/s
SELECT nickname,email s)/i_Oe$\
D
?,P\cp
FROM testtable _?q\tyf3
uT;Qo{G^
3、更改列标题 *#UDMoz<
/"iYEr%_
在选择列表中,可重新指定列标题。定义格式为: ml?+JbLg0
A*\4C3a'%
列标题=列名 LfgR[!
I|WBT
列名 列标题 D*D83z OzN
Yl-09)7s
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 q%>L/KJ#
!EpP-bq'*
标题: B>?. Nr
=9pFb!KX
SELECT 昵称=nickname,电子邮件=email z)|56
F7'
#exE~@fy-
FROM testtable BIcE3}dS8
00b
)B g
4、删除重复行 L]HY*e
9^
mrsj
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 .' .|s?s
:kFWUs=
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 hrcR"OZ~X
O^:Rm=,$
5、限制返回的行数 Y=}b/[s6;
4qyL' \d[
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 M5%u>$2
6x[gg !;85
表示一百分数,指定返回的行数等于总行数的百分之几。 "F%cn@l
7qzI]
例如: _Dk;U*2
ND21;
SELECT TOP 2 * TAzhD.6C
37lmB
'~
FROM testtable 2!" N9Adt
Xv:<sX
SELECT TOP 20 PERCENT * vhhsOga
WfO6Fvx%
FROM testtable IS'=%qhC`
ze#LX4b I
(二)FROM子句 YtIJJH
.[O*bk
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, =AR'Pad
fMLm_5 (H
它们之间用逗号分隔。 &1B)mj
x%x[5.CT
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 EW]gG@w]5r
KgKV(q=
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 Xb;CY9&
/- kMzL
使用下面语句格式加以限定: NrL%]dl3/
2@^8{
SELECT username,citytable.cityid yl3iU:+V
pK$^@~DE
FROM usertable,citytable dmE-WS
[_H9l)
WHERE usertable.cityid=citytable.cityid ICV67(Ui
A?6b)B/e?
在FROM子句中可用以下两种格式为表或视图指定别名: T8qG9)~3
O'5(L9,
表名 as 别名 ]>`Q"g~0
_G'.VSGH
表名 别名 <cWo]T`X!
]A'e+RD4k
例如上面语句可用表的别名格式表示为: N 4,w
1` 9/[2z
SELECT username,b.cityid N8mK^{
78NAcP~6c
FROM usertable a,citytable b !)&-\!M>
St&XG>nWS
WHERE a.cityid=b.cityid gw5CU)r4$
eH1Y!&`
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 \>jK\j
ExnszFX*
例如: B;rq{ac!P]
W 6jB!W
SELECT a.au_fname+a.au_lname 3HfT9
Y4b"(ZhM_
FROM authors a,titleauthor ta SZyPl9.b
/+66y=`UJ
(SELECT title_id,title -8TJ~t%w4
Ya,>E@oc
FROM titles vguqk!eo4
K,^b=_]
WHERE ytd_sales>10000 5a_K|(~3I
@Yt[%tOF+
) AS t 47t^{WrT
`Y+p7*Qr2
WHERE a.au_id=ta.au_id Lqz}h-Ei
6%:'2;xM
AND ta.title_id=t.title_id c.d*DM}W
7Qq>?H -
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 Ak4iG2
6i&WF<%D
(三)使用WHERE子句设置查询条件 EI/_=.d
7$b78wax
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: aP4r6lLv+
6Lz&"C,`
SELECT * @3b0hi4
^yBx.GrQc
FROM usertable `)SkA?yKI
b}k`'++2,
WHERE age>20 7(wY4T
Y}F+4
WHERE子句可包括各种条件运算符: !f"@pR6
vY.p~3q :)
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< i\,#Z!
_D
z4}:9
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… K _y;<a]
~9x$tb x-
NOT BETWEEN…AND… A"w
1GBx
QDSB
<0j
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 5w{_WR6,
]k >S0
NOT IN (项1,项2……) 80 p7+W2m
"y5c)l(Rg
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE NlWIb2,
@'~v~3
$S
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ^bS&[+9E
8Gs{Zfp!D
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR @YV-8;hO
~hz]x^:
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 /|hKZTZJdN
X@jml$;$
2、列表运算符例:country IN ('Germany','China') kjjO<x?&*
6Pd;I,k
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 2sWM(SN
>_tn7Z0L
varchar、text、ntext、datetime和smalldatetime等类型查询。 C#vU'RNpl
5f}wQ
可使用以下通配字符: MJDFm,
;pS
Wu9
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 D1x~d<j
265df
Y9Pu
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 :Q!U;33aG
-*+7-9A I
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 1^Ci$ra
+>37'PD
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 A"i40 @+
&P,8)YA
例如: YzsHec
O z]iHe
限制以Publishing结尾,使用LIKE '%Publishing' jD'\\jAUdm
s#-`,jqD
限制以A开头:LIKE '[A]%' n$B=Vt,
.k Gg}
限制以A开头外:LIKE '[^A]%' D+#QQH
U(.Ln@sq
4、空值判断符例WHERE age IS NULL )0~zL} )?
f*LDrAf9
5、逻辑运算符:优先级为NOT、AND、OR r1JKTuuo
0ir]
(四)查询结果排序 mGwBbY+5n
c$bb0J%
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ]Dd=q6
&mp=j GR
ORDER BY {column_name [ASC|DESC]} [,…n] sHmzwvpLA
##EMJi
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 .Hc]?R]
Nz\=M|@(#
序。 pa4zSl
3g^_Fq'
例如: |ILj}4ZA7
fu"#C}{
SELECT * $0+AR)
<`+U B<K
FROM usertable 9jCn|+
pa`"f&JO
ORDER BY age desc,userid ASC v&(PM{3o
:Fm;0R@/k
另外,可以根据表达式进行排序。 z ~#
.Ey
)C|[j@MD
dpx P
4w<U%57
二、联合查询 [daUtKz
h2QoBGL5
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 [z'PdYQR/{
h;u8{t"
合查询。UNION的语法格式为: & w&JE]$ 5
6F(;=iY8
select_statement #/=s74.b
5
<X.1T1
UNION [ALL] selectstatement wrSw> sE"
\vjIw{
[UNION [ALL] selectstatement][…n] w@ALl#z;}
k?zw4S
其中selectstatement为待联合的SELECT查询语句。 H$bu*o-Z
V^sZXdDNL
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 $ @QF<?i~
C2OBgM+
行。 \qj4v^\
!VBl/ aU@
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 `@!4#3H
o/I'Qi$v-
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 mwU|Hh)N]
~\B1\ G
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 'M8wjU
kG 7]<^Os3
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 <Ih)h$8`
m?G@#[
l
型,系统将低精度的数据类型转换为高精度的数据类型。 P_6JweN
" iAwD8-
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: %P@V7n
]@LeyT'cY
查询1 UNION (查询2 UNION 查询3) ;:nx6wi
_-mSK/Z
jNV)=s^ed[
r I)Y
W0
YytO*^e}}
"Bn8WT2?
三、连接查询 $o}Ao@WkO
LkvR]^u0
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 X$mCn#8m
\MhSIlM#
数据库管理系统的一个标志。 EH1GdlhA
% \N52
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 DD$YMM
lJlyfN
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 R(.5Hs
:xwyE(w
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 }KFf
iG+hj:5
查询。 TjDDvXY
yn`P:[v
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ZhvZe/
dC,a~`%O
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 ut/3?E1 Z
E]@$,)nC
SQL-92标准所定义的FROM子句的连接语法格式为: P6G&3yPt
}Zuk}Og9+
FROM join_table join_type join_table Sao4MkSz[]
$tm%=g^
[ON (join_condition)] mc
FSWmq
&AUtUp
kOo
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 Q{K'#
!{S& "
个表操作的连接又称做自连接。 -/w#f&Y+]8
UA0j#
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ~6nY5
H\vd0DD;
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 AX{X:L8Ut2
\-`,fat
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 or<n[<D-C
`AcUxnO
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) %noByq,?
@'AjEl:&-_
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 =Ts5\1sc>
ko-,l6E
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 4it^-M
[aS<u`/g|
数据行。 >))f;$D=
z?3t^UPW
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 N e<D'-
Y?'Krw `
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 T9'd?nw9
hj4mbL
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 iVSN>APe
'qy
LQ:6
运算符等构成。 /$=<"Y7&g
4roqD;5|~|
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 G^%FP!'D?
f`W)Z$fN5
连接。例如: :3N&&]
e0z(l/UB
SELECT p1.pub_id,p2.pub_id,p1.pr_info (~IoRhp^
uB1>.Pvxb
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Cm"7f!(#
nl)l:A+q8
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) x@LNjlP
4 \Ig<C9
(一)内连接 x O_u
q@=3`yQ
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 f`vu+nw
;O~k{5.iS
三种: DJJd_
=nff;Xu
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Y
a/+|mv
M/a40uK
表中的所有列,包括其中的重复列。 uc>]-4
93VbB[w~7F
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 =1r!'<"h
zL!}YR@&u"
运算符包括>、>=、<=、<、!>、!<和<>。 }bZb8hiG
7!g"q\s
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 8|) $;.
.LI(2lP
结果集合中所包括的列,并删除连接表中的重复列。 I} .9
=&t]R?
F
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: ],-(YPiAD
:|a$[g5
SELECT * ~J![Nx/
p#0L@!,
FROM authors AS a INNER JOIN publishers AS p 6an= C_Mb`
z'01V8e
ON a.city=p.city 0dW*].Gi:
\C<'2KZR,
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): }eAV8LU
/hSEm.<
SELECT a.*,p.pub_id,p.pub_name,p.country xnOd$]
H7
"r^s]D
FROM authors AS a INNER JOIN publishers AS p cV4]Y(9
P%aNbMg
ON a.city=p.city f= A`{8^
: G'a"%x
(二)外连接 (L*<CV
QlMv_|`9
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 _BoYyJQH
]&OI.p
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 BA8g[TA7K
F~sUfqiJ'
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 vA2>&YDFX
Dkg^B@5Xr
如下面使用左外连接将论坛内容和作者信息连接起来: VVbFn9+V
4_-L1WH
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b L{0\M`B-
G
2`hEX%
ON a.username=b.username vNHvuwK
!0_/=mA^
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: }wZsM[NDB
! u@JH`
SELECT a.*,b.* /r8sL)D+
lNz1|nS(Kd
FROM city as a FULL OUTER JOIN user as b C;?<WtH
<v!jS=T
ON a.username=b.username L d{`k
&4wwp !J
(三)交叉连接 j;I(w [@P
hC4
M}(XM
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 t&i