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

[原创]SQL查询语句使用

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

一、简单查询 ececN{U/  
\kx9V|A'  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 J4 <*KL~a  
Nnw iH  
表或视图、以及搜索条件等。 ;uy/Vc5,Y  
-|5&3HVz  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 J$o J  
(;N_lF0  
SELECT nickname,email ~JJv 2  
*zcH3a,9"x  
FROM testtable `/O_6PQ}  
Nbda P{{  
WHERE name='张三' p|%)uA3'/  
JT+P>\\];'  
(一)选择列表 {<lV=0]  
N*#SY$!y  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 G(>a LF  
6*E 7}  
量和全局变量)等构成。 eM}Xn^}  
_F9 c.BH  
1、选择所有列 ;%}  
J{Jxb1:c  
例如,下面语句显示testtable表中所有列的数据: 4{TUoI6ii  
_z;N|Xe  
SELECT * @4pN4v8U  
chy7hPxC;  
FROM testtable )u$A!+fo  
btOC\bUMfD  
2、选择部分列并指定它们的显示次序 N^ )OlH  
YeQX13C"Z  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 &^Io\  
t0Uax-E(  
例如: Q["}U7j  
4D8q Gti  
SELECT nickname,email f`Nu]#i  
{,m!%FDL  
FROM testtable +q1@,LxN  
J<2N~$  
3、更改列标题 TUT>*  
E?V:dr  
在选择列表中,可重新指定列标题。定义格式为: 8r5j~Df  
WE3l*7<@  
列标题=列名 <H.Ml>q:r  
"2)T=vHi#  
列名 列标题 s<myZ T$  
(Q@+W |~  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 U;_ ;_  
g)zy^ aDf  
标题: Kxg09\5i  
MxYCMe4S[  
SELECT 昵称=nickname,电子邮件=email qz 'a.]{=  
Wl1%BN0>  
FROM testtable W!{uEH{%l  
`'~|DG}a  
4、删除重复行 /)|*Vzu  
#8'%CUF*<8  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 OHB!ec6W  
XG0,@Ly  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 2`; 0y M  
Y!KGJ^.mF  
5、限制返回的行数 b[$>HB_Na  
mesR)fTI  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ,E_hG3}}  
>q`G?9d2  
表示一百分数,指定返回的行数等于总行数的百分之几。 %P?W^mI  
`H\^#Zu  
例如: rHMsA|xz6  
t{$t3>p-t  
SELECT TOP 2 * VB Ce=<  
yCwQ0|  
FROM testtable | #,b1|af  
18Ty )7r'  
SELECT TOP 20 PERCENT * $ _ gMJ\{  
$]O\Ryf6  
FROM testtable :g Ze>  
&.d~ M1Mz  
(二)FROM子句 aFLm,  
JV@>dK8  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ce@(Ct  
q*2ljcb55  
它们之间用逗号分隔。 il*bsnwpZv  
)J 0'We  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 sx6` g;  
='~C$%  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 es.`:^A  
2lQ'rnqS)  
使用下面语句格式加以限定: ~(}zp<e|  
+_+}^Nf]Y3  
SELECT username,citytable.cityid R!:1{1  
x ha!.&DO  
FROM usertable,citytable .*8.{n5   
|[gnWNdR$M  
WHERE usertable.cityid=citytable.cityid |g@1qXO3  
hd\iW7  
在FROM子句中可用以下两种格式为表或视图指定别名: \i{=%[c  
E_FseR6  
表名 as 别名 TN&1C8xr  
mI}'8 .  
表名 别名 @L`t/OD  
qUCiB}  
例如上面语句可用表的别名格式表示为: GeE|&popO  
B;^7Yu0,  
SELECT username,b.cityid oSxHTbp?  
_,5(HETE2  
FROM usertable a,citytable b p 3X>  
#\w~(Nm-  
WHERE a.cityid=b.cityid Rf7py)  
DI+kO(S  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 -B R&b2  
*K!V$8k=99  
例如: Q&yfl  
QGfU:  
SELECT a.au_fname+a.au_lname LTrn$k3}  
--y .q~d  
FROM authors a,titleauthor ta I(pU_7mw  
P*G&pitT  
(SELECT title_id,title hb`(d_=7F  
$BCqz! 4K  
FROM titles Si!W@Jm  
koe&7\ _@  
WHERE ytd_sales>10000 \3x,)~m  
RoP z?,u  
) AS t 6Vi #O^>  
9;kWuP>k4u  
WHERE a.au_id=ta.au_id 'R= r9_%  
(eHvp  
AND ta.title_id=t.title_id <Cm:4)~  
)t0t*xu#  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 IeE+h-3p  
eo"6 \3z  
(三)使用WHERE子句设置查询条件 l1a=r:WhH  
.hnGHX  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 8\/E/o3  
JQ!D8Ut  
SELECT * bc%7-%  
$f_Brc:n {  
FROM usertable Wk`G+VR+  
taw #r  
WHERE age>20 \3Ys8umKq  
|0BmEF  
WHERE子句可包括各种条件运算符: 3Cq17A 9  
(',G Ako  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 9_oIAn:<  
o1 QK@@}  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… -_v[oqf$  
%=%jy  
NOT BETWEEN…AND… KR#Bj?fz-H  
jO3Z2/#  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) Q l ql(*  
> PfYHO  
NOT IN (项1,项2……) DM"`If%3j  
-&y{8<bu4H  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE  ]Ocf %(  
a'rN&*P  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL &H`yDrg6U  
yD(0:g#  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR mbU[fHyV  
&$|k<{j[<f  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Cj,fP[p#7  
ZI-)'  
2、列表运算符例:country IN ('Germany','China') USfOc  
Z'hW;^e%_z  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 r)q6^|~47  
j'I$F1>Te  
varchar、text、ntext、datetime和smalldatetime等类型查询。 Xb5n;=)  
h{VCx#!]  
可使用以下通配字符: P%(pbG-X.  
ZoF\1C ^  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 ^3F[^#"  
8tY],  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 rer=o S  
iE0A-;:5  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 y;3vr1?  
^;!A`t  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 G/bWn@  
5,|^4 ZA  
例如: JO1KkIV  
:TxfkicN\  
限制以Publishing结尾,使用LIKE '%Publishing' U_y)p Cd  
:;#Kg_bz  
限制以A开头:LIKE '[A]%' \&n]W\  
KzG8K 6wZ  
限制以A开头外:LIKE '[^A]%' W EZ(4ah  
s'J8E+&5  
4、空值判断符例WHERE age IS NULL SzMh}xDh2  
H@.j@l  
5、逻辑运算符:优先级为NOT、AND、OR A !x" *  
ym{?vY h  
(四)查询结果排序 ]@)X3}"!  
z ~T[%RjO  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: %DbL|;z1  
y!h$Z6.  
ORDER BY {column_name [ASC|DESC]} [,…n] xzbyar<  
OIe {Sx{y  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 )UO:J7K  
FU E/uh  
序。 OXK?R\ E+  
ZjF$zVk  
例如: ~ucOQVmz@  
.yd{7Te  
SELECT * 80x %wCY`  
0bVtku K;G  
FROM usertable FDkRfhK  
VX2 KE@  
ORDER BY age desc,userid ASC j]6 Z*AxQ  
(&=-o(  
另外,可以根据表达式进行排序。 e%afK@c  
x@;XyQq  
  .R#p<"$I  
`_N8A A  
二、联合查询 O$V 6QJ  
DvKM[z3j  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 'p80X^g  
{Nuwz|Ci  
合查询。UNION的语法格式为: Zm >Q-7r9  
[-x~Q[  
select_statement TxoMCN?7c  
.9#4qoM'  
UNION [ALL] selectstatement )O#]Wvr  
(_^g:>)Cs  
[UNION [ALL] selectstatement][…n] hc4<`W{  
b'pbf  
其中selectstatement为待联合的SELECT查询语句。 MMqkNe  
ZT5t~5W  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 Xp[[ xV|  
eu@-v"=w  
行。 O5CIK}A  
d+[yW7%J  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Cg?D<l4  
#'^!@+)  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 Oz# $x  
3;zJ\a.+  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选  ?}e8g  
Og4 X3QG  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 DN2K4%cM%'  
>_!pg<{,  
型,系统将低精度的数据类型转换为高精度的数据类型。 AU)"L_ i}  
R] tHd=kf  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: N)K};yMf  
E ~<SEA  
查询1 UNION (查询2 UNION 查询3) o3P`y:&  
Qr Dzf e[  
  :DXkAb2  
+AhR7R!  
  O8(;=exA  
I\&..e0l  
三、连接查询 q(M[ij  
.h~M&d!  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 qAUqlSP5  
P%z\^\p"5  
数据库管理系统的一个标志。 T^B&GgW  
}QU9+<Z[r  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 }L^Yoq]  
>"q0"zrN,  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ^hv  
.+t{o [  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ^W5rL@h_  
bo '  
查询。 6a[D]46y,2  
VO] Jvf  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 Q^$IlzG7i  
d/!sHr69  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 "IA[;+_"  
T8h.!Vef  
SQL-92标准所定义的FROM子句的连接语法格式为: C '4u+raq  
B$1nq#@  
FROM join_table join_type join_table <6Q]FH!6  
2+M(!FHfy  
[ON (join_condition)] -l+ &Bkf  
VI,z7 \  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 \[Op:^S  
i;;CU9`E2q  
个表操作的连接又称做自连接。 gV1&b (h  
4- ^|e  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ;2q;RT`h  
$)\%i=  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 vmK<_xbwd  
@ +h2R  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 I~\j%zD  
bAms-cXm  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) -%*>z'|{  
g6o-/A!Q3  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 *M\Qt_[  
!/znovoD  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 6e&Y%O'8  
]`0(^)U &  
数据行。 h@=H7oV7k  
q{@j$fMt0  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 xRpL\4cs  
M>P-0IC  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ;ZPAnd:pb  
.%_scNP  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 wUHuykF  
 Z+`mla  
运算符等构成。 S!A)kK+  
Zy,U'Dv  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 $j0] +vT  
QFU;\H/  
连接。例如: m:5*:Ii.  
I1^0RB{~  
SELECT p1.pub_id,p2.pub_id,p1.pr_info S1(. AI~  
]b4*`}\  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 k<wX??'  
vNlYk  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Iz,a Hrq  
p/>}{Q )Y  
(一)内连接 wcUf?`21,  
km,}7^?F0r  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 mV^+`GWvo  
I$xfCu  
三种: v/=O:SM}  
jCqs^`-  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 mj=$[ y(  
"]>JtK  
表中的所有列,包括其中的重复列。 9Xo'U;J  
g#ubxC7t<  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ^eQK.B(  
o7S,W?;=5  
运算符包括>、>=、<=、<、!>、!<和<>。 <^6|ZgR  
%>`0hk88  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 <\eHK[_*  
^]o]'  
结果集合中所包括的列,并删除连接表中的重复列。 jv<BGr=4;  
O&!>C7  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: S~0 mY} m  
Ta`=c0  
SELECT * YbB8D-  
J5h;~l!y  
FROM authors AS a INNER JOIN publishers AS p -twV?~f  
rU`#3}s  
ON a.city=p.city [U@#whEO  
unKTa*U^q  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): |_/q0#"  
y3 @R>@$  
SELECT a.*,p.pub_id,p.pub_name,p.country :\9E%/aAD  
sYM3&ikyHI  
FROM authors AS a INNER JOIN publishers AS p DcaVT]"  
O`5PX(J1&  
ON a.city=p.city Sx?IpcPSm  
jR`q  y<  
(二)外连接 }D/0&<1  
++D-,>.  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 \L}aTCvG  
&+;z`A'|8  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 vggyQf%  
<gRv7 ?V[z  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ysm)B?+k  
ku3Vr\s  
如下面使用左外连接将论坛内容和作者信息连接起来: <o,]f E[  
=u W+>;]  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b .)~IoIW=  
URS6 LM  
ON a.username=b.username p9rnhqH6  
I!3qb-.Q  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: #8iRWm0*6  
"4"gHs  
SELECT a.*,b.* d?^bCf+<  
{eA0I\c(C  
FROM city as a FULL OUTER JOIN user as b @T[}] e  
nylrF"'e  
ON a.username=b.username mlc0XDS%  
Rl90uF]8  
(三)交叉连接 (4=NKtA^G  
9gR@Q%b)  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 1eQa54n  
C1_':-4  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 1uBnU2E  
MLg+ 9y  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 p+#$S4V  
:@# '&(#~  
于6*8=48行。 c+$alw L~  
O& k+;r  
SELECT type,pub_name ]pr(hk  
5<h7+ %?t9  
FROM titles CROSS JOIN publishers ovJwo r  
7.7P>U  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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