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

[原创]SQL查询语句使用

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

一、简单查询 9:fOYT$8  
(hTCK8HK  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 FqkDKTS\&  
`sUZuWL_  
表或视图、以及搜索条件等。 >NqYyW,%  
N/]o4o  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ;KOLNi-B&  
kQ4dwF~  
SELECT nickname,email +J_c'ChN  
l/BLUl~z  
FROM testtable Jpj}@,  
b^ L \>3  
WHERE name='张三' B||*.`3gN  
CEXyrs<  
(一)选择列表 :@kGAI  
&Flglj~7l  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 dI*pDDq#  
t2EHrji~  
量和全局变量)等构成。 -mC0+}h  
w3#Wh|LQ-  
1、选择所有列 kUq=5Y `D  
s4G|_==  
例如,下面语句显示testtable表中所有列的数据: A:>01ZJ5S+  
cmBB[pk\  
SELECT * ^:K3vC[h;c  
UQ8M~x5$3%  
FROM testtable `k OD[*  
sqla}~CiX  
2、选择部分列并指定它们的显示次序 'HT7_$?*  
flk=>h|  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 rJPb 3F  
K2 he4<  
例如: n/DP>U$I&  
N<f"]  
SELECT nickname,email 09dK0H3(  
m/v9!'cMI  
FROM testtable k xP-,MD  
uJOJ-5}yt  
3、更改列标题 (H)2s Y  
0rh]]kj  
在选择列表中,可重新指定列标题。定义格式为: |w_7_J2  
x6(~;J  
列标题=列名 q:l>O5  
L/wD7/ODr  
列名 列标题 -0?~  
7P" | J\  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 c05TsMF&O  
-%2[2p  
标题: ;ToKJ6hN|*  
aJYgzr,  
SELECT 昵称=nickname,电子邮件=email z)'Mk[  
"vXxv'0\f  
FROM testtable Tg!i%v(-t  
W"):-Wq  
4、删除重复行 !O-T0O   
W4hbK9y  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Z&0'a  
N U|d  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 UjaK&K+M?  
Dpvk\t  
5、限制返回的行数 < XP9@t&  
A~Y^VEn  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 b}0,\B%  
:q=%1~Idla  
表示一百分数,指定返回的行数等于总行数的百分之几。 1v,Us5s<"6  
1=#q5dZ]  
例如: cU0s p  
9[1`jtm  
SELECT TOP 2 * 3mYiQ2  
i%ZW3MrY~  
FROM testtable 5V5%/FU m  
f&}k^>N#3  
SELECT TOP 20 PERCENT * +SsK21f"r  
m0LTx\w!  
FROM testtable Nndddk`  
@.G[s)x  
(二)FROM子句 hZh9uI7.  
^[]}R:  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, f~Fm4 >\(  
x\F,SEj  
它们之间用逗号分隔。 b|cyjDMAA  
20vXSYa~  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ]d,S749(s  
.7i` (F)  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 J\d3N7_d  
%FXfqF9  
使用下面语句格式加以限定: ObLly%|i  
I"Ms-zs  
SELECT username,citytable.cityid r)Ap8?+  
V2$h8\a  
FROM usertable,citytable V+Cwzc^j  
d@ Y}SWTB  
WHERE usertable.cityid=citytable.cityid ]04 e1F1J  
QA2borfy  
在FROM子句中可用以下两种格式为表或视图指定别名: j{Hao\F8  
I?"q/Ub~h  
表名 as 别名 Vl%^H[]  
d*A*y^OD  
表名 别名 bA\<.d  
YGv<VOWG2  
例如上面语句可用表的别名格式表示为: _Dym{!t  
A$#p%y b  
SELECT username,b.cityid `9)t[7  
Z-E`>  
FROM usertable a,citytable b *GxTX3i}vc  
'a$Gv&fu  
WHERE a.cityid=b.cityid hGd<<\  
b7!Qn}  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 r`AuvwHPs[  
6b%WHLUeT  
例如: ^xh}I5  
T%6&PrQ7  
SELECT a.au_fname+a.au_lname rF aF Bd  
BYs-V:  
FROM authors a,titleauthor ta c7tfRq n+  
p!sWYui  
(SELECT title_id,title `!D s6  
 Np'2}6P  
FROM titles *c%oN |  
T.Ryy"%F  
WHERE ytd_sales>10000 0G7K8`a  
>=UF-xk;  
) AS t w=LP"bqlI  
c6nflk.l  
WHERE a.au_id=ta.au_id tj Gd )  
k$H%.l;E  
AND ta.title_id=t.title_id '~ ,p[  
%^I88,$&L  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ]l'Y'z,}  
G 16!eDMt  
(三)使用WHERE子句设置查询条件 l5\"9 ,<  
UNPezHaz  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: w QNxL5B  
Bn61AFy`  
SELECT * ,hq)1u  
ua5OGx  
FROM usertable Kv.>Vf.T}_  
]4R[<<hd  
WHERE age>20 q4}PM[K?=\  
\e!vj.PU  
WHERE子句可包括各种条件运算符: fO0(Z  
F1jglH/MF)  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< usEwm,b)  
~_Lr=CD;4  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… dxZu2&gi  
UJfEC0  
NOT BETWEEN…AND… YqPQ%  
;]gP@h/  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) oqLfesV~  
K'X2dG*  
NOT IN (项1,项2……) &VV~%jl;k  
P( XaTU&-  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ccLq+a|  
9G{;?c  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL a@\D$#2r  
Pu"R,a  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR ow0!%|fO  
;9~6_@,@o  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 yU8{i&w4  
G:pEE:W[  
2、列表运算符例:country IN ('Germany','China') U$ F{nZ1  
9lGOWRxR)  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 q EP 4  
L0&RvI#  
varchar、text、ntext、datetime和smalldatetime等类型查询。 u%]shm  
Y$Q|J4z  
可使用以下通配字符: y`$Q \}fS  
]J:1P`k.  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 1gmt2>#v%  
}~"hC3w  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 x_c7R;C  
ZTU&, 1Y;  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 n>A98NQ  
;=<-5;rI  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 [8Qro8  
q^A+<d  
例如: 3,]gEE3  
RjWqGr;bO  
限制以Publishing结尾,使用LIKE '%Publishing' Wm);C~Le  
$KLD2BAL  
限制以A开头:LIKE '[A]%' mwY IJy[  
d3W0-INL  
限制以A开头外:LIKE '[^A]%' K]j0_~3s  
txcf=)@>V  
4、空值判断符例WHERE age IS NULL g8w2Vz2/  
)ZBY* lk9  
5、逻辑运算符:优先级为NOT、AND、OR _UT$,0u_i  
^2$ lJ  
(四)查询结果排序  qNm$Fx  
-jn WZ5.  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: UN%Vg:=  
^S)cjH`P  
ORDER BY {column_name [ASC|DESC]} [,…n] Ov UI@,Ef  
0TmR/uUT  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 "Ae@lINn[y  
Gg~QAsks   
序。 >[ Ye  
&BtK($  
例如: N.4q.  
vjQb%/LWl  
SELECT * ?Q-h n:F)  
Kh4$ wwn  
FROM usertable +<}0|Xl&  
m! W3Cwz\&  
ORDER BY age desc,userid ASC PH*\AZJCl  
zfc3)7  
另外,可以根据表达式进行排序。 f]G>(V=i  
lj{VL}R  
  o/C\d$i'  
0b/WpP  
二、联合查询 "H&"(=  
-AhwI  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 t\RF=BbJJ  
_=q! BW  
合查询。UNION的语法格式为: wtT}V=_  
H)aQ3T4N5  
select_statement 8a_[B~  
v3GwD0 0  
UNION [ALL] selectstatement { .*y  
h.!}3\Y  
[UNION [ALL] selectstatement][…n] =56T{N  
H*bs31i{  
其中selectstatement为待联合的SELECT查询语句。 ALEnI@0  
25NTIzI@@  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 t=*@yQ nB  
@x eAc0.^  
行。 iA0q_( \X  
,^gyH \  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 R|f~>JUF  
PG8^.)]M  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 M\Gdn92pd  
y!5$/`AF  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 (ewe"N+  
>7roe []-|  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 e5.h ?  
<,AS8^$X[  
型,系统将低精度的数据类型转换为高精度的数据类型。 _DrJVC~6@  
d/}SAvtt  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: etd&..]J  
h'$QC )P  
查询1 UNION (查询2 UNION 查询3) rJa$9B*^  
]uspx [UIc  
  xil[#W]7Ge  
4Q IE8f Y  
  557(EM  
ltkI}h,e  
三、连接查询 RZe'Kw -  
=C L} $_  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 1yV: qp  
4O:W#bx  
数据库管理系统的一个标志。 <$N"q  
:QWq"cBem  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在  J*l4|^i<  
<" @zn  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 vsL[*OeI  
x Au/  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ,v&L:a  
W5^.-B,(K  
查询。 ~+<olss_  
{V1Pp;A  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 BC,.^"fA6  
t+?P^Ok  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 lNv".Y=l  
^m/14MN|  
SQL-92标准所定义的FROM子句的连接语法格式为: zE)~0v4  
lCF `*DM#  
FROM join_table join_type join_table BS q)RV/3  
?:|-Dq,  
[ON (join_condition)] k8,?hX:  
T6pLoaKu  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 *jMk/9oa<N  
D0mI09=GtQ  
个表操作的连接又称做自连接。 v+e|o:o#  
9S[XTU  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 >a1{397Y}  
;. wX@  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 QRLJ_W^&u  
)RYG%  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 M(d6Z2ibh  
(~)%Fo9X"  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) DMF -Y-h  
c9j*n;Q  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 z4@k$ L8  
9'x)M?{8  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 {k5X*W  
f'q 28lVf  
数据行。 rdnRBFt   
CSV;+,Vv  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 +,50q N:%[  
{B*W\[ns  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 0F#>CmD  
hI pKJ&hm  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 F?m?UQS'u  
zq1mmFIO  
运算符等构成。 hh~n#7w~IR  
FuX 8v  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 dY" }\v6  
;NV'W]  
连接。例如: AM} brO  
 q{die[J  
SELECT p1.pub_id,p2.pub_id,p1.pr_info *2}O-e  
k>E`s<3  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 |3K)$.6~  
1!p/6  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) yMLOUUWa8x  
>QHo@Zqj(  
(一)内连接 o5\b'hR*#  
Aa?I8sbc  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 0Q593F  
DWt*jX*  
三种: 4$,,Ppn  
)4xu^=N&as  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 %~j2 ('Y  
.[DthEF  
表中的所有列,包括其中的重复列。 vRA',(](  
zH=!*[d8  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 *QM~O'WhD  
69kJC/1+l  
运算符包括>、>=、<=、<、!>、!<和<>。 w:o-klKXY  
iRG?# "  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Je4Z(kj 0  
^*R(!P^  
结果集合中所包括的列,并删除连接表中的重复列。 9umGIQHnil  
>EXb|vw   
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: _SZ5P>GIU  
gQ~5M'#  
SELECT * g8ES8S M  
rZbEvS  
FROM authors AS a INNER JOIN publishers AS p jnu Y{0(&  
[ neXFp}S  
ON a.city=p.city ~un%4]U  
tLm867`c7  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ?p[O%_Xf  
r^HA aGpC  
SELECT a.*,p.pub_id,p.pub_name,p.country j2 h[70fWC  
SW(q$i  
FROM authors AS a INNER JOIN publishers AS p ovf/;Q/}  
WW@"Z}?k  
ON a.city=p.city &jV_"_3n  
~9D~7UR  
(二)外连接 ^_p%Yv  
G>T')A  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 l{P\No  
__p_8P  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 V'Qn sI  
km:nE: |  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 %@ mGK8  
Jx-wO/  
如下面使用左外连接将论坛内容和作者信息连接起来: W VkR56  
<c,~aq#W'  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b tUE'K.-  
(L6Cy% KgV  
ON a.username=b.username y[0`hSQ)~  
j<tq1?? [b  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: t~K%.|'0  
#~?kYCtC)  
SELECT a.*,b.*  eIPG#A  
~@I@}n  
FROM city as a FULL OUTER JOIN user as b p4X{"Z\mn  
NB8&   
ON a.username=b.username 1M%S gV-#  
}4%/pOi:f  
(三)交叉连接  W^g[L:s  
w,.qCpT$_  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ySdN;d:q  
#Gv{UU$]  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 d<o.o?Vc  
;5|1M8]=0  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 SKXBrD=-  
x.DzViP/  
于6*8=48行。 ro| vh\y  
I#A2)V0P)  
SELECT type,pub_name z>vtEV))  
+6W(z3($  
FROM titles CROSS JOIN publishers >`V}U*}*H  
e`U Qz$4!  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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