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

[原创]SQL查询语句使用

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

一、简单查询 Hr /W6C  
TG4\%S$w  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 4,j4E@?pG9  
'&N: S-  
表或视图、以及搜索条件等。 uFGv%W  
V/`#B$6  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 }Vs~RJM)}  
#D/$6ah~m  
SELECT nickname,email yEE|e&#>  
d|>9rX+f  
FROM testtable ]&&I|K_  
9+]ZH.(YE  
WHERE name='张三' qRgK_/[]  
& 6`  
(一)选择列表 WA<H  
imo'(j7  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 "B3iX@C  
g@$0FY{Q  
量和全局变量)等构成。 (xucZ  
JOA%Y;`<#  
1、选择所有列 U,oD44  
\7|s$ XQ\  
例如,下面语句显示testtable表中所有列的数据: j'G"ZPw1  
zd?bHcW/h  
SELECT * F6RyOUma  
 ~Y1"k]J  
FROM testtable 5Z^$`$/.v#  
#cw! &  
2、选择部分列并指定它们的显示次序 ;e&hM\p  
e 7Yb=/F  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 y&n1 Nj]^  
N2[, aU  
例如: #]?,gwvTf  
>g5T;NgH9  
SELECT nickname,email K?z*3^^X;  
(1j(* ?2  
FROM testtable ;y:#S^|?-z  
+W V@o'  
3、更改列标题 ~@b9  
/ e~  
在选择列表中,可重新指定列标题。定义格式为: *T.={>HE8  
7VEt4  
列标题=列名 27h/6i3  
sW>P-  
列名 列标题 1G e)p4  
9Q SUCN_  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ')5jllxv  
w\0Oz?N  
标题: ,gFL Wb`B'  
UiGUaBmF*  
SELECT 昵称=nickname,电子邮件=email "Qiq/"h  
LM'*OtpDG  
FROM testtable <a4 iL3  
hq|j C  
4、删除重复行 puf;"c6e'  
d\1:1ucV  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 a=}">=]7  
L!G9O]WB  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 uK"$=v6|  
2vk8+LA(6  
5、限制返回的行数 P:zEx]Y%  
S`'uUvAA  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 rRA_'t;uK  
KweHY,  
表示一百分数,指定返回的行数等于总行数的百分之几。 `Tm8TZd66  
O*+w_fox  
例如: Bv |jo&0n  
]R2Z-2  
SELECT TOP 2 * 3'gd'`Hn/  
RY'\mt"W2  
FROM testtable FZ}C;yUPD  
RmCn&-i  
SELECT TOP 20 PERCENT * 9X^-)G>  
c,[qjr#\>  
FROM testtable b`;b}ug  
]i_):@  
(二)FROM子句 K{[Fa,]'  
WLj_Zo*^x  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 8Vg`;_-  
lw/ m0}it  
它们之间用逗号分隔。 ;j Y'z5PH5  
{F{[!.  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 5p>]zij>  
=f{Z~`3  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 "78cl*sD  
4HYH\ey  
使用下面语句格式加以限定: b} q(YgH<  
[]]LyWk  
SELECT username,citytable.cityid p%M(G#gOgP  
`A}{ I}xq  
FROM usertable,citytable qLktMp_  
*rMN,B@  
WHERE usertable.cityid=citytable.cityid b^=8%~?%4  
_o=`-iy9  
在FROM子句中可用以下两种格式为表或视图指定别名: jWb\"0)  
fPuQ,J2=  
表名 as 别名 Se]t;7j  
`&&6-/  
表名 别名 U:\oGa84A  
)F9%^a(  
例如上面语句可用表的别名格式表示为: Ml_:Q]kl^  
R/KWl^oNj  
SELECT username,b.cityid (UiH3Q9C]%  
)~o`QM+  
FROM usertable a,citytable b o@V/37!  
MrygEC 5  
WHERE a.cityid=b.cityid :WKyEt!3  
tGy%n[ \  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 w `9GygS  
qi5>GX^t]b  
例如: :ftyNaq'  
w}KcLaI  
SELECT a.au_fname+a.au_lname ki/Lf4  
 9%hB   
