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

[原创]SQL查询语句使用

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

一、简单查询 2`P=ekF]  
hZwJ@ Vm#  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 %Rm`+  
!cNw 8"SIU  
表或视图、以及搜索条件等。 1)v]<Ga~%1  
B x-"<^<  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 W!B\VB  
w 21g&  
SELECT nickname,email CX3yIe~u  
oxZXY]$y  
FROM testtable kG>m(n  
wrm ReT?  
WHERE name='张三' #M@Ki1  
|*v w(  
(一)选择列表 @ebSM#F?  
/7LAd_P6  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ~ya@ YP]';  
EK2mJCC|  
量和全局变量)等构成。 [DD#YL\P  
lcfX(~/m^  
1、选择所有列 sg%Ptp  
N:~CN1  
例如,下面语句显示testtable表中所有列的数据: ( 8Q*NZ  
`"h[Xb#A`b  
SELECT * we&D"V  
/zg|I?$>Z4  
FROM testtable L['g')g.  
*_@t$W  
2、选择部分列并指定它们的显示次序 'dJ(x  
0HPqoen$  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 bwyj[:6l  
T )!k J;vc  
例如: uy rS6e0  
w^E$R  
SELECT nickname,email cxz\1Vphd  
 RxO !h8  
FROM testtable [m0G;%KR/  
)QAS7w#k  
3、更改列标题 l|sC\;S  
RN"Ur'+  
在选择列表中,可重新指定列标题。定义格式为: ypLt6(1j%  
d^qTY?k.  
列标题=列名 p(fL' J  
Ef\&3TcQ  
列名 列标题 L]wk Ba  
&F~97F)A)  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 YckLz01jh  
)R6-]TkA_  
标题: $0&<Jx  
xz3|m _)  
SELECT 昵称=nickname,电子邮件=email a_(T9pr  
iyTKy+3A  
FROM testtable 'cPE7uNT  
@M!nAQ8hY  
4、删除重复行 @&f~#Xe  
ukc<yc].+?  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Jxsch\  
|Ng}ZLBM  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 RC~C}  
kzmw1*J  
5、限制返回的行数 ,b9!\OWDF  
J0FJ@@  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 L XHDX  
h@jk3J9^  
表示一百分数,指定返回的行数等于总行数的百分之几。 j^m x,  
l?O%yf`s  
例如: )7  M  
q{uv?{I  
SELECT TOP 2 * ;( [^+_/  
9w.ZXd  
FROM testtable /|p6NK;8L  
-Ra-Ux  
SELECT TOP 20 PERCENT * >~*}9y0$  
v~:'t\n  
FROM testtable E_-g<Cw  
z<OfSS_]R  
(二)FROM子句 GQ6~Si2  
$Gs|Z$(  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, cv"Bhql  
JQDS3v=1$  
它们之间用逗号分隔。 go?}M]c%7  
NeR1}W  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 "L+NN|  
J[al4e^  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 #L+ZHs~  
kE854Ej  
使用下面语句格式加以限定: 6vf<lmN  
P~h 0Ul  
SELECT username,citytable.cityid "Bl6 ) qw  
 L0>7v  
FROM usertable,citytable ]iry'eljy  
<lP5}F87  
WHERE usertable.cityid=citytable.cityid >!PCEw<i  
p%-;hL!  
在FROM子句中可用以下两种格式为表或视图指定别名: wUKt$_]``  
;8g[y"I  
表名 as 别名 2#X>^LH  
D2'J (  
表名 别名 B8>3GZi  
jE!?;} P1  
例如上面语句可用表的别名格式表示为: {w mP  
4^7*R  
SELECT username,b.cityid 9a]JQ  
C}]143a/Q  
FROM usertable a,citytable b IgEVz^W?h  
qPn!.m$/  
WHERE a.cityid=b.cityid Lklb  
AQD`cG  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 +pxtar  
)j}v3@EM5  
例如: -IS$1  
!SThK8j$7  
SELECT a.au_fname+a.au_lname $|VD+[jSV  
'5\?l:z  
FROM authors a,titleauthor ta =\g K<Xh  
o,!W,sx_  
(SELECT title_id,title ;aDYw [  
Q|7;Zsd:  
FROM titles mV.26D<c  
\RmU6(;IQ  
WHERE ytd_sales>10000 &W%fsy<  
y$+_9VzYB  
) AS t q3ebps9^  
wDKA1i%G  
WHERE a.au_id=ta.au_id $d Nmq  
}[: i!t.m  
AND ta.title_id=t.title_id )<`/Aaie  
:.crES7<[X  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 c>+hY5?C  
+T HBPEq  
(三)使用WHERE子句设置查询条件 +kx#"L:  
eKe[]/}e9  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 4o kZ  
%";ap8J04F  
SELECT * +<'>~lDg  
h y"=)n(  
FROM usertable `gdk,L]  
v,c;dlg_  
WHERE age>20 Vkl]&mYRz  
n!L}4Nmp  
WHERE子句可包括各种条件运算符: @wh-.M D  
U /jCM?~  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< JnS@}m  
]Uul~T  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… (S8hr,%n  
mV|Z5= f  
NOT BETWEEN…AND… ~Hvf"bvK|  
K QCF "  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) &X)^G#  
A>rN.XW  
NOT IN (项1,项2……) 3-_`x9u*  
`FByME  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ><{Lh@{  
Tz{-L%*#  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL J )UCy;Y  
Bs\& '=l  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR e\ ! ic  
vq1u !SY  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 D:XjJMW3r  
$|K-wN[  
2、列表运算符例:country IN ('Germany','China') j=Z;M1  
J'*`K>wV  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 v4r%'bA  
ms#|Y l1/|  
varchar、text、ntext、datetime和smalldatetime等类型查询。 I]Vkaf I>(  
r^`~GG!,Q  
可使用以下通配字符: Z8o8>C\d9/  
8i^d*:R  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 .s>.O6(^%  
uM2 .?>`X  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Q$x 3uH\@  
Nx<fj=VJ  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 43Ua@KNi  
PDpDkcy|QM  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 _.5AB E  
{=,+;/0  
例如: ^@;P-0Sy  
R?8/qGSVqJ  
限制以Publishing结尾,使用LIKE '%Publishing' nQd~i0`vB  
gqDSHFm:  
限制以A开头:LIKE '[A]%' GE}>{x=^x  
Z;cA_}5  
限制以A开头外:LIKE '[^A]%' RH "EO4  
/;`-[   
4、空值判断符例WHERE age IS NULL QVe<Z A8N;  
d>Ky(wS  
5、逻辑运算符:优先级为NOT、AND、OR B+[L/C}=;  
v8\pOI}c  
(四)查询结果排序 uOb}R   
Z + )<FX  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: -Hg,:re2  
gCM(h[7A  
ORDER BY {column_name [ASC|DESC]} [,…n] m,r>E%;Cj  
te&p1F  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 |qtZb}"|  
J+YoAf`hi  
序。 #X*=oG  
GoPK. E$  
例如: @Wd1+Yky  
kjj?X|Un  
SELECT * <'vtnz  
**F-#",  
FROM usertable <4%PT2R  
goc"+ K  
ORDER BY age desc,userid ASC Q`BB@E  
cL:hjr"  
另外,可以根据表达式进行排序。 3j w4#GW  
S{zl <>+  
  xDIl  
L4{+@T1A[  
二、联合查询 1V ; ,ZGI*  
+kT o$_Wkz  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 fi'\{!!3m^  
VX e7b  
合查询。UNION的语法格式为: qnnP*15`  
92M_Z1_w[  
select_statement v.Xmrry  
?]0bR]}y  
UNION [ALL] selectstatement B2,JfKk/  
b#:!b  
[UNION [ALL] selectstatement][…n] ^Kn:T`vB  
\0z<@)r+AJ  
其中selectstatement为待联合的SELECT查询语句。 W+#Zmvo  
7?2<W-n  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 _tfi6UQ&lY  
W" 1=K] B  
行。 VevDW }4q*  
KHoDD=O  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 "@rXN"4  
m =%yZ2F;  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 mh8)yy5\  
;b^"b{  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 FyA0"  
]gmkajCzD  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 xd^9R<  
og|~:>FmJo  
型,系统将低精度的数据类型转换为高精度的数据类型。 Kj* $'('  
YT)@&HaF  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: lVS.XQ2<  
D*!9K8<o  
查询1 UNION (查询2 UNION 查询3) %Sw hNn  
DTC OhUIV  
  m]/s R3yF  
M(<.f}yZQ  
  n4/Jx*  
hmJa1fw=  
三、连接查询 _yc &'Wq  
? 9;r|G  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 A(wuRXnVWK  
!k8j8v&  
数据库管理系统的一个标志。 M[?0 ^ FBx  
"sUmke-#  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 y\<\P8X  
Og(|bs!6  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 rIJd(=  
}N W01nee  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 LRv[,]b  
P#qQde/y  
查询。 jC L 1Bj  
<xr\1VjA  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 N m@UM*D  
/t_AiM,(  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 xRm~a-rp  
B^"1V{M  
SQL-92标准所定义的FROM子句的连接语法格式为: z460a[Wl  
Mtq^6`JJ'  
FROM join_table join_type join_table h|[oQ8)  
a<v!5\dq!  
[ON (join_condition)] d8M8O3  
oVeC@[U  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 +XL|bdK  
u51Lp  
个表操作的连接又称做自连接。 7/6%92T/B  
nSB@xP#&  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 BVv{:m{w  
'"J``=  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 RV_+-m{]  
9NausE40  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 =J^FV_1rJ  
v42Z&PO   
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ]xN)>A2  
P6u%-#  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 a,KqTQB  
b1-'q^M  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 )H- y  
nx@ h  
数据行。 p]J0A ^VV  
?eri6D,86w  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 Iz[wrtDI 1  
bSS=<G9  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 O@sJ#i>  
a_o99lP  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 z9HUI5ns  
eX <@qa4<  
运算符等构成。 oE'Flc.  
=x} p>#o,J  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 "&1h<>  
.?*TU~S  
连接。例如: s?_H<u  
ZMmf!cKY:'  
SELECT p1.pub_id,p2.pub_id,p1.pr_info Jn)DZv8?  
6G]hs gro  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 Kp%:\s,lO  
tqicyNL  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 7q'T,'[  
_4~q&? }V  
(一)内连接 dn:/8~B"X  
3Tz~DdB  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 jt6,id)&  
+<w\K*  
三种: TqTz  
n$y@a? al  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 C^nTLw;K  
($[)Tcq*~  
表中的所有列,包括其中的重复列。 s.XLC43Rs  
Y@Ti2bI`v  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 B%/N{i*Z  
@&GfCg5Cb  
运算符包括>、>=、<=、<、!>、!<和<>。 P%Tffsl  
Wtqv  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 GKa_6X_  
t BKra  
结果集合中所包括的列,并删除连接表中的重复列。 U$^$7g 3  
1eMz"@ Q9  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: >PoVK{&y  
C !6d`|  
SELECT *  @t<KS&  
uZ8^"  W  
FROM authors AS a INNER JOIN publishers AS p tW} At  
Kzrt%DA  
ON a.city=p.city L5A?9zum/!  
x$=""?dd  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): pDM95.6   
DE" Y(;S  
SELECT a.*,p.pub_id,p.pub_name,p.country gkL{]*9&%  
1cY,)Z%l #  
FROM authors AS a INNER JOIN publishers AS p <^fvTb&*  
sH /08Z  
ON a.city=p.city =w2_1F"  
N Ah^2X  
(二)外连接 ZCz#B2Sf8  
_Sn45h@"  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 @szr '&\%A  
J0,;F9<C#X  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 1 JB~G7  
ZOY zCc(d  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 w[Q)b()  
gPw{'7'U  
如下面使用左外连接将论坛内容和作者信息连接起来: klSAY  
SRek:S,  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b t$-!1jq  
,8Q&X~$rY  
ON a.username=b.username OGAC[s~V  
B8.uzX'p  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 6uKS!\EY|  
;cp,d~mrf  
SELECT a.*,b.* XG}9) fT  
R;`C;Rbf  
FROM city as a FULL OUTER JOIN user as b wi@Qf6(mn  
<zt124y-6  
ON a.username=b.username $#/f+kble  
] 8dzTEjk  
(三)交叉连接 ']DUCu  
.vWwYG  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 YK%rTbB(  
9#b/D&pX5  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 WWG+0jQ9  
h"t\x}8qq  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 vk.P| Y-;  
N Nw0 G&  
于6*8=48行。 8=,-r`oNy  
(qdvvu#E  
SELECT type,pub_name LGT?/ gup  
'ocPG.PaU  
FROM titles CROSS JOIN publishers = ow=3Ku  
<#~n5W{l  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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