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

[原创]SQL查询语句使用

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

一、简单查询 KNd<8{'.  
3oMHy5  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Q N#bd~  
j]<K%lwp  
表或视图、以及搜索条件等。 B5|\<CF  
}UB@FRPF  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 H(K PU1lDw  
PC<_1!M]  
SELECT nickname,email ;-kDJ i  
/B~[,ES@1  
FROM testtable J:glJ'4E  
]4en |Aq  
WHERE name='张三' n"6L\u  
Z%B6J>;uM  
(一)选择列表 X(*O$B{ R  
YnU)f@b#  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 T!KwRxJ23  
CCe>*tdf  
量和全局变量)等构成。 |&rCXfC  
][v]Nk  
1、选择所有列 LrbD%2U$j5  
)j>U4a  
例如,下面语句显示testtable表中所有列的数据: ;VAyH('~  
60u_,@rV  
SELECT * 2*V[kmD/3  
#xw*;hW<  
FROM testtable !h7.xl OpN  
iP"sw0V8  
2、选择部分列并指定它们的显示次序 +|,4g_(j  
XgHJ Oqt  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 X]D,kKasG  
DI{*E  
例如: 9"]#.A^Q*  
ucx02^uA  
SELECT nickname,email }}QR'  
@|vH5Pi  
FROM testtable }\?9Prsd  
x'I!f? / &  
3、更改列标题 </`\3t  
+K`A2&F9  
在选择列表中,可重新指定列标题。定义格式为: ~s'tr&+  
4A!]kj 5T  
列标题=列名 jTcv&`fAz  
X&?s:A  
列名 列标题 n%7?G=_kj  
lnyfAq}w  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ()?83Xj[c  
LsuOmB|^  
标题: J4"Fj, FS  
fyb;*hgu  
SELECT 昵称=nickname,电子邮件=email lt&(S)  
SULFAf<  
FROM testtable +wmG5!%$|  
P8,Ps+  
4、删除重复行 4>>=TJ!M  
ezp%8IZ;  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ^0OP&s;"  
lbBWOx/|  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 }Ze*/ p-  
LD}~]  
5、限制返回的行数 c_D(%Vf5  
_b~{/[s  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 @I`^\oJ  
hDW!pnj1  
表示一百分数,指定返回的行数等于总行数的百分之几。 |j`73@6   
nOGTeKjEJ  
例如: jRS{7rx%MH  
#;j:;LRU  
SELECT TOP 2 * WI/tWj0  
<Kv$3y  
FROM testtable 7PX`kI  
, ,{UGe 3  
SELECT TOP 20 PERCENT * 73D< wMgZF  
Ic0Y  
FROM testtable WQ.0}n}d  
1*TbgxS~W  
(二)FROM子句 F+V!p4G  
L>h8>JvQ  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, nTEN&8Y>R  
Gs,:$Im  
它们之间用逗号分隔。 -SrZ^  
F^ 75y?  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 0 Uropam  
o3fc-  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 3 c=kYcj  
00QJ596  
使用下面语句格式加以限定: KkA)p/  
@i1e0;\  
SELECT username,citytable.cityid &Vz$0{d5  
tNi>TkC}`  
FROM usertable,citytable `x9Eo4(/  
J, 9NVw$  
WHERE usertable.cityid=citytable.cityid 9Ux(  
MYWkEv7  
在FROM子句中可用以下两种格式为表或视图指定别名: _{Kmj,q  
Cku"vVw,  
表名 as 别名 -)`_w^Ox  
5QMra5Nk  
表名 别名 J +u}uN@  
XVYFyza;  
例如上面语句可用表的别名格式表示为: @Nek;xJ  
4N,mcV  
SELECT username,b.cityid   EO&Q  
$oK&k}Q  
FROM usertable a,citytable b *|fF;-#v  
!qt2,V  
WHERE a.cityid=b.cityid * j%x  
mH'~pR>t  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 `<C<[JP:o  
9{toPED  
例如: 6Yj{% G  
lM6pYYEq=  
SELECT a.au_fname+a.au_lname Gmz^vpQ]t  
0@ Y#P|QF  
FROM authors a,titleauthor ta l#'V SFm&  
to'7o8Z  
(SELECT title_id,title #Vq9 =Q2  
BNu >/zGpB  
FROM titles 0ns\:2)cEB  
a#YK1n[!  
WHERE ytd_sales>10000 zfeT>S+  
dZU#lg  
) AS t iVXt@[  
^,>w`8  
WHERE a.au_id=ta.au_id o|kykxcq  
P0m3IH)  
AND ta.title_id=t.title_id xh;V4zK@`  
)>iOj50n3  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 FZr/trP~  
ZSC*{dD$E  
(三)使用WHERE子句设置查询条件 :!%VSem  
Z[oF4 z   
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: -K64J5|b7  
m9 h '!X<  
SELECT * > N~8#C  
f!9i6  
FROM usertable b2m={q(s  
Zse&{  
WHERE age>20 /Nf{;G!kg  
;w7mr1  
WHERE子句可包括各种条件运算符: i+Z)`  
O$,F ga  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 7*!7EBb  
95l)s],  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 1)ue-(o5  
uE-(^u  
NOT BETWEEN…AND… <RGH+4LF  
sTM;l,  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) T6U/}&{O  
S /hx\TzC  
NOT IN (项1,项2……) ;M:AcQZ|_  
No^gKh24  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE `2mddx8  
x< A-Ws{^V  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL -NBVUUAgN  
p['RV  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR U'fP  
s^h@b!'7  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ar 3L|MN  
"rv~I_zl  
2、列表运算符例:country IN ('Germany','China') aZOn01v;!&  
Pq;OShU_  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 SH%NYjj  
Y{YbKKM  
varchar、text、ntext、datetime和smalldatetime等类型查询。 2HE@!*z9H  
Pe`(9&iT.  
可使用以下通配字符: C8U3+ s  
T+kV~ w{  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 fkA+:j~z_  
mq`/nAmt  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 "4N&T#  
1[%3kY-h  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 ?:(y  
=8AT[.Hh  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 &@0~]\,D7  
n5:uG'L\  
例如: )l3Uf&v^f  
>>U>'}@Q  
限制以Publishing结尾,使用LIKE '%Publishing' LOh2eZ"n  
'!HTE` Aj  
限制以A开头:LIKE '[A]%' po| Ux`u  
`2lS@  
限制以A开头外:LIKE '[^A]%' n6/Ous  
(Ou%0 KW  
4、空值判断符例WHERE age IS NULL  ;Shu  
lA^1}  
5、逻辑运算符:优先级为NOT、AND、OR _D '(R  
l/.{F;3F  
(四)查询结果排序 EL 5+pt  
u#0snw~)/  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ]}2)U  
acd[rjeT  
ORDER BY {column_name [ASC|DESC]} [,…n] A;oHji#*  
ci0A!wWD  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Q]ersA8 V>  
|Y9>kXMl  
序。 F.9}jd{  
hZ&KE78?  
例如: @@65t'3S  
+7_qg i7:  
SELECT * iC"iR\Qu  
){^J8]b7#  
FROM usertable WtT;y|W  
8=8 hbdy;  
ORDER BY age desc,userid ASC &7L7|{18  
@X==[gQ  
另外,可以根据表达式进行排序。 Q:}]-lJg  
MpV<E0CmE  
  0SQ!lr  
~ao:9 ynY  
二、联合查询 !~ox;I}S  
>3 o4 U2  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 p~D}Iyww1_  
djd/QAfSC  
合查询。UNION的语法格式为: PDNl]?  
b1&tk~D  
select_statement fvu{(Tb  
]Q^)9uE\D  
UNION [ALL] selectstatement !/FRL<mp  
7=^{~5#  
[UNION [ALL] selectstatement][…n] Gm~([Ln{  
ohx[_}xN  
其中selectstatement为待联合的SELECT查询语句。 ?nU<cxh  
n]%- 2`}(  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 TW|K.t@5#H  
VkQ@c;C  
行。 [+ud7l  
$8tk|uh  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 (s};MdXIz  
,AP&N'  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 o Pe|Gfv\G  
x#1 Fi$.  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 `#""JTA"  
[doEArwn  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 s68(jYC7[  
X\^V{v^-  
型,系统将低精度的数据类型转换为高精度的数据类型。  wJp<ZL  
xS*UY.>  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: u]p21)m$x  
-3Kh >b)  
查询1 UNION (查询2 UNION 查询3) 6o't3Peh  
sSM"~_y\  
  l;-Ml{}|0  
t7=D$ua  
  2Tp2{"sB>A  
S?~0)EXj(  
三、连接查询 gx&es\  
>eJ <-3L;  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 1J?v\S$ma`  
RGW@@  
数据库管理系统的一个标志。 'I[?R&j$G  
fdl.3~.C  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 uwe#& V-  
H:fKv7XL  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 ;ALWL~Xm  
ddHl&+G  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 AA\a#\#Z3  
dN8Mfa)  
查询。 H& |/|\8F  
%>KbaM1b  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 pMfb(D"  
H0l1=y  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 HNzxF nh  
q*I*B1p[m  
SQL-92标准所定义的FROM子句的连接语法格式为: c 1YDln  
"@Vyc6L  
FROM join_table join_type join_table [F-R*}&x  
Tzq@ic#!B  
[ON (join_condition)] F8pA)!AH  
t"=5MaQk-  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 )+ .=z  
yRXML\Ge  
个表操作的连接又称做自连接。 mjeJoMvN)H  
b3A0o*  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 #g{R+#fm  
Yy*=@qu>g  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 fi?4!h  
DbGS]k<$  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 GJ9>i)+h;  
yD+4YD  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 0Lo8pe`DH  
 .NOAp  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 :i.@d?  
L(y70T  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 \|=6<ZY:  
oe<i\uX8z  
数据行。 [LoQYDku  
HP# SR';E  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 o1AbB?%=  
l=DF)#>w  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 B+W7zv  
oE ' P  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 10S I&O  
?I+L  
运算符等构成。 ^Jp T8B}  
^exU]5nvz  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 us.#|~i<h  
C4+DZ<pE  
连接。例如: gN/<g8  
C;W@OS-;  
SELECT p1.pub_id,p2.pub_id,p1.pr_info OBi(]l}^O  
JFT$1^n  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 z; GQnAG@  
g=Z52y`N<  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) 25>R^2,LiE  
* %D_\0;  
(一)内连接 %"WENa/t  
;cMQ 0e  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 Oeh A3$|#  
7FC!^)x1  
三种: VLXA6+  
ddQ+EY@!  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 wJC[[_"3 I  
D$l!lRu8+L  
表中的所有列,包括其中的重复列。 sq|\!T  
Kg%9&l  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 P:{Aq n~zR  
WvfP9(-  
运算符包括>、>=、<=、<、!>、!<和<>。 (*S<2HN5  
Am, {Fj  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 1T!o`*  
A \/~u"Y  
结果集合中所包括的列,并删除连接表中的重复列。 A@V$~&JCL5  
g,,wG k  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: ?fxM 1<8  
g+#<;Gbpe  
SELECT * h>pu^ `hk  
:-?ZU4)  
FROM authors AS a INNER JOIN publishers AS p Tg{5%~L]   
#/oH #/?  
ON a.city=p.city Kd:l8%+  
%o?)`z9-  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): r=Xo;d*TE  
ebBi zc=  
SELECT a.*,p.pub_id,p.pub_name,p.country r8 9o  
#b^6>  
FROM authors AS a INNER JOIN publishers AS p UarLxPQ  
T]th3*  
ON a.city=p.city '+9<[]  
DzVCEhf  
(二)外连接 VrIN.x  
<^YvgQ,m  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 Yq ]sPE92  
1jKpLTSs  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 m.D8@[y  
aE~T!h  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 N<Sl88+U  
a>47k{RSzE  
如下面使用左外连接将论坛内容和作者信息连接起来: m.lR]!Y=w  
;W- A2g  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 2 7)If E  
505c(+  
ON a.username=b.username a2P)@R  
NjIPHM$g  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: =Kj{wA O  
B $u/n  
SELECT a.*,b.* _=HaE&  
)U~|QdZ  
FROM city as a FULL OUTER JOIN user as b W&hW N9iR  
wUaWF$~y  
ON a.username=b.username #Th)^Is  
.i*oZ'[X  
(三)交叉连接 &~*](Ma  
(WHg B0{  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 OlT8pG5Oa  
k'8tcXs  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 F\eQV<  
/9br&s$B  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 r^m&<)Ca  
r D@*xMW  
于6*8=48行。 a3 }V/MY  
gvI!Ice#  
SELECT type,pub_name l`"?K D  
bTJ<8q  
FROM titles CROSS JOIN publishers p8'$@:M\  
^6 wWv&G[8  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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