社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3918阅读
  • 0回复

[原创]SQL查询语句使用

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

一、简单查询 JR] )xPI`  
j,\tejl1  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 E N)YoVk  
9z+vFk`  
表或视图、以及搜索条件等。 GI}4,!^N  
={\![{L  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 L^6"' #  
keae.6[  
SELECT nickname,email SE6>vKR/.  
LFl2uV"  
FROM testtable >ze>Xr'm5=  
d:A\<F  
WHERE name='张三' 9*BoYFw92*  
;9}w|!/  
(一)选择列表 bh{E&1sLh  
1aBD^^Y  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 lq~Gc M  
>Dk1axZ!>/  
量和全局变量)等构成。 f;e_04K  
, - QR  
1、选择所有列 W^^K0yn`@  
^!q 08`0  
例如,下面语句显示testtable表中所有列的数据: ;+TMx(  
>Kz_My9  
SELECT * _TtX`b_Z  
p^T&jE8])#  
FROM testtable s.|!Ti!]  
=AWX +znP  
2、选择部分列并指定它们的显示次序 j kSc&  
[Bl $IfU  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 @<hF.4,]  
QIR4<]/  
例如: CW.&Y?>Tv  
X(4s;i  
SELECT nickname,email 3Cq6h;!#  
_cW_u?0X:  
FROM testtable :&xz5c`"04  
8dV.nO  
3、更改列标题 m"96:v  
f 1sy9nQs  
在选择列表中,可重新指定列标题。定义格式为: N!tpzHXw  
8:Z@lp^  
列标题=列名 *jYHd#UZx4  
59&T/  
列名 列标题 RY>)eGJ  
;b, -$A  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 2z'+1+B'  
r^?)F?n!  
标题: #JK;& Dg!  
clh3  
SELECT 昵称=nickname,电子邮件=email \4[c}l  
3!i. Fmo  
FROM testtable ygmv_YLjm  
lcu("^{3  
4、删除重复行 _fczE~O/  
08<k'Oi]  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 _myg._[  
sN} s61  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 hgTM5*fD}  
!!?+M @  
5、限制返回的行数 3MNhH  
jF%)Bhn(  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Nrab*K(][  
&"U9X"8b  
表示一百分数,指定返回的行数等于总行数的百分之几。 FRl3\ZDqrb  
N?MJ#lC F  
例如: [}W^4,  
DhtU]w}  
SELECT TOP 2 * &{-oA_@  
37j\D1Y  
FROM testtable ?z\q Mu  
;n(#b8r9  
SELECT TOP 20 PERCENT * !Z<mrr;T@  
&+)+5z_d  
FROM testtable no~OR Q  
WUE)SVf  
(二)FROM子句 sDaT[).Hm  
}m=t zHB*  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, kPx]u\  
}};j2  
它们之间用逗号分隔。 d1srV`  
"e1{V8 4  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ]y1$F Ir+  
_~X8/p/Qh  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 B)j`}7O 06  
rh:s 7  
使用下面语句格式加以限定: rd&*j^?  
1S*8v 7  
SELECT username,citytable.cityid aH5t.x79b  
p0}+071o%  
FROM usertable,citytable J)7,&Gc6  
>5Q^9 9V  
WHERE usertable.cityid=citytable.cityid cM> G>Yzo  
W,9k0t  
在FROM子句中可用以下两种格式为表或视图指定别名: B#qL$M,|  
_Ep{|]:gw  
表名 as 别名 boC>N   
d vg;  
表名 别名 fd!pM4"0  
Y0P}KPD  
例如上面语句可用表的别名格式表示为: ;X*K*q  
7':5  
SELECT username,b.cityid dU sJv  
.-C+0L1j  
FROM usertable a,citytable b mFgb_Cd  
|!4B Wt  
WHERE a.cityid=b.cityid O" X!S_R  
Q8}TNJsU  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 mR" 2  
TRr4`y%  
例如: WL)_8!  
:w {M6mM>  
SELECT a.au_fname+a.au_lname {Gk}3u/  
4AJu2Hp  
FROM authors a,titleauthor ta &;NNU T>Q  
@,y FY  
(SELECT title_id,title ?vht~5'  
~L \(/[  
FROM titles QN2*]+/h  
,{`o/F/  
WHERE ytd_sales>10000 ^V XXq  
$ sA~p_]  
) AS t xvdnEaWe$  
NR;S3-Iq(  
WHERE a.au_id=ta.au_id T_(e(5  
>"sKfiM)b  
AND ta.title_id=t.title_id Q8DQ .C  
`F- Dd4B  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 jziA;6uL  
cOZajC<G  
(三)使用WHERE子句设置查询条件 <750-d!  
%b>y  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 654jS!  
QAOk  
SELECT * M$>WmG1~D  
8ZNd|\  
FROM usertable mISu o  
Skk3M?  
WHERE age>20 /k3n{ ?$/  
N8L)KgM5#7  
WHERE子句可包括各种条件运算符: R<0!?`b  
@|\s$L  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Me K\eZ\  
#:ED 0</  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… {C0OrO2:  
*2m&?,nJ  
NOT BETWEEN…AND… z5o9\.y({  
U*qK*"k  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) RfKxwo|M<  
bbPd&7  
NOT IN (项1,项2……) (?&_6B.*  
\'^Z_6{w  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE `aWwF} +Y  
Nh7!Ah  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL [%)B%h`XGf  
$O]E$S${  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR e,j? _p  
-I$txa/"|  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 W%jX-  
nO.+&kA  
2、列表运算符例:country IN ('Germany','China') 8Jy1=R*S  
iDkWW  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 CyBM4qyH  
H R!>g  
varchar、text、ntext、datetime和smalldatetime等类型查询。 ,w58n%)H  
&LxzAL,3!  
可使用以下通配字符: >0;"qT  
k s`  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 pvwnza1  
v,.n/@s|X  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 T[!q&kFB  
:;#}9g9  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 [@FeRIu8  
3L!&~'.Ro  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 L!8?2 \5  
[\M?8R$)  
例如: b%~3+c  
#pn AK  
限制以Publishing结尾,使用LIKE '%Publishing' 7Caap/L:  
Nwu Be:"@  
限制以A开头:LIKE '[A]%' 9kg>)ty@  
,HO/Q6;N  
限制以A开头外:LIKE '[^A]%' czsoD) N  
c"&!=@  
4、空值判断符例WHERE age IS NULL 8RT0&[  
Q c< O; #  
5、逻辑运算符:优先级为NOT、AND、OR _j<M}  
_nFvM'`<  
(四)查询结果排序 3\l9Sf=M|  
3UtXxL&L`  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: S@2Jj>3D?  
" 7g8 d  
ORDER BY {column_name [ASC|DESC]} [,…n] ZC-evy  
l#f]KLv4N_  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 LUVJ218p  
Uo)<_nG  
序。 7XC}C+  
.0;k|&eBD  
例如: jP6G.aiO  
mb6?$1j  
SELECT * 7 ,~Krzv  
E1Aa2  
FROM usertable X10TZ  
<;Z~ vZ]  
ORDER BY age desc,userid ASC \D k^\-  
s+G9L)b'  
另外,可以根据表达式进行排序。 t4W0~7   
3'uES4+r  
  KFG^vmrn  
A/6nV n  
二、联合查询 !b8|{#qh.  
1,D ^,  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 T $]L 5  
2>$L>2$  
合查询。UNION的语法格式为: BnY|t2r  
fBh|:2u  
select_statement Os]M$c_88  
u<r('IW0  
UNION [ALL] selectstatement 2*E<G|-F  
bv"({:x  
[UNION [ALL] selectstatement][…n] .f<,H+m^  
aV#;o9H{  
其中selectstatement为待联合的SELECT查询语句。 5 : >  
D)$k{v#~  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 !H.lVA  
GgZf6~b1J  
行。 Ykq }9  
mw.aavB  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 z1A-EeT  
.b)(_*  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 )Em,3I/.l  
AMfu|%ZL  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 #Jb$AA! z  
0$uS)J\;K  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 1S@k=EKM  
K?eo)|4)DB  
型,系统将低精度的数据类型转换为高精度的数据类型。 'm ((G4  
3Or3@e5r  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ~<R~Q:T  
c(JO;=,@9  
查询1 UNION (查询2 UNION 查询3) 0']M,iC/  
I9aber1  
  co-D,o4x  
I[C.iILL  
  }RK9Onh3G  
c3mlO [(  
三、连接查询 pp_ddk  
 3".W  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 |a3b2x,  
GQ8P}McA  
数据库管理系统的一个标志。 ,^T2hY`  
1Qkuxw  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 O;tn5  
]sE^=;Pv?  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 9`b3=&i\  
:oQaN[3>_  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 xbIA97g-O,  
yK;I<8+>_  
查询。 %vzpp\t  
J0o[WD$A x  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 'ZZ/:MvQa  
~a Rq\fx{  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 n9ih^H  
m-]"I8 [  
SQL-92标准所定义的FROM子句的连接语法格式为: p`0Tpgi  
Bf'(JJ7&N  
FROM join_table join_type join_table }qg&2M%\  
g;1 UZE;  
[ON (join_condition)] v%w]Q B  
FeJ5^Gh.  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 ^ TS\x/P  
VB%xV   
个表操作的连接又称做自连接。 yDrJn* r^  
&/" qOZAs  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 7dRU7p>  
/:)4tIV  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 +iR ;D$w  
A_+ WY|#M  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ?T"crX  
muLTYgaM  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) TfOZ>uR"g  
){Y2TWW&0  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 c4|.!AQ>  
' =kX   
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 a &j?"o  
R:E:Y|&#  
数据行。 t+VPX2  
=G`m7!Q)  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 }\F>z  
+y2*[  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 4C$,X!kzF  
e:]$UAzp  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 {>qCZ#E5WO  
5VN4A<))  
运算符等构成。 5y)kQ<x"  
"(5}=T@,  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 QZY (S*Up  
[g{}0 [ew  
连接。例如: E_z@\z MB  
Jg:'gF]jt  
SELECT p1.pub_id,p2.pub_id,p1.pr_info %2{E'^#)p-  
kF5}S8B  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 sr\MQ?\fB  
;Mc}If*  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) = 2k+/0ZbP  
c:bB4ch}  
(一)内连接 Mo/xEB/O  
%+.]>''a  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 KNn E5f  
<:p&P  
三种: TF'ssD  
nL$tXm-x  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 $KiA~l  
9H<:\-:  
表中的所有列,包括其中的重复列。 # ;9KDt@  
'K`)q6m  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 _tjH=Ff$  
Djzb#M'm  
运算符包括>、>=、<=、<、!>、!<和<>。 Yv{AoL~  
BdceINI  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 :+YFO.7  
YpWu\oP  
结果集合中所包括的列,并删除连接表中的重复列。 .sLx6J%  
aRV<y8{9  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: sU8D;ML7  
h'bxgIl'`  
SELECT * /f#sg7)  
n4:WM+f4  
FROM authors AS a INNER JOIN publishers AS p `1P &  
:( `Q4D~l  
ON a.city=p.city {\%x{  
jj^CW"IB  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): +"C0de|-  
.8,lhcpY  
SELECT a.*,p.pub_id,p.pub_name,p.country +n0y/0Au  
}SYvGp{J,  
FROM authors AS a INNER JOIN publishers AS p | o?@Eh  
V7&L+]!  
ON a.city=p.city ie_wJ=s  
Gf"/fpeQx  
(二)外连接 6L2.88 i  
ut o4bs:  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 m1(rAr1  
8\[6z0+;  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 k`N)-`O7  
F`3I~(  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 FuD$jsEw  
I|p(8 R!  
如下面使用左外连接将论坛内容和作者信息连接起来: U*6r".sz  
<AB]FBo(  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b U?kJXM2  
a.q=  
ON a.username=b.username 3 D\I#g  
s]}P jh8  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 3.8d"  
c(@)V.o2  
SELECT a.*,b.* Fd3V5h  
VG)kPKoi  
FROM city as a FULL OUTER JOIN user as b 7ZN0_Q s  
:sJVklK  
ON a.username=b.username _PJd1P.k  
H1N%uk=kV  
(三)交叉连接 kMK-E<g  
0kmZO"K#e  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 `|I h"EZ  
hH%@8'1v  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 X+iUT  
40mgB4I  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 INi(G-!g  
c\7~_w2  
于6*8=48行。 u>d,6 !  
|LWG7 ZE  
SELECT type,pub_name  z7>  
D/{hLp{  
FROM titles CROSS JOIN publishers %I?uO( @  
HPT$)NeNc  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五