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

[原创]SQL查询语句使用

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

一、简单查询 dj?.Hc7od  
vf~q%+UqK  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 5cxA,T  
iyu%o9_0  
表或视图、以及搜索条件等。 7-w +/fv  
f&ZxG,]H i  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 >('L2]4\v  
:{LVS nG  
SELECT nickname,email &.=d,XKN  
U-3KuR+0  
FROM testtable &EXql']  
WaN0$66[:  
WHERE name='张三' d<V+;">2  
"a5?cX;  
(一)选择列表 7u!R 'D  
(bH"x  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 2j4VW0:  
X||o iqbY  
量和全局变量)等构成。 {;Mcor3  
.+ai dWd  
1、选择所有列 8 8pz<$  
/Rx%}~x/m  
例如,下面语句显示testtable表中所有列的数据: t{!}^{ "5  
emw3cQ  
SELECT * /.$n>:XR  
RX=C)q2c  
FROM testtable !F;W#Gc  
0$}+tq+  
2、选择部分列并指定它们的显示次序 uc=-+*D'I  
0l.+yr}PE  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 -q(,}/Xf  
@XDU !<N  
例如: ;TMH.E,h:  
`8xe2=Ub  
SELECT nickname,email }/(fe`7:  
?*4&Z.~J  
FROM testtable YqR MVWcnk  
8\. #  
3、更改列标题 0D|^S<z6  
vay_QxB5  
在选择列表中,可重新指定列标题。定义格式为: (IIOKx_  
d|j3E  
列标题=列名 26 o68U8&y  
` B : Ydf  
列名 列标题 g?^o++  
HP. j.  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 6;I&{9  
UG&/0{j5XV  
标题: G}BO!Z6  
Tp)-L0kD_k  
SELECT 昵称=nickname,电子邮件=email f*1.Vg0`-  
2ztP'  
FROM testtable bzk@6jR1  
1xL2f&bG  
4、删除重复行 RQ9fA1YP  
?%;7k'0"  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 %Ni)^   
i?qS8h{  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 9d#-;qV  
HR\yJt  
5、限制返回的行数 *vCJTz  
E:&=A 4 %  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 .FqbX5\p,  
!wJ~p:vRdY  
表示一百分数,指定返回的行数等于总行数的百分之几。 B6MMn.  
ysGK5kFz  
例如: d=xU f`^  
O6Xu/X]  
SELECT TOP 2 * 4}W*,&_  
#&1mc_`/  
FROM testtable 4@/[aFH  
h[ba$S,T  
SELECT TOP 20 PERCENT * z1T.\mzfX  
$w)yQ %  
FROM testtable Rl.3p<sX  
SEIGs_^'\  
(二)FROM子句 Q;)[~p  
jGb+bN5U7  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, qI^6}PB  
3"6lPUS  
它们之间用逗号分隔。 X*]uLgbl  
+sQ=Uw#e  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 "sUL"i  
*-3K],^a  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 }/SbmW8(1  
a7%5Qg9B;  
使用下面语句格式加以限定: nP0|nPWz#  
O<Ht-TN&  
SELECT username,citytable.cityid ou6yi; l%  
@4sv(HyDY  
FROM usertable,citytable l<(MC R*  
3RXq/E  
WHERE usertable.cityid=citytable.cityid oa}-=hG  
A=I]1r  
在FROM子句中可用以下两种格式为表或视图指定别名: U $# ?Lw  
TlQ#0_as[  
表名 as 别名 Xb?P'nD  
?`u Y*+u  
表名 别名 Eu l,1yR  
R',Q)<  
例如上面语句可用表的别名格式表示为: ,=Xr'7w,  
*6df|q  
SELECT username,b.cityid yS@c2I602  
q$(aMO&J  
FROM usertable a,citytable b k9~NIvnB`  
[ZZ~^U5  
WHERE a.cityid=b.cityid (5cc{zKtR  
l"f.eo0@7  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 d2Z5HFtY  
Y]Vt&*{JV  
例如: u+&BR1)C  
7!]$XGz[  
SELECT a.au_fname+a.au_lname )%-FnW  
]p\7s  
FROM authors a,titleauthor ta )U`6` &F  
\5_+6  
(SELECT title_id,title 3 i Id>  
Q0#oR [(  
FROM titles Dwj!B;AZ_  
"|{ NRIE  
WHERE ytd_sales>10000 (Dlh;Ic r9  
$.a<b^.Xi  
) AS t o:.={)rX  
~4"adOv  
WHERE a.au_id=ta.au_id P%8 Gaa=  
Xx~OZ^t&Vn  
AND ta.title_id=t.title_id hxP%m4xF +  
=kp #v  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 B: \\aOEj  
Pv17wUB  
(三)使用WHERE子句设置查询条件 lG I1LUo  
Aq yR+  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: Ynl^Z  
!TA6-]1  
SELECT * 1p[C5j3  
64%P}On  
FROM usertable aHNR0L3$}{  
[a:yKJ[  
WHERE age>20 5Ev9u),D+v  
]JVs/  
WHERE子句可包括各种条件运算符: $sTbFY  
 0w>V![  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< `O?Kftv*  
VUpa^R  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… eee77.@y-p  
cY8X A6  
NOT BETWEEN…AND… 9t:F![rg  
A'vQtlvKA  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ;IZ*o<_  
VgD z:j  
NOT IN (项1,项2……) Y,w'Op  
##+|zka!U  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ELfcZfJ  
8n+&tBq1  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL L.ScC  
m \o<a|  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR %X7R_>.   
Y~gDS^8  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 dw#K!,g  
#?\$*@O  
2、列表运算符例:country IN ('Germany','China') N[~{'i  
Xb?:dlu3  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 $&& mGD;?K  
dn(I$K8  
varchar、text、ntext、datetime和smalldatetime等类型查询。 H=Scrvfx  
}{T9`^V:h  
可使用以下通配字符: )hs"P%Zg  
;\ ^'}S|3Z  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 4Vl_vTz{i  
eG&\b-%  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 d3-F?i 5d  
@ 32~#0a  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 3*)<Y}Tc  
w^OV;gp  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Y)#x(s?t  
R % [ZQ K  
例如: ~A@T_ *0  
_&V%idz!0  
限制以Publishing结尾,使用LIKE '%Publishing' &.XlXihnt  
yHhx- `  
限制以A开头:LIKE '[A]%' Le;;Yd}f  
x93h{K f  
限制以A开头外:LIKE '[^A]%' Zk,` Iq  
kt`_n+G  
4、空值判断符例WHERE age IS NULL BIGln`;,f  
E Q 'L"  
5、逻辑运算符:优先级为NOT、AND、OR )4:K@  
qTSyy=  
(四)查询结果排序 ~tK4C|  
Hdvtgss!  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: CD]hi,B_J  
o>WB,i^G  
ORDER BY {column_name [ASC|DESC]} [,…n] <Qg).n>;z  
8(-V pU  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 ffoL]u\  
<A|X4;  
序。 YnM&t ;TX  
%Ms"LoK  
例如: X$*MxMNs  
Pq\ `0/4_  
SELECT * kY>jp@w V  
mzw`{Oy>L  
FROM usertable e&~vO| 3w%  
LGnb"ZN  
ORDER BY age desc,userid ASC Dz d[<Qln  
n/W@H Im#  
另外,可以根据表达式进行排序。 [|iWLPO1&k  
+85#`{ D  
  Nq]8p =e  
o;'E("!<Z  
二、联合查询 S]!s)q-- z  
(=A61]yB  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 \^o8qw'pt  
ga?:k,xv  
合查询。UNION的语法格式为: y;Ez|MS   
@*?)S{8  
select_statement /my5s\;s|z  
z<_&4)2{  
UNION [ALL] selectstatement s;brs}  
nm"]q`(K  
[UNION [ALL] selectstatement][…n] uu7 ?,WT  
HQp\0NC]  
其中selectstatement为待联合的SELECT查询语句。 D;nd_{%  
$4>(}  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 k1lo{jw`  
NS<C"O  
行。 :1 *q}R   
vCvjb\S  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 ML_$/  
ATQw=w 3W  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 4^r4O#  
iGq%|o>  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 vHJOpQmt~  
IRhi1{K$"  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 * 'eE[/K  
Clz. p  
型,系统将低精度的数据类型转换为高精度的数据类型。 is~"yE7  
#ovausK[7  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: n?KhBJx 4  
J\@|c.ws  
查询1 UNION (查询2 UNION 查询3) [}Q_T.4)E  
$-D}y:  
  Yg /g9$'  
(rmOv\hG9V  
  V0)bPcS/  
^C=dq(i=[  
三、连接查询 2LfiaHO  
z`"*60b  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 jgvzp  
6|mHu2qXm  
数据库管理系统的一个标志。 sL Kk1A  
2jf73$F  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 L< XAvg  
p< Y-b,&  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 o3"Nxq"U  
( ]E0fjk  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 #fYRsVQ  
U[0x\~[$K  
查询。 |,bP` Z  
4s s 4O  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ) $`}~  
a(J@]X>'  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 @m5c<(bkfp  
S j ly]  
SQL-92标准所定义的FROM子句的连接语法格式为:  /!#A'#Z  
<ni_78  
FROM join_table join_type join_table u^O!5 'D%  
DsB30  
[ON (join_condition)] 57fl<IM  
z!M #   
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 I4|LD/b  
xH\!j  
个表操作的连接又称做自连接。 eJ*u]GH U  
t$Bu<frQ  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 `q9n`h1  
8J#U=qYei  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 /[=Yv!  
ZaBmH|k  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 qzj.N$9]  
+v2)'?BS  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ^w!1QH0:/  
_/czH<   
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 sYq:2Wn>8Q  
yV~TfTJ  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 3'Hz,qP  
+CVB[r#hu  
数据行。 M }! qH.W  
n^q%_60H   
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 |KR8=-!7  
lak,lDt]  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ~.tl7wKkR/  
\.aKxj5  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 4tEAi4H|`@  
csd9[=HW/Q  
运算符等构成。 eZ oAy[  
<NEz{1Z  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 85f:!p  
LOgFi%!6:  
连接。例如: !kG|BJ$j  
naro  
SELECT p1.pub_id,p2.pub_id,p1.pr_info v.&c1hKHb  
dB)-qL8,2  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 7K HQ0  
uHsLlfTn  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) MK-+[K  
~?4 BP%g-y  
(一)内连接 r$1b=m,0d  
<PFF\NE9  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 nQOzKw<j%  
W}y)vrL  
三种: : ?}mu1  
S0Ur{!9\#^  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 d[{!^,%x"  
pw&k0?K#  
表中的所有列,包括其中的重复列。 [dR#!"6t  
NBXhcfF  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 =:Yrb2gP_\  
!>"fDz<w`  
运算符包括>、>=、<=、<、!>、!<和<>。 lUaJC'~p  
-dWg1`;  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 &"?99E>  
g${JdxR:  
结果集合中所包括的列,并删除连接表中的重复列。 L|Xg4Z  
ek.@ 0c  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: q9H\ $  
E]v]fy"  
SELECT * ubZJUm  
w=CzPNRHH!  
FROM authors AS a INNER JOIN publishers AS p c5|sda{  
n|pdYe8\  
ON a.city=p.city aM xd"cTzx  
JQ;.+5 N<K  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): C(9"59>{]y  
P^# 4m  
SELECT a.*,p.pub_id,p.pub_name,p.country Y]*&\Ex"\  
j /_&]6!  
FROM authors AS a INNER JOIN publishers AS p C0K: ffv;<  
fdWqc_  
ON a.city=p.city ^Vhl@  
CPL,QVO9  
(二)外连接 &S`g&  
3A{)C_1a  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Zwz co  
x N7sFSV@  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 0WfnX>(C7R  
eM 5#L,Y{  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 z@ J>A![m  
eX>*}pI  
如下面使用左外连接将论坛内容和作者信息连接起来: Gov.;hy  
qo$ls\[X  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b Q-!gO  
hkyO_ns  
ON a.username=b.username  VM:|I~gJ  
 }JWkV1  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: o$Ylqb#  
9pPLOXr ,  
SELECT a.*,b.* /Wcx%P  
n*Dn{ 7v#z  
FROM city as a FULL OUTER JOIN user as b 'l`prp3  
O@ H.k<zn  
ON a.username=b.username $+f=l~/s  
"OA{[)fw"  
(三)交叉连接 !zm;C@}ln  
4;W{#jk  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 M| j=J{r  
Cl9rJ oT  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ^-Ygh[x  
_yUYEq<`  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 S6_:\Q  
a$h^<D ^  
于6*8=48行。 mhX66R  
Q xA( *1  
SELECT type,pub_name 83I 5n&)  
%k32:qe  
FROM titles CROSS JOIN publishers AD^I1 ]2f  
yNEU/>]>2  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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