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

[原创]SQL查询语句使用

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

一、简单查询 ZI qXkD  
rtQ{  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 b?Uk%Z]+v  
rw3tU0j  
表或视图、以及搜索条件等。 pc@mQI  
y7CO%SA  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 4F0w+w JD  
7UG c2J  
SELECT nickname,email rP2h9Cb  
\9tJ/~   
FROM testtable 6^V( C;5!  
bma.RCyY<  
WHERE name='张三' +l/kH9m  
"=C~I W  
(一)选择列表 x|Pz24yP9  
E<u(Yw6=  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 9+@z:j  
%saP>]o  
量和全局变量)等构成。 1y6<gptx  
^E\n^D-RV  
1、选择所有列 $ kHXt]fU  
l<4P">M!.  
例如,下面语句显示testtable表中所有列的数据: &=M4Z/Ao  
=-/'$7R,  
SELECT * ni2 [K`  
>eo[)Y  
FROM testtable x\~ <8o  
QJVB:>A  
2、选择部分列并指定它们的显示次序 .=<s@Sg,t  
4:Ju|g]O  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 :k`Qj(7S  
\>wQyz  
例如: vL[IVBG^  
_[(EsIqc(F  
SELECT nickname,email Pw]r&)I`y[  
nsXG@CS:  
FROM testtable z)v o  
lc~c=17  
3、更改列标题 Ja 5od  
g@s`PBF7`  
在选择列表中,可重新指定列标题。定义格式为: ,YBO}l  
,ZrR*W?iF  
列标题=列名 "K9[P :nw  
[bX ^_ Y  
列名 列标题 dyf>T}Iy  
V6_":L"!  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 >?ar  
 q"T?  
标题: )F&.0 '  
 >Z3>  
SELECT 昵称=nickname,电子邮件=email -Q5UT=^  
2_3os P\Z  
FROM testtable d/Wp>A@dob  
Ci 4c8  
4、删除重复行 g{sp<w0  
pp1Kor  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 [PiMu,O[v  
9ei'oZ  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 rr(kFQ"  
B:UPSX)A  
5、限制返回的行数 NX(+%EBcA  
Tmu2G/yi  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 X6$Cd]MN  
qB K68B)  
表示一百分数,指定返回的行数等于总行数的百分之几。 mC\<fo-u  
A['(@Bz#7~  
例如: ThW9=kzQW  
mAW(j@5sp  
SELECT TOP 2 * lf KV%  
XVfUr\=,T  
FROM testtable 9 ;uw3vI%  
BdU .;_K  
SELECT TOP 20 PERCENT * ?G~rYETvw  
Gl3g.`X{$@  
FROM testtable j"TEp$x  
CKFr9bT{  
(二)FROM子句 Iix:Y}  
{&D$U'ye  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 76o[qay  
;ZcwgsxTM  
它们之间用逗号分隔。 4L`,G:J,;  
:2NV;7Wke6  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 l?m 3 *  
<_*5BO  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 5&L*'kV@  
]goV Q'Y  
使用下面语句格式加以限定: 8p}z~\J{a:  
3d1xL+  
SELECT username,citytable.cityid d Efk~V\  
7.2!g}E  
FROM usertable,citytable Zs3xoIW7Ai  
;QCGl$8A  
WHERE usertable.cityid=citytable.cityid =u0a/2u|  
O tQ]\:p7  
在FROM子句中可用以下两种格式为表或视图指定别名: jw\4`NZ]  
32anmVnf  
表名 as 别名 BonjK#  
2Q%M2Ua  
表名 别名 7J$rA.tu  
(M{wkQTO  
例如上面语句可用表的别名格式表示为: |d6/gSiF  
rAW7Zp~KK  
SELECT username,b.cityid Y Kp@ n8A  
+ >:}   
FROM usertable a,citytable b (=gqqOOl~  
Pjvb}q=  
WHERE a.cityid=b.cityid 'zMmJl}\vd  
F/tRyq`D  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Wie0r@5E  
.v+J@Y a  
例如: aWLA6A+C&  
(8o;Cm  
SELECT a.au_fname+a.au_lname .9g :-hv  
k`[>B k%b  
FROM authors a,titleauthor ta P$AHw;n[R  
}waZGJLN  
(SELECT title_id,title ^:f)XZ  
}> C?Zx*  
FROM titles K~^o06 Y  
LSXsq}  
WHERE ytd_sales>10000 5OO XCtIKf  
~fcC+"7q/  
) AS t lY,9bSF$  
Vz!{nL0Q(  
WHERE a.au_id=ta.au_id " ~6&rt  
lSd tw b  
AND ta.title_id=t.title_id Ly v"2P  
9M|#X1r{%{  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 @ZV>Cl@%2  
xZV|QVY;  
(三)使用WHERE子句设置查询条件 m)6-D-&7  
#Ak9f-pf  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: `\3RFr  
]:?hU^H]<  
SELECT * !>K=@9NC|.  
|Df`Aq(eYJ  
FROM usertable m<cv3dbZo  
`r\/5|M  
WHERE age>20 *8%uXkMm  
|-GbHfz  
WHERE子句可包括各种条件运算符: 2AxKB+c1`  
}J\7IsM&  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< C^U>{jf !  
gMZrtK`<  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… >k/ rJ[Sc  
= 4'r+2[  
NOT BETWEEN…AND… 5Go@1X]I  
wb]Z4/j#  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) -&v0JvTJ9j  
r>"l:GZ  
NOT IN (项1,项2……) $3970ni,?O  
;\/ RgN  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ~_-+Q=3  
{K/xI  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL =1O;,8`  
;1TQr3w  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR O4a~(*f  
/B{c L`<  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ('=Q[ua7-(  
|oR{c%z05  
2、列表运算符例:country IN ('Germany','China') brF) %x`  
O#vIn}  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 0? KvR``Aj  
"Q tkNy%E  
varchar、text、ntext、datetime和smalldatetime等类型查询。 `<R^ZL,  
-b  )~  
可使用以下通配字符: }72+i  
r6 pz(rCs}  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 {qSYe!`  
 {qH+S/  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 >-`-D=!V  
ai4ro"H  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 `n e9&+  
/9-kG  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 DPl&e-`  
_]+ \ B  
例如: *zX^Sg-[  
s8r[U, }(  
限制以Publishing结尾,使用LIKE '%Publishing' }\ya6Gi8  
N&Uqzt*  
限制以A开头:LIKE '[A]%' vFgnbWxG  
bGp3 V. H  
限制以A开头外:LIKE '[^A]%' 7zXX& S  
h~&5;  
4、空值判断符例WHERE age IS NULL FJsg3D*@J  
cT'<,#^/  
5、逻辑运算符:优先级为NOT、AND、OR p;2NO&  
emS7q|^  
(四)查询结果排序 :&O6Y-/B  
@Y&(1Wl  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: &=-{adm  
G\r>3Ys  
ORDER BY {column_name [ASC|DESC]} [,…n] 1-pxM~Y  
tW3Nry  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ~\7peH%  
zids2/_*  
序。 E-$N!KY  
"Za'K+4  
例如: 3 DZ8-N S  
=G1 5 eZW  
SELECT * >t $^U  
0 |Rmb  
FROM usertable lXrAsm$  
sYyya:ykxT  
ORDER BY age desc,userid ASC *U|2u+| F  
<%LN3T  
另外,可以根据表达式进行排序。 QPz3IK%   
t^<ki?*  
  k'1i quc#u  
SA -r61  
二、联合查询 Uv=hxV[7y  
8lT2qqlr  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 *W1:AGpz  
X&|y|  
合查询。UNION的语法格式为: /A%31WE&1  
C;eM:v0A[  
select_statement roWg~U(S  
2?9gf,U  
UNION [ALL] selectstatement 9$N~OZ;-*x  
?_G?SQ  
[UNION [ALL] selectstatement][…n] OQby=}A  
zVtNT@1K>u  
其中selectstatement为待联合的SELECT查询语句。 tc)4$"9)  
1}I%yOi)  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ?\T):o;/  
lRA!  
行。 83gp'W{|  
fGDjX!3-S  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 *Zk$P.]  
H=>;M j  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 `F' >NNY  
!>QD42  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 X!/  
pU5t,  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 /Es&~Fn  
PQ`~qM:3st  
型,系统将低精度的数据类型转换为高精度的数据类型。 N:7;c}~  
dW2Lvnh!>/  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: vKcc|#  
ZNTOI]P&  
查询1 UNION (查询2 UNION 查询3) 1 c4I`#_v  
~z*A%vp6ER  
  Bis'59?U_  
'?v-o)X  
  HP eN0=7>  
81 /t)Cp  
三、连接查询 %DF-;M"8  
a?X{k|;!7u  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 M}b[;/~  
Zjkrne{  
数据库管理系统的一个标志。 @G>Q(a*,  
'hH3d"a^=  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 9..! g:  
Umt?COc  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 Ok6c E  
Nh/B8:035  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 "yc_*R(pU  
CLX!qw]@ +  
查询。 >ay% !X@3"  
IA?v[xu  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 b#z{["%Zp  
p:8&&v~I  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 sas:5iB5  
x5)YZ~5  
SQL-92标准所定义的FROM子句的连接语法格式为: f<aJiVP  
^SH8*7l7  
FROM join_table join_type join_table Dwp-*QK^G  
2<' 1m{  
[ON (join_condition)] BD (  
@ wJ|vW_.  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 bQu1L>c,Uw  
2n8spLZYGY  
个表操作的连接又称做自连接。 .q7|z3@,  
g4 G?hv`R  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 C Nt  
@u}1 S1  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Xeo2 < @[  
'WLh D<  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 GH!Lu\y\  
EvEI5/ z  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) E[N3`"  
,8MUTXd@ V  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 LU7d\Ch  
z7'C;I  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 1'{A,!  
}Kc03Ue`%e  
数据行。 8LM 91  
@mB*fl?-  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 Ps!~miN|>  
@z!|HLD+  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 :CJ]^v   
x^ruPiH  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 b _#r_`  
 !xz0zT.  
运算符等构成。 /^TXGc.  
.Q^8 _'ZG  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接  "0( _  
20XN5dTFT  
连接。例如: ggn:DE "  
a*gzVE7W#n  
SELECT p1.pub_id,p2.pub_id,p1.pr_info D[ -Gzqh  
p Y[dJxB  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 7 P$>T  
xJ18M@" j  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) `78:TU~5S  
L]C|&K P  
(一)内连接 HMymoh$Q  
WG0Ne;Ho  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 ev_4!+ko  
mlmp'f  
三种: (dh{Gk4=+  
;m[-yqX  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 i)pAFv<$,  
H3{FiB]  
表中的所有列,包括其中的重复列。 %kRQ9I".  
)Kw Gb&l&  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 LyB &u( )  
^t{2k[@  
运算符包括>、>=、<=、<、!>、!<和<>。 Y "RjMyQh  
:t36]NM  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 `X06JTqf:  
W"a%IO%'  
结果集合中所包括的列,并删除连接表中的重复列。 3+j!{tJ z2  
a$r<%a6  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: L(bYG0ZI5C  
(` N@4w=  
SELECT * X pH]CF  
=I}8-AS~V  
FROM authors AS a INNER JOIN publishers AS p _RHB ^y;-  
>)sB# <e  
ON a.city=p.city TzJp3  
pS vqGJU3  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): vl{G;[6  
?!4xtOA  
SELECT a.*,p.pub_id,p.pub_name,p.country V#Hg+\{d  
cR0OJ'w  
FROM authors AS a INNER JOIN publishers AS p ph;ds+b  
b;X|[tB  
ON a.city=p.city ).BZPyV<  
~$O.KF:  
(二)外连接 #:y h2y7a%  
2!u4nxZ.  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 wInJ!1  
,a&&y0,  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 /kLG/ry8l:  
#H;yXsR `  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 y]5c!N %8  
j6NK 7Li  
如下面使用左外连接将论坛内容和作者信息连接起来: 2Bf]#l{z  
GjmPpKIu\  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b $T)EJe  
rk$$gXg9/  
ON a.username=b.username $i^#KZ}-WK  
2th>+M~A  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: M :4N'#`  
W.fsW<{4j  
SELECT a.*,b.* 1I{^]]qw  
hd@ >p.  
FROM city as a FULL OUTER JOIN user as b BO3#*J5S\  
e B$ S d  
ON a.username=b.username M+mO4q6  
d'4^c,d  
(三)交叉连接 ]W-7 U_  
uTemAIp $u  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 COF_a%  
/Lf+*u>"  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Z uh!{_x;  
/ p_mFA]@  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 U',9t  
[M7&  
于6*8=48行。 [HV>4,,3"  
2Op\`Ht &  
SELECT type,pub_name a<W[???m/M  
1h"CjOp,7  
FROM titles CROSS JOIN publishers u9.x31^  
Zi0B$3iOb  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五