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

[原创]SQL查询语句使用

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

一、简单查询 QpJ IDM/  
#:I^&~:  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 2;}xN!8  
&m4f1ZO*  
表或视图、以及搜索条件等。 l]>!`'sJL  
-s33m]a;  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ZR2\ dH*  
m&ZJqsZIL  
SELECT nickname,email R/rcXX7%  
9Q=>MOB-  
FROM testtable ^T+<!k  
1sMV`qv>  
WHERE name='张三' !,R  
8z0Hx  
(一)选择列表 /t5g"n3  
9?!u2 o  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 F*. /D~K  
\CDAFu#  
量和全局变量)等构成。 P 4H*jy@?  
`43vxcMg  
1、选择所有列 uzO {{S-  
% dYI5U89  
例如,下面语句显示testtable表中所有列的数据: k|fh\F+$  
Q>V?w gZ  
SELECT * VAt>ji7c  
TftOYY.hQ  
FROM testtable i(z+a6^@|  
iPz1eUj  
2、选择部分列并指定它们的显示次序 R'r|E_  
R rxRa[{Z  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 ^|r`"gOJ3  
{#0Tl  
例如: t3 K>\ :  
2-PI JO  
SELECT nickname,email @_(nd57oSs  
EI<"DB   
FROM testtable R:BBF9sK?  
KZi+j#7O  
3、更改列标题 H]U "+52h  
$=7H1 w  
在选择列表中,可重新指定列标题。定义格式为: j#CuR7m  
s^obJl3  
列标题=列名 I? A~zigO  
7/ 4~>D&-b  
列名 列标题 RlPjki"Mg  
l(.7t'  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 :S#eg1y.w]  
ADTU{6UPS  
标题: W;5N04ko  
TjT](?'o  
SELECT 昵称=nickname,电子邮件=email  I8:"h  
"[Yip5  
FROM testtable 1o(+rR<h9  
,I("x2  
4、删除重复行 bL+sN"Km  
NuHL5C?To  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 LZbRQ"!!o  
gq=0L:  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 Ni&,g  
So0`c,D  
5、限制返回的行数 _Wq7U1v`  
4;08n|C  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ='KPT1dW*  
bn5"dxV  
表示一百分数,指定返回的行数等于总行数的百分之几。 9tW3!O^_  
(69kvA&|q  
例如: O2/%mFS.  
H 3W_}f  
SELECT TOP 2 * x/pC%25  
gX/|aG$a!U  
FROM testtable [''=><  
Mf!owpW T  
SELECT TOP 20 PERCENT * ,^Ex}Z  
))c*_n  
FROM testtable bBd*}"v^"  
RJQ/y3  
(二)FROM子句 rD_Ss.\^g  
ytg7p5{!i  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, .0 rJIO  
c"6Kd$?M  
它们之间用逗号分隔。 $XU-[OF%:9  
^!N;F"  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 Vx0MG{vG1  
A)=X?x  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 @oUf}rMiDa  
Lx9hq7<  
使用下面语句格式加以限定: tW'qO:y+  
'&rw=.cU  
SELECT username,citytable.cityid "-G.V#zI  
NHst7$Y<  
FROM usertable,citytable >?H_A  
:0i#=ODR  
WHERE usertable.cityid=citytable.cityid wI|bBfd(  
\UV T_=Y  
在FROM子句中可用以下两种格式为表或视图指定别名: F0DPS:c  
b#bO=T$e-  
表名 as 别名 89 _&X[X  
#MmmwPB_  
表名 别名 J$o[$G_Z  
JI28}Cxs0  
例如上面语句可用表的别名格式表示为: {'cs![U  
FZ;Y vdX6  
SELECT username,b.cityid h+\$ Z]  
Ke'YM{  
FROM usertable a,citytable b EfMG(oI  
`K1PGibV  
WHERE a.cityid=b.cityid U`},)$  
',v0vyO8  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 h9@gs,'   
s2,`eV  
例如: Py(wT%w  
sIP6GWK$  
SELECT a.au_fname+a.au_lname D| 3AjzW  
?#');`  
FROM authors a,titleauthor ta oZ|{J  
w+:+r/!g  
(SELECT title_id,title #)Id J]  
f?oI'5R41  
FROM titles B$iMU?B3  
fh/)di  
WHERE ytd_sales>10000 ~cWLu5  
y0W`E/1t  
) AS t 0hEF$d6U  
-M(58/y  
WHERE a.au_id=ta.au_id @DjG? yLK$  
~XN]?5GQf  
AND ta.title_id=t.title_id !YuON6{)  
qX}dbuDE"P  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 `0/gs  
c;A ew!  
(三)使用WHERE子句设置查询条件 O;.d4pO(tC  
I+-Rs2wb  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: IrVM|8vT3  
vwSX$OZ  
SELECT * iyHp$~,q?t  
vM$#m1L?  
FROM usertable Xqq?S  
9 ;! uV>-H  
WHERE age>20 pD)/- Dgdm  
W"DxIy  
WHERE子句可包括各种条件运算符: JN9HT0  
w^vK7Z 1$  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 0o\=0bH&s  
J0{WqA.P  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… a-o hS=W  
2gNBPd)I  
NOT BETWEEN…AND… tF)k6*+  
~=aI2(b  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) s;=J'x)~%  
%E=,H?9&>  
NOT IN (项1,项2……) c9F[pfi(  
3vEjf  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ~S~x@&yR  
ESXU, qK]v  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ui:>eYv  
ff2.| 20  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR kgib$t_7  
aF_ZV bS  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 y0Q/B|&[  
CMD`b  
2、列表运算符例:country IN ('Germany','China') x#!{5;V&K  
:D)&>{?  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 tue%L]hc  
bU@>1>b6lE  
varchar、text、ntext、datetime和smalldatetime等类型查询。 RI< Yg#   
~P.-3  
可使用以下通配字符: 4h0jX 9  
88X*:Kf?:  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 )QJU ]G  
}][|]/s?42  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 "#"Fp&Z7  
0zk T8'v  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 d}A2I  
vo^9qSX f  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 "Ezr-4  
Ny&Fjzl  
例如: %.Q2r ?j  
sfBjA  
限制以Publishing结尾,使用LIKE '%Publishing' +xu/RY_  
w[n>4?"{  
限制以A开头:LIKE '[A]%' |<o>$;mZ  
8;dbU*  
限制以A开头外:LIKE '[^A]%' \/e*quxx  
wh[:wE]eX  
4、空值判断符例WHERE age IS NULL 8Nl|\3nl-  
J7aK3 he  
5、逻辑运算符:优先级为NOT、AND、OR ^_"q`71Dk  
hSf#;=9'  
(四)查询结果排序 $9u  
xWI 0s;k  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: s9Q)6=mE  
%BP)m(S7  
ORDER BY {column_name [ASC|DESC]} [,…n] OrqJo!FEg{  
2$/gg"g+  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 dJ"xW; "  
{83He@  
序。 1*Fvx-U'  
X +  
例如: ;ZW}47:BS6  
m"> =QP  
SELECT * 7XI4=O};&%  
5@r Zm4U  
FROM usertable fbbl92p  
i)^ZH#G p  
ORDER BY age desc,userid ASC | 3/p8  
Bv|9{:1%X}  
另外,可以根据表达式进行排序。 -JW6@L@  
.j$bCKXGx  
  M:q ;z(  
""KN?qh9  
二、联合查询 Xcpm?aTo  
}(7QJk5 j  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 2\8\D^   
g(F*Y> hk  
合查询。UNION的语法格式为: h],%va[  
7)8}8tY^{  
select_statement /8-VC"  
2dlV'U_g  
UNION [ALL] selectstatement 4I[FE;^  
E3C[o! 5  
[UNION [ALL] selectstatement][…n]  ` :  
g"AfI  
其中selectstatement为待联合的SELECT查询语句。 blkJm9]v  
^+l\YB7pD  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ?01""Om   
>WS& w;G  
行。 wk 7_(gT`0  
h+d;`7Z>  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 g.sV$.T2K  
cg5{o|x  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 uNGxz*e  
'|R@k_nx  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 xW ZcSIH!  
80" =Qu{s  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Br$PL&e~  
u! FSXX<  
型,系统将低精度的数据类型转换为高精度的数据类型。 )h!l%72  
gd,%H@3  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: !rqR]nd  
l,2z5p  
查询1 UNION (查询2 UNION 查询3) 9@a;1Wr/f  
~O7(0RsCN  
  U@AfRUF&  
w+(wvNmNEK  
  NjyIwo0  
<;Z3 5 {  
三、连接查询 (#"s!!b  
m8A_P:MQq  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 aw~EK0yU   
ZvKMRW  
数据库管理系统的一个标志。 /'_ RI  
/6*.%M>r  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 #\["y%;W  
^<Tp-,J$EN  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 G&H"8REm  
QYb?;Z  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 e%Xf*64  
j7 3@Yi%  
查询。 PGhZ`nl  
!27]1%Aw  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 U: jf9L2  
k0uwG'(z9  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 oKJ7i,xT  
<|G~S<y}  
SQL-92标准所定义的FROM子句的连接语法格式为: J0! E@   
#iDFGkK/  
FROM join_table join_type join_table ! HC<aWb  
|;-r};  
[ON (join_condition)] L2$L.@  
sYP@>tHC  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 MW>28  
j]D =\  
个表操作的连接又称做自连接。 ,F Vy:"FR  
W+S; Do  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 0l@+xS;  
lM%fgyX  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 -B(KQT,J  
>D#}B1(!  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 X1dG'PQ  
PCfs6.*5Mf  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) X($SBUS6  
zL}hFmh  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 1y;zPJ<ntm  
"A+F&C>  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 Y@Y(;C"SW  
;O11)u?/s|  
数据行。 u.FDe2|[)  
_?c.3+;s  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 r2'rf pQ  
n"Vd"}sU.  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 T$;XJx  
Q0_W<+`  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 =lD]sk  
34:EpZO@  
运算符等构成。 0M98y!A 5^  
a $%[!vF  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 uy:=V }p  
<J`xCm K  
连接。例如: elB 8   
Zw{tuO7}K  
SELECT p1.pub_id,p2.pub_id,p1.pr_info ptQ (7N  
p2(_YN;s  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 LTct0Gh  
db~:5#*  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) /vMyf),2  
XCriZ|s  
(一)内连接 3~la/$?p0  
b15qy?`y  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 j #YFwX4.  
J@iN':l-  
三种: 3Q)>gh*  
V5 r7eC  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 6Qu*'  
FM[To  
表中的所有列,包括其中的重复列。 RY< b]|  
?Fpl.t~  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 18`%WUPnT  
E%B Gf}h  
运算符包括>、>=、<=、<、!>、!<和<>。 SqB|(~S  
D0i30p`  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 +Bfi/>  
}C.{+U  
结果集合中所包括的列,并删除连接表中的重复列。 =rF8[Q0K  
[+z:^a1?V  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: V}-o): dI|  
-~f.>@Wb  
SELECT * Y cpO;md  
1}*;  
FROM authors AS a INNER JOIN publishers AS p jRAL(r|  
0g-ESf``{n  
ON a.city=p.city q(Q9FonU  
1bkUT_  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): T@.D5[q0:  
"mK (?U!A  
SELECT a.*,p.pub_id,p.pub_name,p.country SI5QdX  
Bx4GFCdifC  
FROM authors AS a INNER JOIN publishers AS p ]E^f8s0#V  
n`xh/vGm#  
ON a.city=p.city E2D8s=r  
qw1J{xoHW  
(二)外连接 AAgA]OD,  
>oDP(]YGg  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 xS1|Z|&  
e]?S-J'z  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 f*Js= hvO  
_9r{W65s  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ^j}sS!p  
{m:R v&T  
如下面使用左外连接将论坛内容和作者信息连接起来: / u6$M/Cf>  
926oM77  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b a*y mBGF  
yfQE8v+  
ON a.username=b.username *'-^R9dN.S  
H_nJST<v`  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: ts>}>}@vc  
"s9gQAoaO  
SELECT a.*,b.* V}+;b bUc-  
Y'1V(5/&  
FROM city as a FULL OUTER JOIN user as b yG$@!*|  
 ?Nql7F4  
ON a.username=b.username FoCkTp+/  
%$| k3[4V  
(三)交叉连接 ZRGZ'+hw  
7!w nx.  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 8Oh3iO  
I3Xh[% -!  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 v"~I( kf$  
XtdLKYET  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 S]O Hv6  
,>v9 Y#U  
于6*8=48行。 %[m1\h"1  
_!p3M3"$B  
SELECT type,pub_name ~1sl.8tF  
A"iD4Q  
FROM titles CROSS JOIN publishers $uynW3h  
u6T?oK9j  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五