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

[原创]SQL查询语句使用

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

一、简单查询 Li~(kw3  
fTiqY72h  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 2GOQ|Z  
<![tn#_  
表或视图、以及搜索条件等。 V_f}Y8>e  
#PUvrA2Zl  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 Uf )?sz  
dA >=#/"  
SELECT nickname,email A5-y+   
OJ8ac6cJ  
FROM testtable !9=hUpRN  
[.4R ,[U  
WHERE name='张三' =g4^tIYq  
"3o{@TdU  
(一)选择列表 2?YN8 n9n  
?:l3O_U 5  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 (7BG~T  
qS<a5`EA  
量和全局变量)等构成。 m qgA  
m^cr-'  
1、选择所有列 W5,e;4/hL  
T|^rFaA  
例如,下面语句显示testtable表中所有列的数据: jqq96hP,  
4 zuM?Dp  
SELECT * tiG=KHK%o  
*A C){M  
FROM testtable dr0<K[S_  
kbzzage6L  
2、选择部分列并指定它们的显示次序 j<H`<S  
)W9W8>Cc5_  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ~_ss[\N  
USfpCRj9  
例如: @igGfYy  
YT\x'`>Q  
SELECT nickname,email pQ%~u3  
}~pT saw  
FROM testtable xc)A`(g  
1gk{|keh  
3、更改列标题 K6<@DP+/  
y1R53u`;L  
在选择列表中,可重新指定列标题。定义格式为: K{)N:|y%!$  
1}+lL)-!  
列标题=列名 1A\Jh3;Q  
i zJa`K  
列名 列标题 mh`~1aEr  
\jLn5$OW  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 0S8v41i6  
]la8MaZ<  
标题: J J@O5  
A41*4!L=  
SELECT 昵称=nickname,电子邮件=email OB"Ur-hJ0  
-JOtvJIQI  
FROM testtable ,] HH%/h  
DM"nxTVre  
4、删除重复行 >zcR ?PPs  
tDj~+lmdN  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ;=\vm"I?  
LWgYGXWT"  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 mU.(aL HW  
\| qr&(PG  
5、限制返回的行数 \49LgN@\  
R3+y*< <e  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 2q V.`d  
5dc24GB>_  
表示一百分数,指定返回的行数等于总行数的百分之几。 :SFcnYv0  
UjLZ!-}  
例如: RbB y8ZVM  
Zp'c>ty=  
SELECT TOP 2 * 5bU[uT,`6  
Y1 RiuJtL  
FROM testtable IG@.WsM_  
L=Cm0q 3 v  
SELECT TOP 20 PERCENT * )IUeWR  
vg@kPuOiO  
FROM testtable uNnx i  
L3[r7 b  
(二)FROM子句 [/_M!&zz2  
H^y%Bi&^  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ;/gH6Z?  
!ceT>i90h  
它们之间用逗号分隔。 r[; .1,(  
F-i`GMWC  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 8W' ,T  
9_yO 6)`  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 }{"a}zOl  
-= {Z::}S"  
使用下面语句格式加以限定: tMM *m  
0I6[`*|SX  
SELECT username,citytable.cityid S[!sJ-rG  
& h)G>Sqc  
FROM usertable,citytable /H 3u^  
|eS5~0<`  
WHERE usertable.cityid=citytable.cityid p H&Tb4  
&t .9^;(  
在FROM子句中可用以下两种格式为表或视图指定别名: AIZs^ `_  
Q}ebw  
表名 as 别名 ul0]\(sS:  
MbY?4i00%h  
表名 别名 A gKG>%0  
JMp>)*YS  
例如上面语句可用表的别名格式表示为: ["4sCB@Tr  
5 9$B z'LY  
SELECT username,b.cityid #H9J/k_  
! 63>II  
FROM usertable a,citytable b Z"spua5  
tbz?th\#  
WHERE a.cityid=b.cityid OsS5WY0H  
JP$@*F@t  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 sg@)IEg</v  
8GpPyG ],e  
例如: N}`.N  
j ys1Ki  
SELECT a.au_fname+a.au_lname s$g"6;_\  
;O7CahdF  
FROM authors a,titleauthor ta EPx_xX  
qRXQL"Pe_l  
(SELECT title_id,title l :sZ  
Z}#, E ;  
FROM titles Q-<,+[/  
s)_Xj`Q#  
WHERE ytd_sales>10000 fq^D<c{3  
>T'=4n['  
) AS t )b<-=VR  
?.E ixGzI^  
WHERE a.au_id=ta.au_id z}I4m  
34Q;& z\e  
AND ta.title_id=t.title_id S $wx>715  
oK cgP  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 S`,(10Y  
H JFt{tq2  
(三)使用WHERE子句设置查询条件 5nq0#0O c  
&,?bX])  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: F$TNYZ  
u\~dsD2)q  
SELECT * om$x;L6  
T KpX]H`  
FROM usertable -{z.8p}IW  
INca  
WHERE age>20 Tac7+=T  
G8}w|'0m  
WHERE子句可包括各种条件运算符: eow6{CD8  
unE h  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< PoyY}Ra  
MB$K ?"Y  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… OnO56,+S^  
Wn*>h'R  
NOT BETWEEN…AND… bLMN9wGOgK  
.+1.??8:+  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) F+.:Ry FS  
\x JGR!  
NOT IN (项1,项2……) nic7RN?F<  
}UwDHq=  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE y%.^| G  
RS&l68[6  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL rCGyr}(NC  
#]nH$Kq  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR GX4HW \>a  
Kk?P89=*  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 F?b5!<5  
Kyy CS>  
2、列表运算符例:country IN ('Germany','China') c"X`OB  
m`(5B  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 r+8%oWj  
H]@M00C  
varchar、text、ntext、datetime和smalldatetime等类型查询。 h-B&m:gD_U  
^8S'=Bk  
可使用以下通配字符: 5&5 x[S8  
n[#!Q`D  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 CB(Qy9C%h[  
HorFQ?8  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 %{$iN|%J%$  
6onFf* m!x  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 Gi})*U]P|  
0)/L+P5  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 I_ "1.  
#T0uPK ;  
例如: 7~@q#]U[  
D$|@: mW  
限制以Publishing结尾,使用LIKE '%Publishing' BM+v,hGY  
N%Gb  
限制以A开头:LIKE '[A]%' 5[Sa7Mk  
-nP y?>p"|  
限制以A开头外:LIKE '[^A]%' 0zD[mt  
OQt_nb#z`{  
4、空值判断符例WHERE age IS NULL d(u"^NH;  
k&-SB -  
5、逻辑运算符:优先级为NOT、AND、OR #'}?.m  
Zo}O,;(F5  
(四)查询结果排序 .W _'6Q+  
KiN8N=z  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ^8p=g -U\  
2l5>>yY  
ORDER BY {column_name [ASC|DESC]} [,…n] 0fhz7\a^_<  
E<u6 js,  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 I^h^QeBis  
$@t]0  
序。 LadE4:oy  
zS]8ma  
例如: "8{#R*p  
z;? 3 2K  
SELECT * #*QnO\.  
rPf<8oH  
FROM usertable ZzZy2.7  
9r,)Bw!RP  
ORDER BY age desc,userid ASC r(g:b ^S  
%fY\vd 2  
另外,可以根据表达式进行排序。 SJ(<u2J]  
7` 113`1  
  R-Y07A  
oWg"f*  
二、联合查询 {C6,h#|pg  
5U[m]W=B  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 ygiZ~v4P/  
J&mZsa)4  
合查询。UNION的语法格式为: [ +w=  
hS<lUG!9UJ  
select_statement Gw 4~  
C"`,?K(U  
UNION [ALL] selectstatement 9?8Yf(MC%u  
n o6q3<re  
[UNION [ALL] selectstatement][…n] zo!e<>o  
A.0eeX{  
其中selectstatement为待联合的SELECT查询语句。 |Tn+Aq7  
VKI`@rY4  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 @w?y;W!a>  
_ISIq3A?  
行。 `;?`XC"m  
WvV!F?uqZ  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 %Z T@&  
[T|_J$ ;  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 RM/q\100  
AUZ^XiK  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ~.-o*  
@)"= b!q=  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 vwA d6Tm  
TGUlJLT  
型,系统将低精度的数据类型转换为高精度的数据类型。 S6~&g|T,  
OsQB` D  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: X@:[.eI~  
z"[}Sk  
查询1 UNION (查询2 UNION 查询3) l_Ee us  
(MfPu8j  
  Qq,w6ekr  
kkvG=  
  [FhFeW>  
a!iG;:K   
三、连接查询 ){~]-VK  
%d3KE|&u  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 )zU bMzF  
IEbk_-h[  
数据库管理系统的一个标志。 B !>hHQ2  
/*v} .fH%  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 ",9QqgY+  
M`1pze_A  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 t@hE}R  
B4 XN  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ?H7YmN  
G)|s(C!  
查询。 ?<3wks|C  
) ?L  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 H Pvs~`>V  
y+R *<5qC<  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 uH"W07  
YfB8  
SQL-92标准所定义的FROM子句的连接语法格式为: )21yD1"6  
m]XG7:}V0  
FROM join_table join_type join_table 5 5$J% ;&  
K<#Q;(SFU  
[ON (join_condition)] (g>8!Gl  
x(r>iy  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 TOH!vQP  
h3.6<vM  
个表操作的连接又称做自连接。 57nSyd] PR  
Y*}xD;c k  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 G]DSwtB?D  
vh29mzum  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ONc-jU^  
Qv v~nGq$  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 Aw7oyC!  
hXF#KVqx  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) s,~p}A%0  
'f'zV@)  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 Imv ]V6"D=  
J%|n^^ /un  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 gk-g!v&  
e<.O'!=7Y  
数据行。 reO^_q'  
cV|u]ce%1  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 CVk.Ez6  
q!r4"#Y"@Z  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 L("zS%qr  
8Qwn  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 uaiCyh1:  
x JXPtm  
运算符等构成。 .66_g@1  
dc]D 8KX  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ,p3moD 3  
cz{5-;$9Z  
连接。例如: TmH'_t.*T~  
y,YK Mc  
SELECT p1.pub_id,p2.pub_id,p1.pr_info i,3[0*ge  
J/-&Fa\(  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Zo12F**{  
2Pa Rbh{"  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) j$%uip{  
#z. QBG@  
(一)内连接 krt8yAkG  
y?r:`n  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 v c r5  
/a'cP  
三种: et-<ib<lY  
mW+QJ`3  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 W)OoHpdw  
AJ%x"  
表中的所有列,包括其中的重复列。 E <O:  
S|_}0  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ]CL9N  
- C  
运算符包括>、>=、<=、<、!>、!<和<>。 s\Zp/-Q  
:)PAj  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 D=!e6E<>@  
jdEqa$CXG  
结果集合中所包括的列,并删除连接表中的重复列。 |o5F%1o  
~ "IjT'W3  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: xklXV  
P.j0Xlof  
SELECT * `3QAXDWE  
(*XSr Q  
FROM authors AS a INNER JOIN publishers AS p X6Y<pw`y  
n#.~XNbxv  
ON a.city=p.city Wwf],Ya  
$@ R[$/  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ,'FdUq)i  
Z2.S:y.  
SELECT a.*,p.pub_id,p.pub_name,p.country Y, ?- []  
0=,vdT  
FROM authors AS a INNER JOIN publishers AS p AVR=\ qR  
FlqE!6[[  
ON a.city=p.city Y*KHr`\C4  
3P&K<M#\  
(二)外连接 ~AX@o-WU  
6q8b>LG|  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 \_#Z~I{  
'TdO6-X  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 k`u:Cz#aB  
@71n{9  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 uy t'  
/1!Wet}f  
如下面使用左外连接将论坛内容和作者信息连接起来: d9E'4Zm  
"=/YPw^0  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b x9lG$0k:V  
n}T;q1  
ON a.username=b.username =Eimbk  
9pPohR*#V  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: GK>.R<[  
iW\Q>~0#_  
SELECT a.*,b.* kz UP   
K9@F1ccQ/  
FROM city as a FULL OUTER JOIN user as b 1638U 1  
HpQuro'Qh  
ON a.username=b.username tsqkV7?  
XoO#{7a  
(三)交叉连接 "T?hIX/p _  
 q\xT  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 [og_0;  
p^yuz (  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 "j<l=l!  
VD).UdUn  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 DNu^4#r  
([+u U!  
于6*8=48行。 j1sZRl)D  
|oL}c!0vs  
SELECT type,pub_name .8I\=+Zi  
T*'?;u  
FROM titles CROSS JOIN publishers %~$P.Zh  
w:0=L`<Eu  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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