FROM authors a,titleauthor ta 5<'Jd3N{&  
Y~\xWYR  
(SELECT title_id,title orN2(:Ct7  
LSOwa  
FROM titles 7!d<>_oH  
O8}s*}]  
WHERE ytd_sales>10000 }&^bR)=  
gZuR4Ti  
) AS t dL Py%q  
bsS| !KT  
WHERE a.au_id=ta.au_id jI pcMN<  
,}xC) >  
AND ta.title_id=t.title_id !ilDR<  
'aSORVq^e[  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 o0v m?CL#  
^{,}, i  
(三)使用WHERE子句设置查询条件 YH6 K-}  
t jBv{  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: #B{F{,vlu,  
7PPsEU:rf  
SELECT * S%%qn  
{ l~T~3/i  
FROM usertable iDe0 5f1R  
PDiorW}]k  
WHERE age>20 Wa<NId  
6 v#sq  
WHERE子句可包括各种条件运算符: 7VD7di=D  
/IR5[67  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< mTu9'/$(  
iw6M3g#  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Jrrk$0H^~  
1;sAt;/W8  
NOT BETWEEN…AND… A.*nDl`H  
v*p)"J *  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) }C1}T}U  
M%LwC/h:,  
NOT IN (项1,项2……) [<yUq zm  
B#lj8I^|  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE DWO:  
$e,!fB;B  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL { ^k,iTx   
F}mwQ%M  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR w6Ny>(T/  
RB@gSHOc?  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 zm.sX~j  
Y\F H4}\S  
2、列表运算符例:country IN ('Germany','China') ` R-np_  
<GlV!y  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 &cejy>K  
%6?}gc_  
varchar、text、ntext、datetime和smalldatetime等类型查询。 ~H."{  
f)fw87UPc  
可使用以下通配字符: D($UbT-v  
!KW)*  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 BAed [  
rkXSy g b  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 :jCaDhK  
U5s]dUs (  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 *38\&"s4_  
zL}DLfy>R  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 7hE=+V8  
.;Yei6H  
例如: S'fq/`2g6  
G7xjW6^T  
限制以Publishing结尾,使用LIKE '%Publishing' ` &DiM@Sm  
#J9XcD{1  
限制以A开头:LIKE '[A]%' w N.Jyb  
$*> _0{<  
限制以A开头外:LIKE '[^A]%' %8}w!2D S  
=i<(hgD  
4、空值判断符例WHERE age IS NULL q|\Cp  
W{2y*yqY  
5、逻辑运算符:优先级为NOT、AND、OR w%na n=  
)]Rr:i9n  
(四)查询结果排序 cV,URUD  
KLB?GN?Pb  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ,]' !2?  
BGOI  
ORDER BY {column_name [ASC|DESC]} [,…n] /pEki g7M  
s^< oU  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 kv2:rmv  
HX^ P9jXT  
序。 1k(*o.6  
OC.@C}u  
例如: ru Lcu]  
jeNEC&J  
SELECT * efm<bJB2  
$'wl{D"  
FROM usertable l1-FL-1  
"Y6mM_flq  
ORDER BY age desc,userid ASC B(U`Zd  
*a4eL [  
另外,可以根据表达式进行排序。 ?U[AE -*  
X+ jSB,  
  ,y @3'~  
75ob1h"  
二、联合查询 BGS6uV4^>  
X88Zd M'  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 ;DpK* A  
^TGHWCK!t  
合查询。UNION的语法格式为: Dc2eY.  
~1oD7=WN  
select_statement sa($3`d  
A |B](MW%O  
UNION [ALL] selectstatement a;sZNUSn  
,\ i q'}i  
[UNION [ALL] selectstatement][…n] AseY.0  
J\BdC];  
其中selectstatement为待联合的SELECT查询语句。 |SmN.*&(9  
xUUp ?]9y  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 J^T66}r[f,  
' wEP:}  
行。 lHU$A;  
S/|8' x{<  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 ,??|R` S  
Gu pKM%kM  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 SF7Kb`>Y  
'1+ Bgf  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 !ibp/:x  
w~`P\i@  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 %9K@`v-  
D {mu2'q  
型,系统将低精度的数据类型转换为高精度的数据类型。 (~#9KA1A}  
iDA`pemmi&  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: h ? M0@Z  
bYz:gbs]4|  
查询1 UNION (查询2 UNION 查询3) vzU%5,  
N78Ev7PN  
  /i<g>*82  
bF.Aj8ZQ  
  '"&?u8u)  
KK?}`o  
三、连接查询 Z7Kc`9.0|  
*QLbrR  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 0bor/FU-d  
 :JlJB  
数据库管理系统的一个标志。 G8SJ<\?  
? DPL7  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 m{g{"=}YR  
>\e11OU0Gy  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 b% F|V G  
("{'],>  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ojaZC,}  
8ViDh  
查询。 @M1U)JoQ  
QAR<.zXvP  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 uJ[dO}  
a^22H  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 0@ -LV:jU  
^71sIf;+  
SQL-92标准所定义的FROM子句的连接语法格式为: ZjzQv)gZ  
:G!Kaa,r  
FROM join_table join_type join_table [mm5?23g  
az w8BK  
[ON (join_condition)] j9Lc2'  
<_D+'[  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 n@*NQ`(_  
)T^hyi$  
个表操作的连接又称做自连接。 5n_<)Ycj  
BM3nZ<%3  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 rn(T Z}  
NK#f Gz*,(  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 r!;NH3 *  
W<~(ieu:K~  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 RsE+\)  
 3N;X|pa  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) wqw$6"~  
