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

[原创]SQL查询语句使用

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

一、简单查询 W;=Ae~  
3%5YUG@  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 @ :Zk,   
MZ$uWm`/  
表或视图、以及搜索条件等。 h_#=f(.'j  
_rB,N#{2R=  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 F4G81^H  
p,8~)ic_  
SELECT nickname,email 8 5ET$YV  
'o}[9ZBjn  
FROM testtable T 'c39  
m=l'9j"D  
WHERE name='张三' DNq(\@x[!  
Jf?6y~X>Y  
(一)选择列表 R6(:l; W  
-ymDRoi  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 i:aW .QZ.  
:sg}e  
量和全局变量)等构成。 mTI`^e  
lvWwr!w  
1、选择所有列 8lpAe0p(Z  
)pHlWi|h  
例如,下面语句显示testtable表中所有列的数据: ?Q-Tyf$3  
h*l$!nEN  
SELECT * -&Xv,:'?  
Kb(11$U  
FROM testtable K2 M=)B  
)  FR7t  
2、选择部分列并指定它们的显示次序 5_'lu  
i WD|F-  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 [y@*vQw  
D;C';O  
例如: +v;z^+  
 eo9/  
SELECT nickname,email  '?9zL*  
&kIeW;X  
FROM testtable ;`#R9\C=h  
uTR^K=Ve  
3、更改列标题 7v%c.  
V,_m>$Mo  
在选择列表中,可重新指定列标题。定义格式为: Y/.C+wW2  
{3`385  
列标题=列名 AVpg  
$].htm  
列名 列标题 =Hd yra  
qazA,|L!  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 :82h GU  
mF*x&^ie  
标题: EhHxB fAQ  
d5m -f/  
SELECT 昵称=nickname,电子邮件=email _Ub `\ytx  
l\s!A&L  
FROM testtable R(~wSL*R>  
<:&vAX L  
4、删除重复行 4qie&:4j  
SQ>i:D;  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 5YD~l(,S1]  
sP(+Z^/  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 *V6| FU  
7s(tAbPdB  
5、限制返回的行数 EraGG"+  
f4f2xe7\Q  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 -G,}f\Cg  
aZA ``#p+  
表示一百分数,指定返回的行数等于总行数的百分之几。 \~5|~|9<  
*1dDs^D#|  
例如: B3#G  
Py)ZHML  
SELECT TOP 2 * IO+]^nY `  
/\8I l+0  
FROM testtable j<<d A[X  
\]9)%3I  
SELECT TOP 20 PERCENT * 7PY$=L48A  
!a@)6or  
FROM testtable !$Nj!  
W'[V$*  
(二)FROM子句 79h~w{IT@  
VPUVPq~&  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, BR2Gb~#T  
=01X  
它们之间用逗号分隔。 PXb$]HV  
W:d p(,L  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 &3Zq1o  
C ^Y\?2h1  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 @tH9$J*Y<  
OR <+y~Rv  
使用下面语句格式加以限定: qyH -Z@  
%=aKW[uq]  
SELECT username,citytable.cityid 8`q7Yss6F  
kWzN {]v  
FROM usertable,citytable 7j]v_2S`  
tEhg',2t(  
WHERE usertable.cityid=citytable.cityid =kd$??F  
I%[e6qX@  
在FROM子句中可用以下两种格式为表或视图指定别名:  ?%,NOX  
[xMa^A>p  
表名 as 别名 <)VgGjZ-H  
'0+*  
表名 别名 A6&*VD  
`AJ[g>py^|  
例如上面语句可用表的别名格式表示为: ZaFt4#  
F-yY(b]$  
SELECT username,b.cityid v,KKn\X  
2{OR#v~  
FROM usertable a,citytable b ~^m Uu`@r  
R?{+&r.X  
WHERE a.cityid=b.cityid ^jdU4  
;5[KZ8j6Y  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 *3GV9'-P  
}#XFa#  
例如: ~ Z\:Nx  
c`a(  
SELECT a.au_fname+a.au_lname *r7v Dc  
',+yD9 @  
FROM authors a,titleauthor ta ;a:H-iC  
xUo6~9s7  
(SELECT title_id,title *IG$"nu  
Cm}2>eH  
FROM titles .fA*WQ!lb  
o96C^y{~S  
WHERE ytd_sales>10000 D Ez,u^   
d$dy6{/YD  
) AS t -fR :W{u  
\/A.j|by,>  
WHERE a.au_id=ta.au_id m>>.N?  
K5""%O+  
AND ta.title_id=t.title_id k+3qX'fd  
C8N)!5(A  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 'D\Q$q  
).k DY ?s  
(三)使用WHERE子句设置查询条件 vvoxK0  
0#q=-M/?`  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 'rQ"Dc1D  
qUe _B  
SELECT * ]Bw0Qq F#  
'M90Yia  
FROM usertable ;JW_4;-  
EY}:aur  
WHERE age>20 U84W(X  
6b|?@  
WHERE子句可包括各种条件运算符: gv#\}/->4  
bF)G+IH  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ~Bd=]a$mj  
~(5r+Z}*`  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… NW3 c_]`=  
`?Rq44=  
NOT BETWEEN…AND… F MfpjuHk  
H=t"qEp  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) YIU3}sJ!  
W :w~ M'o  
NOT IN (项1,项2……) B@,9Cx564  
d|`Ll  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE S}m_XR]  
?GhyVXS y.  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL a QH6akH  
9 _d2u#  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR <N<Q9}`V  
>4 OXG7.&f  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 b}J%4Lx%m  
D$>_W,*V  
2、列表运算符例:country IN ('Germany','China') l,ENMKA^D  
X1L@ G  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 1^ iBS  
jm_-f  
varchar、text、ntext、datetime和smalldatetime等类型查询。 'J|2c;M\x  
DE?v'7cmA  
可使用以下通配字符: 4<s.|W`  
n|`3d~9$&  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 \-<BUG]=  
Onmmcem  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 U"oNJ8&%|  
>r.]a`  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 q76POytV|  
cHFi(K]|1  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 1Pf(.&/9_  
"kg`TJf=  
例如: W,q @ww u  
b@:OlZ~ %  
限制以Publishing结尾,使用LIKE '%Publishing' 5dBftTv?  
?^|`A}q#  
限制以A开头:LIKE '[A]%' &&ioGy}1  
UD I{4+z  
限制以A开头外:LIKE '[^A]%' =:W2NN'  
r8k(L{W  
4、空值判断符例WHERE age IS NULL &H(yLd[  
F_-Lu]*  
5、逻辑运算符:优先级为NOT、AND、OR \1EuHQ?  
3;nOm =I  
(四)查询结果排序 7]{g^g.9-  
ZbnAAbfKH  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: L"_X W no  
?u|??z%  
ORDER BY {column_name [ASC|DESC]} [,…n] 6r7>nU&d  
8&<:(mAP  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 +X?ErQm  
gLiJ&H  
序。 PK*Wu<<  
$:ush"=f8^  
例如: 6Z\aJ  
:uL<UD,vu3  
SELECT * ,GbmL8P7Y  
&|>@K#V8-;  
FROM usertable c{#2;k Q,  
=]5tYIU  
ORDER BY age desc,userid ASC Y\xEPh  
>7U/TVd&  
另外,可以根据表达式进行排序。 <'y<8gpM  
y]9R#\P/  
  XqH@3Ehk  
5#Er& 6s  
二、联合查询 ]lWqV  
;$p!dI\-Q  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 K7}.#*% ~  
fI.|QD*$b  
合查询。UNION的语法格式为: hCxg6e<[  
)>a~%~:  
select_statement  F/Goq`  
LIg1U  
UNION [ALL] selectstatement Nc[@QC{  
yi7.9/;a  
[UNION [ALL] selectstatement][…n] R >xd*A  
L*z=!Dpo  
其中selectstatement为待联合的SELECT查询语句。 p1N}2]e  
OVK )]- ~  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 lyn%r  
An2 >]\L  
行。 :e<jD_.X  
E'iE#He  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 '%$Vmf)=  
dX(JV' 18A  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 &/@V$'G=  
Tigw+2  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 'g#%>  
xAm tm"  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 Bdo{zv&A  
%m&6'Rpfk  
型,系统将低精度的数据类型转换为高精度的数据类型。 5xH=w:  
Ni~IY# '  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: vCa8`m  
9A |A@E#  
查询1 UNION (查询2 UNION 查询3) #W\}v(Ke  
\ o<ucp\J  
  }[+uHR6L  
fA=Z):w  
  IDct!53~  
