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

[原创]SQL查询语句使用

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

一、简单查询 v[VUX69  
G v(bD6Rz  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 |FS,Av  
<H3njv  
表或视图、以及搜索条件等。 =pQA!u]QE  
*x3";%o  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 42mi 7%f  
8:hUj>q x  
SELECT nickname,email \ } ,="  
WvVHSa4{  
FROM testtable .8[B }S(  
')%Kv`hz  
WHERE name='张三' %O-RhB4q  
iQsv^K!\  
(一)选择列表 W,~s0a!  
'3S S%W  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 u*u>F@C8  
8%OS ,Z  
量和全局变量)等构成。 p@`rBzGp  
0MDdcjqw  
1、选择所有列 Q*|O9vu'D  
~_v?M%5i  
例如,下面语句显示testtable表中所有列的数据: c(jF^ 0~  
d5$2*h{^v  
SELECT * 1(6B|w5+  
9 ! [oJ3  
FROM testtable vUD,%@k9  
~7aBli=  
2、选择部分列并指定它们的显示次序 ~#3h-|]*  
UO(B>Abp  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 MJ^NRT0?b  
 5|2v6W!e  
例如: [9S\3&yoh  
No8~~  
SELECT nickname,email D6&fDhO27  
.ruGS.nS4  
FROM testtable /5M@>A^?'  
9An_zrJ%i  
3、更改列标题 z-(@j;.  
GFd~..$  
在选择列表中,可重新指定列标题。定义格式为: -AwR$<q'  
@ @$=MSN  
列标题=列名 Rt!G:hy7  
-N`j` zb|  
列名 列标题 /VB n  
yU"lW{H@  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 weCRhA  
3\FPW1$i|[  
标题: *yp}#\rk  
2Wz/s 0`  
SELECT 昵称=nickname,电子邮件=email Hm2}xnY  
41 sClC"  
FROM testtable ~J1;Z0}#  
|0:&d w?*!  
4、删除重复行 ;EstUs3  
;} ),6R  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 Z M"J5}h  
z#*M}RR  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 >xu}eWSz  
QW :-q(s  
5、限制返回的行数 ^L}fj$  
"(j.:jayd  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 <]I[|4J 7  
-Si'[5@  
表示一百分数,指定返回的行数等于总行数的百分之几。 U1(<1eTyu  
\.p{~ Hv  
例如: | ZBv;BW  
T)Z2=5V  
SELECT TOP 2 * 9u<4Q_I`  
=)5eui>{  
FROM testtable XE);oL2xP  
#UGtYD}"  
SELECT TOP 20 PERCENT * a.)Gd]}g  
lO},fM2j  
FROM testtable Omo1p(y  
i-!Z/,oL  
(二)FROM子句 sxM0c  
:Bc)1^ I  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, U085qKyCw  
+T:F :X`  
它们之间用逗号分隔。 +P,hT  
#I[tsly}  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 >*rsRR  
`9M:B&  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 +jD?h-]  
[G:wPp.y  
使用下面语句格式加以限定: Y%!3/3T  
g+BW~e)  
SELECT username,citytable.cityid RE/'E?G  
*IWO ,!  
FROM usertable,citytable z VleJ!d  
@F)51$Ld  
WHERE usertable.cityid=citytable.cityid un|+YqLf  
9?B}CCE<LR  
在FROM子句中可用以下两种格式为表或视图指定别名: @f442@_4  
f h05*]r  
表名 as 别名 IT& U%hw  
n1K"VjZk  
表名 别名 g(xuA^~J  
w J FEua  
例如上面语句可用表的别名格式表示为: QCkPua9  
p]=a:kd4J  
SELECT username,b.cityid , Zs:e.  
GKdQ  
FROM usertable a,citytable b OI;0dS  
yQb^]|XG  
WHERE a.cityid=b.cityid v3 4!rL  
zOA{S~>  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 nWpqAb  
/h'V1zL#  
例如: Q#NXJvI  
L?!*HS7 m  
SELECT a.au_fname+a.au_lname 6wH]W+A  
O o9 ePw7  
FROM authors a,titleauthor ta /CX_@%m}e=  
HRO :U%  
(SELECT title_id,title Aa t _5p  
=*0<.Lo':  
FROM titles KK" uSC  
nxH=Ut7{  
WHERE ytd_sales>10000 {8D`A;KD  
I]N?}]uZ  
) AS t $ ;cZq  
xVHZZ?e  
WHERE a.au_id=ta.au_id u 0KVp6`  
s.z(1MB]  
AND ta.title_id=t.title_id '&@'V5}C{  
{J3;4p-&  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。  M\zM-B  
5]yQMY\2)  
(三)使用WHERE子句设置查询条件 v^2q\A-?  
c6gRXp'ID  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 1HYrJb,d  
:f (UZmV$  
SELECT * xab1`~%K  
bmN'{09@  
FROM usertable dWV.5cViP  
!mhV$2&r  
WHERE age>20 ,Cx @]]  
Wkw.z  
WHERE子句可包括各种条件运算符: \C;cs&\Q  
ig Fz~  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< !-1UJqO  
$ )q?z.U  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… T+p ?VngF  
1,,kU  
NOT BETWEEN…AND… #7/;d=  
@]yd Wd  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) Z 4,nl  
@q0\oG4L  
NOT IN (项1,项2……) p^PAbCP'|3  
lA}(63j+b  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE e]-bB#-A  
LAqmM3{fA  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL @Bs7kjuX  
A?[06R5E#  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR !}7FC>Cx  
z0[_5Cm/  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 u|prVzm\m  
iX4?5yz~<  
2、列表运算符例:country IN ('Germany','China') 4DaLt&1  
.Fo0AjL}x  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 /c 3A>  
;]AJ_h(<`  
varchar、text、ntext、datetime和smalldatetime等类型查询。 hh\}WaY  
2LS03 27  
可使用以下通配字符: @ *W)r~ "~  
* S4IMfp  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 1fwjW0t  
]6)^+(zU  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 "w3#2q&  
pC<~\RR  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 1FC'DH!  
A/eZnsk  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 07pASZ;~  
( <~  
例如: *`.h8gTD,  
fLM5L_S}Y  
限制以Publishing结尾,使用LIKE '%Publishing' :u$nH9kwv  
n/$1&x1  
限制以A开头:LIKE '[A]%' k=D_9_  
&&Ruy(&]I  
限制以A开头外:LIKE '[^A]%' .}'49=c  
yH}(0  
4、空值判断符例WHERE age IS NULL t){})nZ/4  
dq d:V$o  
5、逻辑运算符:优先级为NOT、AND、OR m$b5Vqq  
8Mx+tA  
(四)查询结果排序 z0=(l?)#  
9K~0:c  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: h/`]=kCl  
xZ'-G6O "~  
ORDER BY {column_name [ASC|DESC]} [,…n] y(gL.08<  
fyYHwG  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 \@IEqm6  
XL9smFq  
序。 @Z9X^Y+u^h  
qPle=6U[IL  
例如: MR$R#  
G i 1Jl"  
SELECT * d.wu   
5]_m\zn=  
FROM usertable xz!b@5DR'%  
1+wmR4o  
ORDER BY age desc,userid ASC KVQ^-^  
zx<:1nF,]  
另外,可以根据表达式进行排序。 K?]><z{  
OP:i;%@c  
  \VQv "wid  
PeD>mCvL"  
二、联合查询 ]B8`b  
04;E^,V  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 4yOYw*X  
S$O+p&!X  
合查询。UNION的语法格式为: l|WdJn o  
m/ D ~D~  
select_statement Ltv!;^Q5  
3y#0Lb-y  
UNION [ALL] selectstatement T!![7Rs  
c~1+5&  
[UNION [ALL] selectstatement][…n] 0PfjD  
B49: R >  
其中selectstatement为待联合的SELECT查询语句。 6-"@j@l5<  
Vr/UY79  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 'mwgHo<u  
Q,pnh!.-c  
行。 "==fWf  
=rL%P~0wq  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 W4MU^``   
I8ZBs0sfF{  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 zG IxmJ.  
ANIx0*Yl(  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Ax"]+pb  
@4)NxdOE  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 >* Ag0.Az  
!U 6q;' )-  
型,系统将低精度的数据类型转换为高精度的数据类型。 %5g(|Y]  
S10"yhn(-t  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: =&%}p[ 3g  
V47z;oMXct  
查询1 UNION (查询2 UNION 查询3) TH[xSg  
AW{"9f4  
  .wH`9aq;5@  
<'y}y}%  
  rdQKzJiX=U  
7+(on  
三、连接查询 `kE ;V!n?  
RA];hQI?  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 o]R*6$  
KM-d8^\:  
数据库管理系统的一个标志。 1>~bzXY#  
0H9UM*O  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 G4&vrM,f  
e\8|6< o[  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 +aY]?]  
X RQz~Py  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 H18.)yHX  
LyRbD$m  
查询。 ` x|=vu-  
;?h+8Z/{  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 K*!qt(D&  
`;~A  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 QsemN7B "<  
*F:)S"3_~e  
SQL-92标准所定义的FROM子句的连接语法格式为: u~pBMg ,  
MpNgp )%>  
FROM join_table join_type join_table NIo!WOi  
5&C:&=Y  
[ON (join_condition)] m%ec=%L9  
!B*l'OJw  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 +nAbcBJAl  
* :kMv;9  
个表操作的连接又称做自连接。 !VDNqW  
#ET y#jKL  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 |KMwK png  
0 s$;3qE  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 <u_ vL WS  
TSKT6_IJw  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 d ug^oc1  
5+DId7d'n  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ]&;K:#J  
e,K.bgi  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 d1qvS@  
4'~zuUs  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 ,J&\) yTP  
\{EYkk0]  
数据行。 xqQLri}  
-HU4Ow  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 pN4gHi=  
^TZ`1:oL#  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ;Yve m  
+HT?> k  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 H$ZLtPv5  
91#rP|88;  
运算符等构成。 ;5 p;i 8m  
wJc`^gj  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 Y"  Ut  
oQiRjDLx  
连接。例如: &cp `? k  
J#?` l,  
SELECT p1.pub_id,p2.pub_id,p1.pr_info jO0"`|(]s  
PcQ\o>0")  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 fW w+'xF!  
l`<1Y|  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) ^)p+)5l   
;XIDu6  
(一)内连接 IZ_?1%q>}  
O))YJh"'_  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 #&}j'oD|N  
XW.k%H4@  
三种: vR7S !  
^M)+2@6  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 7G+E+A5o&  
2,6~;R  
表中的所有列,包括其中的重复列。 0N87G}Xu  
mUNAA[0 L  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 XI+GWNAmJ  
Y#t9DhzFWo  
运算符包括>、>=、<=、<、!>、!<和<>。 X#>:9  
/.WIED}>  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 az1#:Go  
K (,MtY*  
结果集合中所包括的列,并删除连接表中的重复列。 _Ie?{5$ng`  
qi*Dd[OG  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: TD sjNFe3  
0j :u.x  
SELECT * b]4\$rW7  
A<y]D.Z"  
FROM authors AS a INNER JOIN publishers AS p eiQ42x@Z  
IP  
ON a.city=p.city ,MjlA{0  
c'INmc I|  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): MCAWn H  
y8ODoXk  
SELECT a.*,p.pub_id,p.pub_name,p.country ,R\ex =c  
jf.WmiDC  
FROM authors AS a INNER JOIN publishers AS p $|tk?Sps  
rI OKCL?  
ON a.city=p.city 2f0mr?l)N  
=pBr_pGz=  
(二)外连接 9tWpxrig%  
 (l-l Y  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 7~~suQ{F4  
}X6w"  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ]$BC f4:  
"/y SHB[  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 Pm]lr|Q{I  
2fgYcQ8`  
如下面使用左外连接将论坛内容和作者信息连接起来: Zb7%$1)L~  
p}Um+I=1  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b B7wzF"  
29^(weT"]  
ON a.username=b.username e'sS",o*  
?kK3%uJy&  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: o)GesgxFa5  
#w@FBFr@  
SELECT a.*,b.* |\Q2L;4C  
YwS/O N  
FROM city as a FULL OUTER JOIN user as b &Oc `|r*  
<TTBIXV  
ON a.username=b.username A34O(fE  
-,Js2+QZ#  
(三)交叉连接 ~z(0XKq0d  
nsM. `s@V  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 %d%FI"!K  
0 ;].q*|#  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 <MKX F V  
!>N+a3   
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 kCALJRf~d  
"=ki_1/P  
于6*8=48行。 QUm[7<"  
 ^Kl*}  
SELECT type,pub_name j/jFS]iC  
<J>k%,:B  
FROM titles CROSS JOIN publishers d)3jkHYEjj  
!ALq?u  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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