c(o8uWn  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 uoF9&j5E@Z  
U:_&aY_  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 2 Y%$6NX  
LNe- ]3wB  
数据行。 =x=#Etj|  
Nl1&na)K}  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 LdA&F& pI  
BwbvZfV|  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 4-s Uy  
QH+Oi&xH  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 y6$5meh.T  
'y@0P5[se  
运算符等构成。 S/8xo@vct]  
?L'ijzP  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 Tc{r}y[)  
&ceZu=*  
连接。例如: Fe8xOo6  
EyozhIV  
SELECT p1.pub_id,p2.pub_id,p1.pr_info )abo5   
rqifjsv  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 JWC{"6  
gJ:Z7b  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) /,wG$b+  
wuI+$?  
(一)内连接 \=1k29O  
{~VgXkjsC  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 $kg!XT{ V  
c/b} 39X  
三种: wtaeF+u-R-  
N_h)L`  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 >{V]q*[/;Q  
/&a[D 2  
表中的所有列,包括其中的重复列。 5yuR[ VU  
Sky!ZN'I  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 S'lZ'H/  
Busxg?=  
运算符包括>、>=、<=、<、!>、!<和<>。 PO1sVP.S  
t\S}eoc  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Y ~xcJH  
^I@43Jy/  
结果集合中所包括的列,并删除连接表中的重复列。 XzkC ]e'  
kF`2%g+  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: )Yy`$`  
U8;k6WT|  
SELECT * Sm{idky)[  
@ITJ}e4  
FROM authors AS a INNER JOIN publishers AS p V_$BZm%8J  
d?.ewsC  
ON a.city=p.city gM '_1zs U  
>XM-xK-=  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): kO+Y5z6=  
i.C+{QH  
SELECT a.*,p.pub_id,p.pub_name,p.country glm29hF  
?l &S:` L  
FROM authors AS a INNER JOIN publishers AS p +' QX`  
aTxss:7]  
ON a.city=p.city g kT`C  
D<$, v(-  
(二)外连接 n>" 0y^v  
Vr+X!DeY  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 |L 11?{ K  
KC[ql}JP  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 YAYPof~A$l  
/PafIq  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ]6bh#N;.  
w^6rgCl  
如下面使用左外连接将论坛内容和作者信息连接起来: @FKm_q  
_Ryt|# y  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b N =FX3Z  
0JN>w^  
ON a.username=b.username 7o_1PwKS6  
fkbHfBp[(A  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: &@p_g8r#  
Uus%1hC%a  
SELECT a.*,b.* :m#[V7  
Xn@\p5<  
FROM city as a FULL OUTER JOIN user as b SaceIV%(  
@-qS[bV  
ON a.username=b.username ZfsM($|a  
`K5Lp>=R  
(三)交叉连接 FOV%\=Hl  
7)SG#|v[$  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 W6%\Zwav?)  
}tJR Bb  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 }-4@EC>  
tUU`R{=(  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 V{4=, Ax  
&B ?TX.  
于6*8=48行。 69/aP=  
14>WpNN  
SELECT type,pub_name W}jel}:  
k@:M#?(F  
FROM titles CROSS JOIN publishers $ 1lI6 = ,  
oHh~!#u  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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