一、简单查询 -=nk,cYn  
 ]f#s`.A~  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 x(._?5  
 )w0x{_  
表或视图、以及搜索条件等。 QuqznYSY{  
  qmFG  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 -Y@tx fu-  
 \?;
`_E`j  
SELECT nickname,email yI	2UmhA  
 &EqLF  
FROM testtable @>HTbs6W  
 U	xBd14-R_  
WHERE name='张三' Hl`OT5pNf  
 (oi:lC@h*  
(一)选择列表 |]4!WBK  
 H}$7c`;q  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 Hl,{4%]  
 1(-!TJ{  
量和全局变量)等构成。 ~.aR=m\#
  
 sqrLys_S  
1、选择所有列 ux<|8S  
 ^K;k4oK  
例如,下面语句显示testtable表中所有列的数据: ^FKiVKI:  
 H:@hCO[a  
SELECT * A#.
%7S  
 +P^
;7"H  
FROM testtable |tGUx*NN  
 w}gmVJ#p  
2、选择部分列并指定它们的显示次序 =p8uP5H  
 f`n4'dG  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 I.n,TJoz4J  
 hyH[`wiq  
例如: 9B!Sv/)y!r  
 k
ucbI_  
SELECT nickname,email v>_@D@pr  
 Ipk;Nq  
FROM testtable C(ij_>  
 vkIIuNdDlx  
3、更改列标题 d5$D[,`1  
 E+aePo U  
在选择列表中,可重新指定列标题。定义格式为: wM+1/[7  
 *4}_2"[  
列标题=列名 uzBQK  
 0~bUW V  
列名 列标题 e9o\qEm   
 <rBW6o7  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 2!{D~Gfl=  
 4j#y?^s  
标题: ,U~A=bsa  
 i"h\*B=  
SELECT 昵称=nickname,电子邮件=email zMsup4cl  
 DZSS  
FROM testtable QQrldc(I  
 *'>_XX	  
4、删除重复行 $G".PWc  
 GC')50T J  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 +V4)><  
 .d<K` .O;  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 -G(me"Cu  
 ^%r6+ey  
5、限制返回的行数 WXy8<?s  
 ANhqS  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 IRN,=  
 F7DA~G!  
表示一百分数,指定返回的行数等于总行数的百分之几。 g-eJan&]N  
 csy6_q(  
例如: danPy2  
 hI:.Qp`r  
SELECT TOP 2 * 7%Y`j/  
 Ab@G^SLX  
FROM testtable tP@NQCo  
 `j>5W<5q\  
SELECT TOP 20 PERCENT * e'K~WNT	  
 ~bZ$	d{o^  
FROM testtable k_7m[o  
 
Z_q+Ac{p  
(二)FROM子句 ;bE/(nz M  
 b(0<,r8	  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, hTtn
/j  
 e=0]8l>\V  
它们之间用逗号分隔。  Ol>q(-ea  
 3ay},3MCV%  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 Oh! {E5!)  
 v&d1ACctJ  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 t1?aw<  
 }p~2lOI  
使用下面语句格式加以限定: "#~>q(4^  
 "W7|Xp  
SELECT username,citytable.cityid UGO#o`.G}  
 .TGw+E1k  
FROM usertable,citytable wo@ T@Ve~  
 'S_i6K  
WHERE usertable.cityid=citytable.cityid -uYxc=4Lh  
 g6,D Bkv2  
在FROM子句中可用以下两种格式为表或视图指定别名: P 2WAnm  
 |oPRP1F-;e  
表名 as 别名 {srP3ll
P  
 +u$l]~St\  
表名 别名 m{Q
#f\<  
 bT,_=7F  
例如上面语句可用表的别名格式表示为: m
Q9dF,  
 cwmS4^zt8  
SELECT username,b.cityid lbHgxZ  
 gQeQy  
FROM usertable a,citytable b ~[%CUc"   
 +hN>Q$E  
WHERE a.cityid=b.cityid h1_Z&VJ  
 XKWq{,Ks  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 yx]9rD1cz  
 xgk~%X%K  
例如: 
(Q8!5s  
 w/6X9d  
SELECT a.au_fname+a.au_lname ]E/0iM5  
 kOydh(yE  
FROM authors a,titleauthor ta 0ID9=:J  
 \FsA-W\X  
(SELECT title_id,title  (ghI$oH  
 hZJ~zx~  
FROM titles ]rv\sD`[  
 *`H*@2  
WHERE ytd_sales>10000 gcA:Q4   
 c""&He4zp  
) AS t ZO<,V  
 \;&;K'
  
WHERE a.au_id=ta.au_id p":u]Xgb  
 /QQRy_Z1)  
AND ta.title_id=t.title_id QY;(Ny/(y  
 KfiSQ!{  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 =dGp&9K,fw  
 5MnP6(3$  
(三)使用WHERE子句设置查询条件 \GL] I.  
 cACIy yQ  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Hhknjx  
 ^2kjO/  
SELECT * 1H[lf
B  
 UBU(@T(  
FROM usertable zkd#vAY(A  
 10[~ki-1;  
WHERE age>20 ?QuFRl,ZJ  
  "lz!'~im  
WHERE子句可包括各种条件运算符: O'wN4qb=F  
 Q?Nzt;)!.  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< qp{NRNkQ  
 cnIy*!cJs  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 
6&u,.  
 g|+G(~=e|  
NOT BETWEEN…AND… huq6rA/i  
 t]@Zd*  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) a"EQldm|d  
 &
9?vQq|%  
NOT IN (项1,项2……) D8dTw {C  
 =riP~%_ML)  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE =x^I 5Pn  
 *e8V4P  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL q7)$WXe2LM  
 }6S4yepl  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR i#-Jl7V[a  
 m+u>%Ys`  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 @O3w4Zs  
 4p-$5Fk8}  
2、列表运算符例:country IN ('Germany','China') 8n73MF
  
 9|e"n|[  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 &U,f~KJ  
 I{Kc{MXn  
varchar、text、ntext、datetime和smalldatetime等类型查询。 b%_QL3m6  
 i5wA=K_  
可使用以下通配字符: 57j:Lw~
  
 F9c2JBOM  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 JA)gM  
 j)]'kg  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 3jn@ [	m  
 lLJb3[
e.  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 }(],*^'u-  
 .o-j  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 M\<!m^~  
 ~XxD[T5  
例如: Mb9q<4  
  
b:3hKW  
限制以Publishing结尾,使用LIKE '%Publishing' 9D|
FqU	|  
 *.+>ur?t  
限制以A开头:LIKE '[A]%' ?ykZY0{B  
 {xykf7zp  
限制以A开头外:LIKE '[^A]%' w|Mj8Lc+  
 N	Hh
  
4、空值判断符例WHERE age IS NULL >4VU  
 g:6yvEu$	-  
5、逻辑运算符:优先级为NOT、AND、OR kg61Dgu  
 lcP@5ZW  
(四)查询结果排序 M$?6
'  
 IMR|a*=`c  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: `kv$B3  
 7E5Dz7  
ORDER BY {column_name [ASC|DESC]} [,…n] R]	[M_	r  
 aK>9:{]ez  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 /j)VES	  
  a"DV`jn  
序。 '-S&i{H   
 
^(\Gonf<  
例如: E5t+;vL~  
 6C0_. =7#  
SELECT * aK&+p#4t  
 oU@ljSD  
FROM usertable 7gMtnwT  
 iy#OmI>j  
ORDER BY age desc,userid ASC vg.%. ~!9  
 bGi_",
8  
另外,可以根据表达式进行排序。 :I'Ezxv|  
 (rG1_lUDu  
  {^kG<v.vV  
 %1@<),  
二、联合查询 Q	kZM(pG  
 7
h1"8#X  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 u0Erz0*G4  
 L_|uB  
合查询。UNION的语法格式为: u,akEvH~a  
 @Y<tH,*  
select_statement oyt//SE  
 3N"&P@/0x  
UNION [ALL] selectstatement e]
K=Nm  
 M',D 	  
[UNION [ALL] selectstatement][…n] iW}l[g8sw!  
 J4}\V$ysN  
其中selectstatement为待联合的SELECT查询语句。 ?66(t  
 [/Z'OV"tU  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 qZJ*J+  
 oe|e+  
行。 e^NEj1  
 K~8tN,~&  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 DjzUH{6O  
 iL_F*iK5  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 ,imvA5  
 gww^?j#  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 EO&ACG  
 HQ3`:l  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 U('<iw,Yy  
 !Gp3/<"Wy$  
型,系统将低精度的数据类型转换为高精度的数据类型。 pfZ,t<bE2  
 Ke?gz:9j  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: t/*K#]26  
 s!'A\nVV1$  
查询1 UNION (查询2 UNION 查询3) H@MFj>~  
 `SjD/vNE  
  )6>|bmpU  
 iEpq*Qj  
  'n[+r}3  
 vzcBo%  
三、连接查询 Yv>BOK  
 em1cc,  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ls24ccOs  
 E	;!<Z4  
数据库管理系统的一个标志。 	ZjZh z`  
 H_?B{We  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 "Ug/
',jkV  
 r)p2'+}pV  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 S&3X~jD(1  
 N<06sRg#  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ;}WtJ&y=M  
 F@$RV_M  
查询。 WY"Y)S  
 <	m enABN4  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 xIQ/$[&v  
 [vWkAJ'K  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 nU&NopD+*G  
 abo>_"9-  
SQL-92标准所定义的FROM子句的连接语法格式为: S\9t4Ki_'  
 zr.+'
  
FROM join_table join_type join_table q#99iiG1  
 LZr0]g{Pu/  
[ON (join_condition)] hza>	jR  
 (Pv`L  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 *BLe3dok(  
 6F*-qb3  
个表操作的连接又称做自连接。 2.LJp}>  
 +Y>"/i.
N  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ,-(T"Ph<  
 =.36y9Mfo  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 7uPZuXHxcu  
 +M'aWlPg,  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 k0|`y	U  
 F qeV3N  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) xF(
bS+(o  
 s\'y-UITi1  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 qzA`d
5rX  
 8 ]q   
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 v7i^O`{eD?  
 L*g.
6+2  
数据行。 #l*a~^dhqC  
 d/D,P=j"  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ;,1=zhKU.  
 D##+)`dK  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 &5\^f?'b7  
 G2.|fp_}pG  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 0QMTIAW6h  
 T@TIzz  
运算符等构成。 EL^8zyg%%  
 Q6"uK  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 I eG=J4:*  
 `|$'g^eCL  
连接。例如: '_:(oAi,C  
 j-7u>s-l  
SELECT p1.pub_id,p2.pub_id,p1.pr_info 9-0<*)"b>  
 :e*DTVv8  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 'E4AV58.  
 pO%{'%RA	  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) *"OlO}o  
 o/&K>]8M  
(一)内连接 "3 ++S  
 d=D#cs;\  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 )zy;!  
 n2_;:=  
三种: com4@NK  
 a~R.">>$  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 
Oc,HnyV+  
 0s Jp,4Vv  
表中的所有列,包括其中的重复列。 {2Ew^Li  
 d"E3ypPK  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ue?3;BF	5  
 g[O  
运算符包括>、>=、<=、<、!>、!<和<>。 S~H>MtX(<  
 LPs5LE[Pm  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 QrFKjmD<	  
 @+~>utr  
结果集合中所包括的列,并删除连接表中的重复列。 J"S(GL  
 F/1m&1t  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 0 ;)Q  
 AEx	VKy  
SELECT * uzmYkBv  
 p{v*/<.;  
FROM authors AS a INNER JOIN publishers AS p 	$0OOH4  
  \b6{u6?+  
ON a.city=p.city oa=TlBk<  
 .v}|Tp&k  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): br	TP}A  
 j+dQI_']x  
SELECT a.*,p.pub_id,p.pub_name,p.country ]
>w@@A  
 ,uNJz -B8  
FROM authors AS a INNER JOIN publishers AS p m]}U!XT  
 tux0}|[^'  
ON a.city=p.city L<iRqayn  
 ]9_}S  
(二)外连接 Bxw(pACf  
 oP4+:r)LKD  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 f52P1V]  
 ux!YVvTPd  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ^Z\"d#A  
 %,<Ki]F  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 Nmt~1.J   
 '3sySsD&O  
如下面使用左外连接将论坛内容和作者信息连接起来: Olh{<~Fv  
 r_,;[+!  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 	b5Q>e%i#  
 x	H=15JY1W  
ON a.username=b.username 2P^qZDG	8I  
 Z
zp"CK 5  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: u^JsKG+,:  
 b5
NlL`g  
SELECT a.*,b.* v[8+fd)}S  
 VlL%dN;
0  
FROM city as a FULL OUTER JOIN user as b D	`V.gV]  
 vp*+Ckd  
ON a.username=b.username 6@8z3JW.A  
 f^"pZS  
(三)交叉连接 Ks6\lpr  
 gGM QRRq  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 rMZuiRz*  
 1(:!6PY  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 [2Nux0g  
 '6>*J	  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ZE_  
 Qr7v^H~E4.  
于6*8=48行。 ,5ZQPICF  
 LGZa
l&9AY  
SELECT type,pub_name uZJfIC<>  
  |Nj6RB7  
FROM titles CROSS JOIN publishers m~Q24Z]!'&  
 J,u-)9yBA<  
ORDER BY type