m*^)#  
三、连接查询 fWHvVyQ.  
b]u$!W  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 91OxUVd  
.}faWzRH9  
数据库管理系统的一个标志。 Q)75?mn  
RZ6y5  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 (p]FI#y  
0C4eer+D  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 0O3O^ 0  
]4aPn  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 AVT % AS  
OP/DWf  
查询。 G ;j1zs  
'LgRdtO6  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 gP_N|LuF"  
{Y~>&B5  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 u(vZOf]jL  
vQrxx  
SQL-92标准所定义的FROM子句的连接语法格式为: [f+wP|NKL  
x`E<]z*w}  
FROM join_table join_type join_table I`_2Q:r  
1$Hou   
[ON (join_condition)] KL \>-  
t6Iy5)=zY  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 rK gl:s j+  
gIo\^ktW  
个表操作的连接又称做自连接。 2u.0AG   
3IYFvq~  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 HK )m^!=  
"Enb   
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 8AR8u!;8  
e!6yxL*[@[  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 eT b!xb  
 X}(s(6  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) /8; m.J>bf  
AJyN lQ  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 XFWpHe_ L  
Kx9u|fp5  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 EE 9w^.3a  
l'I:0a 4T  
数据行。 ;JxL>K(  
88HqP!m%P:  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 fd[N]I3  
9#9 UzKX#  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 GDSV:]hL  
^ ]9K>}  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ZLjAhd)  
?R]`M_^&u!  
运算符等构成。 ,rMDGZm?  
6Vnq|;W3Zv  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 z~Q=OPCnY  
"t^v;?4  
连接。例如:  VAiJL  
qyM/p.mP  
SELECT p1.pub_id,p2.pub_id,p1.pr_info +/[M Ex=   
xM%4/QE+  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 z Rna=h!  
#*bmwb*i  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) %`F;i)Zz  
=}Tm8b0  
(一)内连接 lpG%rN!  
3(c-o0M  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 L/"MRQ"  
C*mVM!D);!  
三种: 7^><Vh"qV  
d?7?tL2  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 F*P0=DD  
?%5VaxWJ  
表中的所有列,包括其中的重复列。 {R_>KE1  
6+$2rS$1V  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 Ay(p~U;gN*  
5{'hsC  
运算符包括>、>=、<=、<、!>、!<和<>。 n#+EG3  
r *K  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 `<9>X9.+  
AM- bs^  
结果集合中所包括的列,并删除连接表中的重复列。 #I=EYl=Vvi  
O|H:  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: JY  
(fpz",[  
SELECT * (H_dZL  
&Ym):pc  
FROM authors AS a INNER JOIN publishers AS p iTHwH{!  
!Ubm 586!  
ON a.city=p.city M5no4P<  
jz8u'y[n7  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): i >3`V6  
1gHe$ dzXk  
SELECT a.*,p.pub_id,p.pub_name,p.country DZ|*hQU>K  
J];Sj  
FROM authors AS a INNER JOIN publishers AS p g`pq*D  
gBqDx|G  
ON a.city=p.city 7i($/mNl  
"VZ1LVI  
(二)外连接 r~,y3L6ic  
;g0s1nz  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 vgeqH[:  
jt}Re,  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 +0Q   
4vg3F(   
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 B''yW{  
uq3pk3 )W9  
如下面使用左外连接将论坛内容和作者信息连接起来: UPH#~D!  
&m3-][ !n  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b <);q,|eh2  
QVjHGY*R  
ON a.username=b.username V ,KIi_Z  
x;[ .ZzQ  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: z)T-<zWO;  
PtkMzhX  
SELECT a.*,b.* -H%v6E%yh  
9p8ajlYg,  
FROM city as a FULL OUTER JOIN user as b g !^N#o  
jV2H61d  
ON a.username=b.username ?J2{6,}O*.  
wNi%u{T  
(三)交叉连接  J#` 7!  
IRg2\Hq  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 l`\L@~ln  
30HUY?'K  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 s:_hsmc"  
I<QUvs%e  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 N[ = I  
\hX,z =  
于6*8=48行。 8sj2@d  
z<eu=OD4t  
SELECT type,pub_name q]{gAGe~  
}tt%J[  
FROM titles CROSS JOIN publishers uL)MbM]  
<lB2Nv-,  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
10+5=?,请输入中文答案:十五