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

[原创]SQL查询语句使用

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

一、简单查询 GR9F^Y)K{  
^^mi@&ApLD  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 $NSYQF%aO  
O5"80z38[  
表或视图、以及搜索条件等。 VzNH%  
;* Jd#O  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 hy rJu{p  
pwQ."2x  
SELECT nickname,email -A~<IyPt  
2^:nlM{u  
FROM testtable fz\Az-  
?z.`rD$}(n  
WHERE name='张三' l K%Hb=  
a$-ax[:\sm  
(一)选择列表 _t7A'`Dh]  
g.qp _O  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 hHQt4 r'd  
#=c%:{O{4R  
量和全局变量)等构成。 \qPrY.-  
\(s ";@  
1、选择所有列 3Hr%G4  
mNzZ/*n:  
例如,下面语句显示testtable表中所有列的数据: e78}  
6I<`N  
SELECT * ^  +G> N  
ud1E@4;qf  
FROM testtable ?6gI8K6X  
6{ Eh={:b  
2、选择部分列并指定它们的显示次序 1U!CD-%(  
5,3h'\ "!  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 h&P[9:LH  
D[_2:8  
例如: mv_-|N~  
7(-<x@e  
SELECT nickname,email S45jY=)z  
1{qg@xlj  
FROM testtable dcsd//E  
3FfS+q*3S  
3、更改列标题 p_( NLJ%  
 lwlR"Z  
在选择列表中,可重新指定列标题。定义格式为: qIl@,8T  
n$8A"'.M  
列标题=列名 ] N8V?.|:  
>ZT3gp?E  
列名 列标题 uFgw eOJ  
%$Uw]a  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 'DPSM?]fA  
F~6[DqF\|  
标题: W0Vjs|/  
78kk"9h'  
SELECT 昵称=nickname,电子邮件=email OmW|\d PU  
$0 )K [K  
FROM testtable @,hvXl-G*  
:\Dm=Q\  
4、删除重复行 YR>xh2< 9  
fQ@["b   
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 o5d)v)Rx=  
pE#0949  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 & |r)pl0$  
-3C~}~$>`  
5、限制返回的行数 . Hw^Nx  
-Cl0!}P4I  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 !q?}[E2  
_[V 6s#Wk3  
表示一百分数,指定返回的行数等于总行数的百分之几。 R~o?X ^^O  
qohUxtnTK>  
例如: U3>G9g>^B  
>dO^pDSs  
SELECT TOP 2 * Ag-*DH0  
g~]FI  
FROM testtable (,k=mF  
?V+=uTCq  
SELECT TOP 20 PERCENT * UaB!,vs3st  
aO{k-44y  
FROM testtable 'k hJZ:  
L3S,*LnA  
(二)FROM子句 e |!i1e!  
vU _#(jZ  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, b=sc2 )3?  
.Q7z<Q  
它们之间用逗号分隔。 o Vs&r?\Z  
`R\0g\  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 :?zOLw?(  
i4l?q#X  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 6w' ^,V  
 I2b[  
使用下面语句格式加以限定: MQ01!Y[q_7  
4GJsVA(d|  
SELECT username,citytable.cityid +'l@t bP  
giv cq'L  
FROM usertable,citytable 3 ;&N3:,X  
k&^fIz  
WHERE usertable.cityid=citytable.cityid crUXpD  
dS-l2 $n  
在FROM子句中可用以下两种格式为表或视图指定别名: Ma$b(4dB  
:`d& |BB  
表名 as 别名 N:0mjHG  
7yKadM~)  
表名 别名 (RQ kwu/  
:Q 89j4,  
例如上面语句可用表的别名格式表示为: v6FYlKU@8  
H}d&>!\}F  
SELECT username,b.cityid nI-\HAX  
V`G]4}  
FROM usertable a,citytable b D(y=0),  
tH$Z_(5  
WHERE a.cityid=b.cityid 6HyQm?c>a  
<)&;9C  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 3K{'~?mM  
Bb m1&d#  
例如: SOd(& >  
hD"Tjd` P  
SELECT a.au_fname+a.au_lname 1 #_R`(C{  
y'{0|Xj  
FROM authors a,titleauthor ta 6j0!$q^  
;s{rJG{inG  
(SELECT title_id,title P66>w})@  
\ ^_3Yw  
FROM titles YS &3+Tp  
74>.E^ /x  
WHERE ytd_sales>10000  'y1=Z  
f>dWl$/_s  
) AS t 7JjTm^bu  
mIt=r_  
WHERE a.au_id=ta.au_id Rc @p!Xi  
rZ<@MV|d  
AND ta.title_id=t.title_id rB-&'#3%  
~ujY+ {  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 wPOQy ~:  
%ZZ\Xj  
(三)使用WHERE子句设置查询条件 ((#|>W\&  
kd2+k4@#  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: ZPHB$]ri  
><%z~s  
SELECT * ]wZG4A  
PXWBc\  
FROM usertable \ 7jK6;R<  
N,L$+wm  
WHERE age>20 1O8RGk4  
? 3Td>x  
WHERE子句可包括各种条件运算符: kLK}N>v}X  
VXQ~PF]z0  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< oJEind>8O  
JS} iNS'X  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… "??$yMW  
46sV\In>?  
NOT BETWEEN…AND… rF'q\tJDz  
S U04q+  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) n1X7T0'  
}<m9w\pA  
NOT IN (项1,项2……) w\!aKeP'  
XI@;;>D1=U  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE NLRgL'+F  
v="i0lL_  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL Zgd| J T7  
|4UW.dGHPo  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR C0J/FFBQ^  
p{gJVP#l'Z  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 U*b1yxt  
.}C pX  
2、列表运算符例:country IN ('Germany','China') yal T6  
Qt` }$]  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 P`0}( '"U  
@uXF(KDX  
varchar、text、ntext、datetime和smalldatetime等类型查询。 >La!O~d  
1?\G6T  
可使用以下通配字符: { HHc} 8  
jt=%oa  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 \b6H4aQii  
M|xd9kA^  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 <'f+ nC=2  
4CCtLHb  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 MF69n,(o  
K?`Fpg (  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 teIUSB[  
8`M) r'5  
例如: }f45>@uMW  
1ayL*tr  
限制以Publishing结尾,使用LIKE '%Publishing' L;6L@D6  
$}+t|`*q8]  
限制以A开头:LIKE '[A]%' RDGefxv  
p,0J $L  
限制以A开头外:LIKE '[^A]%' \iVb;7r)9:  
vr/*z euA  
4、空值判断符例WHERE age IS NULL oK\{#<gCZ  
ai0am  
5、逻辑运算符:优先级为NOT、AND、OR DC+ p s  
@'P\c   
(四)查询结果排序 7XrXx:*a5  
\\}tD@V"  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: d|I?%LX0p  
kzozjh%`9h  
ORDER BY {column_name [ASC|DESC]} [,…n] iW oe  
|T3F:],`  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 cc37(=o KL  
{-a8^IK,  
序。 ,%Sf,h?"^  
 vf}.)  
例如: w`ebZa/j  
?y"= jn  
SELECT * .Aj4?AXWc  
H+lBb$  
FROM usertable [ 'aSPA  
`?P)RS30  
ORDER BY age desc,userid ASC m}`!FaB #  
]fiAV|'^  
另外,可以根据表达式进行排序。 U}hQVpP#  
*e/8uFX  
  |&wwH&<[z  
pT ]:TRPS  
二、联合查询 'Sk-L 5  
_e4%<!1  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 ( &N`N1  
q#pD}Xe$  
合查询。UNION的语法格式为: #u]'3en  
3pU/Z bb,:  
select_statement mLGbwm'K  
S1SsJo2\  
UNION [ALL] selectstatement ?azi(ja  
`!- w^~c  
[UNION [ALL] selectstatement][…n] V\|V1c  
O> .gcLA  
其中selectstatement为待联合的SELECT查询语句。 Z2@_F7cXt  
D0 5JQ*  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 q/qJkr^2  
7:Cq[u fl  
行。 Le,e,#hiY  
6Z ,GD  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 ?R#?=<VkG  
^p7g[E&  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 U]Pl` =SL  
`%@| sK2  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 2,T^L (]  
@3g$H[}  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 9lU"m_ QT4  
&GKtD)  
型,系统将低精度的数据类型转换为高精度的数据类型。 tMbracm  
p#A{.6Pa:  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: qL;u59  
|g)/6jG<-  
查询1 UNION (查询2 UNION 查询3) HE BKRpt  
jVdRy{MH  
  ?mq<#/qb  
d$ f3 Cre  
  aWg*f*2f  
Z4VNm1qs  
三、连接查询 md S`nhb  
r P1FM1"M  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 zLt7jxx  
B QxU~s  
数据库管理系统的一个标志。 .=`r?#0  
0D==0n  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 v$JhC'  
G _1`NyI  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 hf('4^  
|i~Ab!*8n  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 DuvI2Z WP]  
(?W[#.=7  
查询。 oj$^87KX  
A(2!.Y 2?*  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 :*g3PhNE  
xPp\OuwK  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 u#bd*(  
P;' xa^Y  
SQL-92标准所定义的FROM子句的连接语法格式为: G_cWp D/  
jT:z#B%  
FROM join_table join_type join_table + 7~u_J  
q'9}Hz  
[ON (join_condition)] 'h*^;3@*  
W|,Y*l  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 I 7 B$X=  
XLq%nVBM8\  
个表操作的连接又称做自连接。 Gm1[PAj  
y/9aI/O'  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 C]01(UoSZ  
D-KQRe2@  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 =G<i6%(^g  
IUZ@n0/T  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 K (!+l  
?7k%4~H t  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) kD?lMA__  
a}p}G\b|  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 >Y>>lE! k  
ZIr&_x#e  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 iVdY\+N!<  
|%HTBF  
数据行。 aM6qYO!jA  
ba`V`0p-(  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 ~9Jlb-*I5  
r@)_>(  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 NW%u#MZ[h  
dd> qy  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 Li2-G  
@w[2 BaDt  
运算符等构成。 3@*orm>em  
bw[s<z|LKA  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ZNN^  
u|eV'-R)s  
连接。例如: zQ>|`0&8   
a`t <R  
SELECT p1.pub_id,p2.pub_id,p1.pr_info YYs/r  
W3~xjS"h  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 2Y-NxW^]  
d) i64"  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) }bA@QEJ  
jwQ(E  
(一)内连接 sc)}r_|g  
E(p*B8d  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 qh)10*FB  
!M*$p Qi}  
三种: XI/LVP,.  
kaG@T,pH(  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 &CcUr#|  
s%OPoRE  
表中的所有列,包括其中的重复列。 D.;iz>_}Y  
RASPOc/]   
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 1RM@~I$0  
Smc=-M}  
运算符包括>、>=、<=、<、!>、!<和<>。 c7R<5f  
?P>3~3 B  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 eY'< UO  
u301xc,N<z  
结果集合中所包括的列,并删除连接表中的重复列。 fFiFS\''V  
 |Ym3.hz  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: umJ!j&(  
41oXOB  
SELECT * Op>l~{{{  
)Bo]+\2  
FROM authors AS a INNER JOIN publishers AS p :41Ch^\E  
+`]AutNv  
ON a.city=p.city #*|Gp_l+%  
+5xVgIk#  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): "'@>cJ=  
QoBM2Q YO  
SELECT a.*,p.pub_id,p.pub_name,p.country o-7,P RmKN  
\YMe&[C:o  
FROM authors AS a INNER JOIN publishers AS p _GF{Duxh  
+ebmve \+  
ON a.city=p.city appWq}db  
^0T DaZDLp  
(二)外连接 tsf)+`vt  
d")TH3pG  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 gi#g)9HG  
o >Faq+@  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 @q/E)M?  
"x~su?KiA  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 #[B]\HO  
zg+6< .Sf  
如下面使用左外连接将论坛内容和作者信息连接起来: Y k @/+PE  
6t!PHA  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b hg Pzx@  
glI4Jb_[  
ON a.username=b.username s1kG:h2|$  
0CR~ vQf#r  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: {1Hs5bg@  
HpGI\s  
SELECT a.*,b.* eJ3;Sd''  
#Et%s8{  
FROM city as a FULL OUTER JOIN user as b =6H  
EgB$y"fs  
ON a.username=b.username <l!{j?Kx  
XN %tcaY  
(三)交叉连接 0T7c=5z4W  
{$P')> /  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 yO*HJpc   
#sHt3z)6I  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 $Si|;j$?  
==]BrhZK  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 &|Cd1z#?  
LE]mguvs  
于6*8=48行。 Sece#K2J|  
HY>zgf,0  
SELECT type,pub_name ?Jy /]j5fI  
9ymx;  
FROM titles CROSS JOIN publishers W\1V`\gF  
2uT"LW/(H  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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