一、简单查询 WJ{Iv]	}9  
 d$IROZK-D  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 ]545:)Q1	  
 (\\;A?  
表或视图、以及搜索条件等。 D4%J!L<P  
 @3`5(xwzm  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ;|Cdq  
 s5~k]"{j  
SELECT nickname,email 	c^}G=Z1@  
 .*zN@y3  
FROM testtable ^O|fw?,  
 y2W+YV*  
WHERE name='张三' 0E.N3iU  
 H 	cmW  
(一)选择列表 1>(EvY}Y\  
 R"ON5,E  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 G,C`+1$*  
 *6I$N>1  
量和全局变量)等构成。 WD5J2EePT  
 	(MGgr  
1、选择所有列 J[lC$X[  
 Hq.rG-,p  
例如,下面语句显示testtable表中所有列的数据: eV7;#w<]  
 Vr2A7kq  
SELECT * gP_N|LuF"  
 
: (UK'i  
FROM testtable uFr12ZFgK  
 0/HFLz'  
2、选择部分列并指定它们的显示次序 M9)4ihK  
 Wf
c/?{  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 v[L+PD
U  
 a (U52dO,  
例如: [?K>s>it  
 [>ghs_?dZ  
SELECT nickname,email ;	Y/nS  
 j!+jLm!l  
FROM testtable %q5dV<X'c  
 [,;Y5#Y[5  
3、更改列标题 !*]i3 ,{7v  
 4DL;Y  
在选择列表中,可重新指定列标题。定义格式为: } c	G)$E  
 Q/o,2R  
列标题=列名 |>Q>d8|k  
 ]zx%"SUM  
列名 列标题 2u.0AG   
 ^ITF*  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 Sk{skvd;	  
 bPVk5G*ruP  
标题: 461g7R%r  
 8063LWV  
SELECT 昵称=nickname,电子邮件=email ("U<@~  
 b<FE
  
FROM testtable ('x]@  
  Bx45yaT  
4、删除重复行 A]c'TT@6  
 bM?gAY]mB8  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 7O1MC	8{  
 '$FF/|{  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 n/KO{:  
 T0	K!Msz  
5、限制返回的行数 1Uup.(  
 h,c*:  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 b8d0]YS  
 =p+n(C/  
表示一百分数,指定返回的行数等于总行数的百分之几。 97liSd  
 36.,:!%p  
例如: 3ijPm<wn  
 o`f^ m  
SELECT TOP 2 * >YI	Vi4''  
 0AHQ(+Ap  
FROM testtable g8O6
b	  
 44KoOY_  
SELECT TOP 20 PERCENT * W>#yXg9  
 "$(+M t^  
FROM testtable mx^Ga=:
?  
 \3hA_{ w  
(二)FROM子句 T'p L&@,Q  
 
m-t:'B  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, )Qb,zS6  
 i~h@}0WR"  
它们之间用逗号分隔。 z}E_wg  
 \%<M[r=  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 [wQ48\^  
 =}Tm8b0  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 sD3ZZcy|=	  
 X&9:^$m  
使用下面语句格式加以限定: v+LJx   
 (;#c[eKy  
SELECT username,citytable.cityid m!7%5=Fc  
 \Kf\%Q  
FROM usertable,citytable )-
W1Wtom  
 zT>!xGTu7~  
WHERE usertable.cityid=citytable.cityid 6*i**  
 G	_cJI  
在FROM子句中可用以下两种格式为表或视图指定别名: F*P0=DD  
 ^;EhKG   
表名 as 别名 $Ivjcs:  
 8m")
)i-  
表名 别名 %jtUbBN  
 w0!$ow.l  
例如上面语句可用表的别名格式表示为: BwT[SI<Sg  
  @HS*%N"*  
SELECT username,b.cityid *73gp
  
 c'2/ C5  
FROM usertable a,citytable b ujV{AF`JfB  
 N,TV?Q5l7  
WHERE a.cityid=b.cityid R!dC20IMvH  
 ZA="Dac  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 H*0Y_H=  
 9rEBq&  
例如: 6U{A6hH]  
 T#B#q1/  
SELECT a.au_fname+a.au_lname \:;MFG'  
 irQ'Rm[  
FROM authors a,titleauthor ta L('1NN2  
 $e+sqgU  
(SELECT title_id,title 7I;kh`H$(f  
 8	#4K@nm5  
FROM titles V|u2(*  
 LwB1~fF  
WHERE ytd_sales>10000 mGE!,!s}  
 h]<S0/  
) AS t brA#p>4]Wf  
 F'XQoZ* 1  
WHERE a.au_id=ta.au_id M">v4f&K1!  
 jz8u'y[n7  
AND ta.title_id=t.title_id cUq]PC$|  
 P3"R2-  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 -m@c{&r  
  Qxz[  
(三)使用WHERE子句设置查询条件 h	
/  
 J];Sj  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 2Wzx1_D"a  
 g`pq*D  
SELECT * tz):$1X_  
 $0[T<]{/?  
FROM usertable 7i($/mNl  
 ZN8j})lE  
WHERE age>20 #	`=Zc7gf  
 `4*I1WZW  
WHERE子句可包括各种条件运算符: :UdW4N-  
  _=$~l^Y[  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ,1ev2T  
 Xz4q^XJ  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… [-\  Y?3  
 ]r;rAOWVV  
NOT BETWEEN…AND… wlNL;W@w  
 dWn6-es  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) WX4sTxJK  
 TOHz3=  
NOT IN (项1,项2……) %DSr@IX  
 hi,="
/9  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE &>qUT]w  
 `Moo WG  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL \9[vi +T  
 RQE]=N  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR cb_C2+%8NA  
 CtY-Gs  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ^(JrOh'  
 `%Fp'`ZM$8  
2、列表运算符例:country IN ('Germany','China') OG}890$n  
 x;[ . ZzQ  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 n~629 &  
 d.+*o  
varchar、text、ntext、datetime和smalldatetime等类型查询。 PtkMzhX  
 \d"\7SA  
可使用以下通配字符: CmB_g?K  
 O_;BZzT  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 *}vvS^ c0  
 o"JHB  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 65aYH4"   
 d>f;N+O%  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 /<-PW9X?  
 !*v%
s  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 OH@"]Nc~  
 44e]sT.B  
例如: k^}[+IFJ  
 #ksDU  
限制以Publishing结尾,使用LIKE '%Publishing' >7BP}5`.;  
 30HUY?'K  
限制以A开头:LIKE '[A]%' e]1=&:eX#d  
 Owf!dMA;nF  
限制以A开头外:LIKE '[^A]%' W|2^yO,dX  
 v:SHaUS  
4、空值判断符例WHERE age IS NULL z#+WK|a  
 \hX,z	=  
5、逻辑运算符:优先级为NOT、AND、OR 7(2}Vs!5  
 {v*4mT  
(四)查询结果排序 |V5BL<4  
 !EIH"`>!  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: P"NI> HM  
 +jE)kaV%  
ORDER BY {column_name [ASC|DESC]} [,…n] %R$)bGT  
 q.J6'v lj/  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 SAnr|<Y/  
 3X(^`lAf)  
序。 ZSNbf|ldiE  
 a>GA=r  
例如: 3.YH7rN 
  
 |	+;ZC y  
SELECT * DG;u_6;JR  
 :kHk'.V1(  
FROM usertable ftY&Q#[  
 #)S }z+I  
ORDER BY age desc,userid ASC b]]k\b  
 .!~ysy  
另外,可以根据表达式进行排序。 a >fA-@  
 .45wwouZkc  
  
Z	kw-a  
 c&T5C,]  
二、联合查询 MNs<yQ9I'  
 ai;!Q%B#Q  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 l]|&j`'O  
 bpsyO>lx/  
合查询。UNION的语法格式为: G5qsnTxUJ  
 Lx-%y'P  
select_statement 8nI~iN?"  
 [g}^{	$`  
UNION [ALL] selectstatement N,w6  
 VQ!4(
<XD  
[UNION [ALL] selectstatement][…n] 9]3l'   
 r5&c!b \  
其中selectstatement为待联合的SELECT查询语句。 ANPG3^w  
 :G#%+,  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 L\ysy2E0  
 u|23M,	  
行。 8!v|`Ky  
 6No.2Oo  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 tgBA(2/Co  
 n^QDMyC;I  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 m@nGXl'!  
 fyUW;dj  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 qF3S\
C  
 gS(JgN  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 _$*-?*V&  
 'tTlBf7#  
型,系统将低精度的数据类型转换为高精度的数据类型。 Db2#QQ  
 ?Ho$fGz  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: fXevr `  
 h`fZ8|yw  
查询1 UNION (查询2 UNION 查询3) "Io-%Su+  
 3Dc^lfn  
   ~@@t-QY  
 F@/syX;bb5  
  TJ>YJD  
 kk126?V]_  
三、连接查询 w32F?78]  
 AkjoD7.*  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 h1>.w
pr  
 ,=!s;+lu{  
数据库管理系统的一个标志。 ZHen:  
 zX=%BL?  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 :8n?G  
 .aZB?MW  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 :x q^T  
 9^SrOW6~  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 W(ZEqH2  
 jM*wm~4>@  
查询。 IAd^$9  
 .*k!Zl*  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 MS SHMR  
 Qvny$sr2  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 hW,GsJ,  
 \^F6)COy  
SQL-92标准所定义的FROM子句的连接语法格式为: 0jpyc  
 ;F_&h#D]3  
FROM join_table join_type join_table ?{Xp'D\z  
 HH!SqkwT  
[ON (join_condition)] avS9 "e  
 gKU*@`6G  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 jbOzbxR?  
  'H1"z!]  
个表操作的连接又称做自连接。 +$~HRbo  
 AO$aW yI  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ^1}ffE(3>  
 (I`<;  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 u@wQ  )^  
 x2i`$iNhmP  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 Fo"'[`  
 0A~f
^  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) YS"76FJ  
 /?j^Qu  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 8HO)",+I  
 zJ0'KHF}o  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 8/34{2048  
 nDC5/xB
  
数据行。 qmnCa&C9  
 s|!b:	Ms`  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 D/{ Spw@  
 _	)^n[_E  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Qzk/oHs  
 A[d'*n[  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ]	 
)x	z  
 Iq":
U  
运算符等构成。 9aqFdlbY  
 ~?A,GalS  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 cmh/a~vYaY  
 #iGz&S3iN$  
连接。例如: P3XP=G`E  
 ( Gxv?\  
SELECT p1.pub_id,p2.pub_id,p1.pr_info D+_PyK~jc  
 1/qiE{NW  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 [laX~(ND{  
 .yj=*N.  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 48%a${Nvvj  
 Ah2XwFg?  
(一)内连接 @p2dXJeR<  
 =09j1:''<d  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 *DoEDw  
 ?t.?f`(|  
三种: U7fE6&g  
 /C8(cVNZ  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 +XRv
iHA`  
 zsRN\U  
表中的所有列,包括其中的重复列。 R}+/jh2O|  
 zZh`go02E  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 l1_X5DI  
 m~NWY$oI9[  
运算符包括>、>=、<=、<、!>、!<和<>。 Xhkw<XbV	  
 &akMj@4;R  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 lB\j>.c  
 ?y45#Tk]  
结果集合中所包括的列,并删除连接表中的重复列。 LveqG  
 +Vf|YLbhJ  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: .r*b+rc;]  
 U	._1'pW  
SELECT * =yNHJHRA#  
 #XY]@V\  
FROM authors AS a INNER JOIN publishers AS p !`#9#T|  
 WE~3(rs#X#  
ON a.city=p.city N$,)vb<  
 O-2H!58$)  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ^9b
`;}) .  
 ;<X3AhF	  
SELECT a.*,p.pub_id,p.pub_name,p.country '}YXpB  
 K
:q-[\G  
FROM authors AS a INNER JOIN publishers AS p /7"1\s0 U  
 |95/'a*  
ON a.city=p.city +m7x>ie)  
 6$dm-BI  
(二)外连接 $-AvH(@  
 >`\*{]  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 OB^2NL~Q~  
 *wF:Q;_<z  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 g4$%)0x%  
 h'fD3Gr&  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 Sf'5/9<DW+  
 	
O}D8  
如下面使用左外连接将论坛内容和作者信息连接起来:  RK3/!C`
  
 X5/{Mx`8Oz  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b coFg69\^  
 O`0$pn  
ON a.username=b.username TgB;R5  
 PrKlwhi#  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: /#se>4]  
 /[IQ:':^  
SELECT a.*,b.* l{a&Zy)  
 ;VFr5.*x  
FROM city as a FULL OUTER JOIN user as b lqCn5|S]  
 g^4FzJ  
ON a.username=b.username =U2Te  
 C;)
xjZiR  
(三)交叉连接 _~(Xd@c(  
 :{
T#M$T  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 )|a9Z~#x  
 9c7}-Go  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 udZ:	OU<  
 hw'2q9J|  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 
E$>e<
T  
 #Fd([Zx#.  
于6*8=48行。 Xbtv}g<0c  
 (}}8DB  
SELECT type,pub_name RZtL<2.@  
 uY~A0I5Z  
FROM titles CROSS JOIN publishers ck~xj0  
 c-=0l)&'D=  
ORDER BY type