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

[原创]SQL查询语句使用

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

一、简单查询 HZQI|  
\Y9=d E}  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 #py7emu  
NQfIY`lt'  
表或视图、以及搜索条件等。 ?l,i(I  
=Ak>2  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 (p} N9n$  
B^Ql[m&5+  
SELECT nickname,email 5d}PrYa  
-lL*WA`  
FROM testtable mS~3QV  
! # tRl  
WHERE name='张三' n E-=7S L  
qw87B!D  
(一)选择列表 N 5/TV%u  
_;01/V"q6  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 d; #9xD'  
=|3 L'cDC  
量和全局变量)等构成。 #<'/s qL  
%n}.E30 4  
1、选择所有列 P >N\q  
s* 9tWSd  
例如,下面语句显示testtable表中所有列的数据: uFdSD  
4kXx(FE  
SELECT * flLmZ1"  
,A6*EJ\w   
FROM testtable r~s03g0  
3C,e>zE}  
2、选择部分列并指定它们的显示次序 Xkv>@7ec  
* n!0  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 30H:x@='9  
7DYD+N+T  
例如: !Rb7q{@>  
3al5Vu2:  
SELECT nickname,email b1*6)  
-nk%He  
FROM testtable Y6N+,FAk+J  
+H<%)Lk J  
3、更改列标题 %!.rP  
5Rec}H  
在选择列表中,可重新指定列标题。定义格式为: 19# )# n^  
JR<R8+@g_  
列标题=列名 0N T3  
uk'<9g^  
列名 列标题 ^cAJCbp7  
~r>UjC_ B:  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 1$Hf`h2  
L0_=R;.<  
标题: '\_)\`a|  
3o^V$N.  
SELECT 昵称=nickname,电子邮件=email ZRQPOy  
7I44BC*R~  
FROM testtable x< 3vA|o  
x4( fW\  
4、删除重复行 ih;TQ!c+b  
uBMNkN8  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 O~Fk0}-  
=& lYv  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 k m|wB4  
``z="oD  
5、限制返回的行数 'K"*4B^3  
:|A db\b  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是  nm~  
6FmgK"t8  
表示一百分数,指定返回的行数等于总行数的百分之几。 uJ y@  
ge?ymaU$a  
例如: }wb;ulN)  
enr mjA&3  
SELECT TOP 2 * e/3hb)#;  
|S}*M<0  
FROM testtable j w462h  
K;ML'  
SELECT TOP 20 PERCENT * n%0vQ;Z1  
CKur$$B  
FROM testtable %jf gncW  
c8s/`esA  
(二)FROM子句 !Ch ya  
y$"L`*W  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, /Rz,2jfRx'  
8UcT? Zp  
它们之间用逗号分隔。 /W>"G1)  
KAzRFX),  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 iau&k `b`  
5`DH\VD.j  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 OY#_0p)i  
c 1GP3  
使用下面语句格式加以限定: "F}Ip&]hAG  
~k(Ez pn#  
SELECT username,citytable.cityid /{va<CL  
bW|y -GM  
FROM usertable,citytable jYF3u0 )  
u2Obb`p S  
WHERE usertable.cityid=citytable.cityid J#]y KgT  
"lZ<bG  
在FROM子句中可用以下两种格式为表或视图指定别名: &O,$l3 P  
g1|c?#fwo  
表名 as 别名 :JIPF=]fc  
QAwj]_  
表名 别名 M[{:o/]<  
y|se^dn  
例如上面语句可用表的别名格式表示为: }"Cn kg  
NZ5~\k  
SELECT username,b.cityid -EaZ<d[|0  
(c2\:hvy  
FROM usertable a,citytable b eV0S:mit  
U;@jl?jnG  
WHERE a.cityid=b.cityid bg}77Y'^  
^ym{DSx  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 4vS!99v)  
J.l%H U  
例如: bn35f<+  
?g4|EV-56  
SELECT a.au_fname+a.au_lname Rp*t"HSaAW  
}0RFo96) v  
FROM authors a,titleauthor ta )}!'VIe^!  
*Rh .s!@4  
(SELECT title_id,title  )S;ps  
dCTpO  
FROM titles *Mc\7D  
5#\p>}[HG  
WHERE ytd_sales>10000 F4%[R)  
x?'%  
) AS t % cdP*  
V2%wb\_z  
WHERE a.au_id=ta.au_id o7XRa]O  
=_J<thp  
AND ta.title_id=t.title_id -%l, Zd9  
);DIrA  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。  eb@Lh!  
J)|K/W9  
(三)使用WHERE子句设置查询条件 0 _}89:-  
@ -d4kg  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: [frD L)  
_PXo'*j  
SELECT * 12xP)*:$  
r.^X>?  
FROM usertable \Pmk`^T  
/,Id_TTCO  
WHERE age>20 [+,U0OV,  
jdf)bO(9#  
WHERE子句可包括各种条件运算符: rxp9B>~  
4(GgaQFO?  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< RyWOiQk;  
!DL53DQ#  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… 1|w:xG^  
6XK`=ss?  
NOT BETWEEN…AND… Atq2pL"  
A;a(n\Sy  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) 0a 6z "K}  
]mo<qWRc>p  
NOT IN (项1,项2……) T)tHN#6I  
P\6T4s  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ={@ @`yP^$  
u!Nfoq&'u  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL i=H>D  
LEnP"o9ZW  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR ||ZufFO  
`4$Qv'X*  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 D)7$M]d%  
^_h7!=W  
2、列表运算符例:country IN ('Germany','China') JgKZ;GM:W  
 Is6 _  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 ,W8Iabi^  
64rk^Um  
varchar、text、ntext、datetime和smalldatetime等类型查询。 aa%&&  
l%U_iqL&  
可使用以下通配字符: (Cd{#j<  
15T[J%7f  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 EQOP?>mWx!  
[67E5rk-  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 >AX~c jo  
bKJ7vXC05  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 x`6^+>y^  
4'hcHdL9   
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 !5SQN5K  
I&fh  
例如: pvQK6r  
=>z tBw\  
限制以Publishing结尾,使用LIKE '%Publishing' Y0fO.k#C^  
ytV)!xe  
限制以A开头:LIKE '[A]%' $EGRaps{j>  
V;hwAQbF  
限制以A开头外:LIKE '[^A]%' ._MAHBx+G  
9}jq`xSL  
4、空值判断符例WHERE age IS NULL CL'Xip')T  
=Pb5b6Y@6  
5、逻辑运算符:优先级为NOT、AND、OR zPh\3B  
Q$h:[_v  
(四)查询结果排序 SM /ykk  
5+/b$mHZX  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: X})Imk7&E  
" $IXZ  
ORDER BY {column_name [ASC|DESC]} [,…n] !MJe+.  
KA-/k@1&  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 )x8;.@U  
H1%[\X?=  
序。 uQu/(5  
^L-w(r62<  
例如: ^2C /!Y<  
$S=~YzO  
SELECT * 4]aiT8))  
pba8=Z  
FROM usertable h#m:Y~GoF  
95^i/6Gl!P  
ORDER BY age desc,userid ASC Z2rzb{oS}  
bH\C5zt6(  
另外,可以根据表达式进行排序。 hP1 l v7P  
 Vp] D  
  I!@s6tG  
K4k~r!&OU  
二、联合查询 z{@R.'BD  
45+%K@@x  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 /j' B\,  
6mu<&m@  
合查询。UNION的语法格式为: .;HIEj zq  
-!|WZ   
select_statement cZgMA8 F  
)W`SC mr]  
UNION [ALL] selectstatement }{5mH:  
Q'|0?nBOY  
[UNION [ALL] selectstatement][…n] ^IVe[P'  
+:>JZ$  
其中selectstatement为待联合的SELECT查询语句。 ^KkRF":  
V\6(d  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 ;NH~9# t:  
}qiF^D}  
行。 JAlU%n?R  
]am~aJ|L  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 Re*|$r#  
' :\fl.b  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 y !<'rg  
_)KY  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 3ar=1_Ar  
2'wr={>W  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 2yln7[a  
EJZ@p7*Oj  
型,系统将低精度的数据类型转换为高精度的数据类型。 Q !9HA[Ly  
&:V@2_6"  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: Mo}H_8y  
FUaI2  
查询1 UNION (查询2 UNION 查询3) 60GFVF]'2  
JbE?a[Eg?  
  E@w[&#  
[J0*+C9P*  
  [kbC'Eh*  
GS\%mPZ  
三、连接查询 j2|XD Of  
aje^Z=]  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 8> UKIdp  
%O#)Nq>mp  
数据库管理系统的一个标志。 I4)Nb WQ  
AG]W O8f)  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 K7IyCcdB  
l8z%\p5cR  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 /7bw: h;  
u(W^Nou/+  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 R0%?:! F  
[#p&D~Du&  
查询。 hM~eJv  
{G]?{c)"  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 Bn\l'T  
>):m-I  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 U\Ct/U&A?  
tqK=\{U  
SQL-92标准所定义的FROM子句的连接语法格式为: xw?CMA  
EYG"49 c  
FROM join_table join_type join_table a\=-D:  
(vKI1^,  
[ON (join_condition)] [4p=X=B  
dY8(nQG  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 zLP],wB  
jZRhKT  
个表操作的连接又称做自连接。 VBM/x|'  
[g#s&bF  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 i^WIr h3a  
lX"bN=E?!  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Qm< gb+  
! ao6e  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 be7L="vZw  
n12UBvc}%  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) /}=a{J  
%swR:Bv  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 3YW=||;|Yg  
:j@8L.<U  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 i X%[YQ |  
Nsn~@.UuSW  
数据行。 GB>aT-G7q  
i}B;+0<drx  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 9x? B5Ap[  
4}i*cB `  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 .5.8;/ /  
,)zt AFn=  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 +dw!:P &  
OEnDsIhq  
运算符等构成。 @u/H8\.l  
Cp^g'&  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 94Ud@F9d5  
Ql &0O27  
连接。例如: NG" yPn  
!,Nwts>m  
SELECT p1.pub_id,p2.pub_id,p1.pr_info 1CkdpYjsj  
"~/9F  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 =1Z;Ma<;  
>&WhQhZ3kg  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) "ZT.k5Z  
/ZW&0 E  
(一)内连接 'eyJS`  
Km!nM$=k  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 8:thWGLN  
|TTS?  
三种: :$g8Zm,y  
=X-Tcj?3g  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 gcf6\f}\<  
7?nJ4x1  
表中的所有列,包括其中的重复列。 c2*`2qK#  
ghAi{@s$)  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 +7U  
8uch i  
运算符包括>、>=、<=、<、!>、!<和<>。 c*;7yh&%  
3A,rHYS  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 R-rCh.  
pBp #a  
结果集合中所包括的列,并删除连接表中的重复列。 +}@ 8p[`)  
<7XT\?%F  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: B4ZIURciGz  
>MG(qi  
SELECT * rNlW7 Y  
zl%>`k!>  
FROM authors AS a INNER JOIN publishers AS p ~@4'HMQ  
'O?~p55T  
ON a.city=p.city ~n?>[88"  
wO.iKX;  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): JOb MZA$  
mC[UXN/  
SELECT a.*,p.pub_id,p.pub_name,p.country kKiA  
z42F,4Gk  
FROM authors AS a INNER JOIN publishers AS p T$+-IAE  
iv&v8;B  
ON a.city=p.city Hkd^-=]]no  
PftxqJz  
(二)外连接 }uY!(4Rw  
IQH[Q9%  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 YB,t0%vTJw  
Vj?DA5W`'  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 89~ =eY  
# 1.YKo  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 'h1b1,b~  
o0It82?RN  
如下面使用左外连接将论坛内容和作者信息连接起来: sJG5/w  
]J7Qgp)i  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b a W%5~3  
sOU_j:A80;  
ON a.username=b.username "v-(g9(  
YDC&u8  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: t*XN_=E$f  
EZDy+6b  
SELECT a.*,b.* qk/:A+  
\G |%Zw|  
FROM city as a FULL OUTER JOIN user as b U/l?>lOD\  
zDTv\3rZ4X  
ON a.username=b.username &>g'$a<[  
.;7> y7$*  
(三)交叉连接 5ETip'<KT6  
]D 2u deg  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 XFVV},V  
rQ`i8GF  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 )!BsF'uVQ  
DL'iS  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 aGZi9O7G}  
8;14Q7,S  
于6*8=48行。 <^?1uzxH8A  
4NN$( S-W  
SELECT type,pub_name q@hzo>[  
An*~-u9m  
FROM titles CROSS JOIN publishers M$4[)6Y  
u"1rF^j6k  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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