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

[原创]SQL查询语句使用

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

一、简单查询 wXMKQ)$(  
%UI.E=`n  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 2^bq4c4J  
v98=#k!F  
表或视图、以及搜索条件等。 5:Pp62  
8E&}+DR?  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 =zDU!< U  
#25Z,UU  
SELECT nickname,email [!]a' T#x  
h +.8Rl  
FROM testtable UZi^ &  
6b~Zv$5^Y-  
WHERE name='张三' =dHM)OXD"  
{^i73}@O  
(一)选择列表 Qg"hN  
);_g2=:#  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 KoRJ'WW^  
\{t#V ~  
量和全局变量)等构成。 cTCo~Pk4  
l_hM,]T0  
1、选择所有列 g34<0%6jd  
AqB5B5}  
例如,下面语句显示testtable表中所有列的数据: nT..+ J)  
E0'+]"B  
SELECT * J0*hJ-/u  
Y (x_bJ  
FROM testtable KtchK pv  
Bw;sg;  
2、选择部分列并指定它们的显示次序 N:GSfM@g  
z8_m<uewz  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 7Ab&C&3  
veAg?N<c p  
例如: XAwo ~E  
0?KXQD  
SELECT nickname,email `E+)e?z  
b6:A-jb*I  
FROM testtable !O6e,l  
WSi`)@.X O  
3、更改列标题 4z#{nZG  
?YWfoH4mS  
在选择列表中,可重新指定列标题。定义格式为: usH9dys,  
8^\}\@  
列标题=列名 M.$Li#So,  
i]J*lM7'  
列名 列标题 njeRzX  
dU1w)Y  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 0<_|K>5dS|  
BZejqDr*  
标题: +KgoLa  
wI><kdz  
SELECT 昵称=nickname,电子邮件=email uPKq<hBI  
Z$ qFjWp  
FROM testtable U'^AJ2L8  
tHNvb\MR$  
4、删除重复行 $r`K4g  
GC?X>AC:  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 )aoB -Lu  
dw %aoe  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ' JHCf  
@L^Fz$Sx  
5、限制返回的行数 u] C/RDTH  
5dffF e  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 q6A!xQs<  
wMy$T<:   
表示一百分数,指定返回的行数等于总行数的百分之几。 a<X8l^Ln  
6OYXcPW'  
例如: o(xRq;i  
p7(Pymkd  
SELECT TOP 2 * z0J$9hEg89  
,h21 h?6  
FROM testtable ^l1tQnj)7  
EtN@ 6xP  
SELECT TOP 20 PERCENT * x_9<&Aj6  
Hw"ik6  
FROM testtable K/RQ-xd4  
/CpUq;^  
(二)FROM子句 "8K>Yu17  
"=4`RM  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ,4y' (DA  
xsK{nM6g  
它们之间用逗号分隔。 YwGc[9=n  
-1Y9-nn[m  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 V~LZ%NZ8  
f`<j(.{9F  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 }HS:3Dt  
w?CbATQ   
使用下面语句格式加以限定: Dd|}LV  
~XGO^P"?  
SELECT username,citytable.cityid ZK5(_qW&i  
b ABx' E  
FROM usertable,citytable .4={K)kz|F  
A(duUl~  
WHERE usertable.cityid=citytable.cityid #QJ  mAA  
J5LP#o(V  
在FROM子句中可用以下两种格式为表或视图指定别名: >Bp%~8f  
g+/%r91hZ  
表名 as 别名 o D;  
-Hzn7L  
表名 别名 E%ea o$  
Rs B o\#`  
例如上面语句可用表的别名格式表示为: 8 o8FL~&]  
SCeZt [  
SELECT username,b.cityid 7=XQgbY/  
b3b 4'l   
FROM usertable a,citytable b 20m6-rkI<}  
7'FDI`e[  
WHERE a.cityid=b.cityid UCYhaD@sP  
s# w+^Mw$  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 @_YEK3l]l  
g$VcT\X  
例如: Y0BvN`E  
,4j$kR  
SELECT a.au_fname+a.au_lname Wq)'0U;{$  
tYIHsm\b  
FROM authors a,titleauthor ta _yjM_ALjo  
$n `Zvl2  
(SELECT title_id,title $N;!. 5lX3  
QxnP+U~N  
FROM titles ^ vI|  
Wy#`*h,  
WHERE ytd_sales>10000 ]Oc :x  
+C;ZO6%w  
) AS t .Q"3 [  
pALB[;9g  
WHERE a.au_id=ta.au_id E E?v~6"&  
c Yx=8~-  
AND ta.title_id=t.title_id *wt yyP@  
;KQ'/nII  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 qNHS 1  
f<SSg* A;  
(三)使用WHERE子句设置查询条件 N=D Ynz_~  
'G(N,vu[@  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: d!8q+FI  
PB>p"[ap4  
SELECT * UQ|0Aqwq  
/p\Ymq  
FROM usertable PkDL\Nqe  
 hPr  
WHERE age>20 1@)]+* F*z  
miS+MK"  
WHERE子句可包括各种条件运算符: ("/*k  
#a#~YSnG  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ^'EEry  
344,mnAd  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ?; )(O2p  
}"m@~kg=  
NOT BETWEEN…AND… "]c:V4S#`A  
jLr8?Hyf  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ccD+o$7LT  
w2{k0MW  
NOT IN (项1,项2……) 3tXtt@Yy  
[-6j4D  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE @Jvw"=  
d,<ctd  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL nt;A7pI`  
\!cqeg*53  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR Ix:aHl  
I$f:K]|.m!  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ,}{E+e5jh7  
CKh-+8j  
2、列表运算符例:country IN ('Germany','China') $ya#-pi`;  
fiw~"2U  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 ][G<CO`k  
I">z#@CT  
varchar、text、ntext、datetime和smalldatetime等类型查询。 @.0jC=!l  
gEi" m5po  
可使用以下通配字符: vpXS!o>/Sn  
PI?-gc?[  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 d=>5%$:v  
ORtl~V'  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ^S<Z'S  
3N]pN<3@  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 d+&V^qLJ  
e'\I^'`!M  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 9MHb<~F  
v11mu2  
例如: up:e0di{  
1]hMA\x  
限制以Publishing结尾,使用LIKE '%Publishing' m%Ef]({I  
PKjA@+  
限制以A开头:LIKE '[A]%' /u #9M {  
l>qCT  
限制以A开头外:LIKE '[^A]%' 4yBe(&N-d  
<M$hj6.tn  
4、空值判断符例WHERE age IS NULL "jeJV,%  
|Cen5s W&  
5、逻辑运算符:优先级为NOT、AND、OR QGLm4 Wl9  
pg>P]a{  
(四)查询结果排序 "\>3mVOb  
x&9 I2"  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ^ g4)aaBZ  
gsU&}R1*h  
ORDER BY {column_name [ASC|DESC]} [,…n] t8P>s})[4  
(yXVp2k  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 gH_r'j  
qA"?5j32  
序。 }XXE hOO  
_OrE{  
例如: T.(SBP  
KX9ZwsC0  
SELECT * +6;OB@  
<v2R6cj5  
FROM usertable (=PnLP  
*uv\V@0  
ORDER BY age desc,userid ASC u5,IH2BU  
d9^=#ot  
另外,可以根据表达式进行排序。 9Q.j <  
fe0 Y^vW  
  ]3I_H+hU  
6C3y+@9  
二、联合查询 qh&K{r*T  
#15q`w  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 M0"feq  
t6"4+:c!>  
合查询。UNION的语法格式为: =k8A7P  
/z'j:~`E  
select_statement A5/h*`Q\\  
.6'T;SoK>  
UNION [ALL] selectstatement @ =,J6  
P`oR-D  
[UNION [ALL] selectstatement][…n] :5Vu.\,1  
l%U9g  
其中selectstatement为待联合的SELECT查询语句。 pTN_6=Y"  
w%ip"GT,  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 DBv5Og  
j=gbUXv/  
行。 C4G)anT  
MUo?ajbqOd  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 }.hBmhnZmI  
*PI3L/*  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 K:Ap|F  
2cDC6rul  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 T8\,2UWsj2  
 AH} nTm  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 >:xnjEsi$/  
Mfz5:'  
型,系统将低精度的数据类型转换为高精度的数据类型。 MVj@0W33m  
3LTO+>, |"  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: %z.G3\s0  
hh?'tb{  
查询1 UNION (查询2 UNION 查询3) "2h#i nS  
6RF01z|~_  
  54OYAkPCk  
J\%:jg( m  
  >YW>=5_  
PU>;4l  
三、连接查询 SB;Wa%  
63f/-64?7  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 f&`*x t/  
`SG70/  
数据库管理系统的一个标志。 }Q%>Fv  
:.~a[\C@V<  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 \xdt|:8  
Cjh&$aq  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 AVJk  
/X:lt^?%I  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 MPB6  
YO Y+z\Q  
查询。 oaKf{$vg  
DYl^6 ]  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 5A)w.i&V  
,VZ&Gc  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 RpXQi*c0  
9,Mp/.T"\  
SQL-92标准所定义的FROM子句的连接语法格式为: ZMe|fn  
2 9]8[Z,4  
FROM join_table join_type join_table )&9 =)G  
fH.W kAE1  
[ON (join_condition)] R*y[/Aw  
Yyo|W;a]  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 4"2/"D0  
q^cFD  
个表操作的连接又称做自连接。 \XN5))  
|x4yPYBL  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 2mO#vTX4  
RmQt%a7\{  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 q!TbM"  
<It7s1O  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 +,[3a%c)H  
>SJ$41"E  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) F:g{rm[  
zJ:r0Bt  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 :6/OU9f/R  
.g#=~{A  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 d{hYT\7~1(  
{XXNl)%  
数据行。 xdM#>z`;  
h%s  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 Ltw7b  
l{U3;  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 @,&m`qzd+  
F"H!CJJu&  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 B|=maz:_  
Y/66`&,{  
运算符等构成。 pCUOeQL(  
a~7osRmp0  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 SU'9+=_$  
Q $0%~`t  
连接。例如: /&d`c=nH  
F\R}no5C  
SELECT p1.pub_id,p2.pub_id,p1.pr_info ebe@.ZVSi  
E@6r{uZ#  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 `_A?a_[*  
.4W>9 8  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) yn[ZN-H~  
/7@2Qc2  
(一)内连接 (I ds<n"  
}l?_Cfvu  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 _ 1> 4Q%  
F6c[v|3  
三种: DIp:S&q2  
@n X2*j*u  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 ~: <@`  
!K3cf]2UD  
表中的所有列,包括其中的重复列。 :@`(}5F4  
nYy}''l<  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 L sDzV)  
d<Q+D1  
运算符包括>、>=、<=、<、!>、!<和<>。 1|WpKaMoq  
)cK  tc  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 L^Q+Q)zTh  
QS [B  
结果集合中所包括的列,并删除连接表中的重复列。 oUvk2]H  
Rs F3#H  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: n *i'vtQ8  
NVc! g  
SELECT * dXcPWbrU4  
q_]   
FROM authors AS a INNER JOIN publishers AS p ZE8/ m")  
i$JG^6,O  
ON a.city=p.city 'ztL3(|X6  
rbK#a)7  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): Z&]+A,  
=,d* {m~A  
SELECT a.*,p.pub_id,p.pub_name,p.country ]opW; |{e  
`$V[;ld(mz  
FROM authors AS a INNER JOIN publishers AS p ?z@v3(b[  
.:Bwa  
ON a.city=p.city bwSRJFqb  
YQ @dl  
(二)外连接 =(.mf  
prlyaq;4  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 <E[HlL  
&e ?"5  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 NF/Ti5y  
b =K6IX;  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 Ig02M_  
[%7;f|p?  
如下面使用左外连接将论坛内容和作者信息连接起来: \[[TlB>  
/o|PA:6J  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b KUp   
t+3   
ON a.username=b.username ]_ejDN\>{V  
Mhv1K|4s  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: jr, &=C(  
HPtTv}l  
SELECT a.*,b.* @ ],6SKbG6  
>'} Y1_S5  
FROM city as a FULL OUTER JOIN user as b qGpP,  
;|>q zx  
ON a.username=b.username `1fJ:b/M  
c~gNH%1XN  
(三)交叉连接 Qp kKVLi  
5q5 )uv"  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 %[]"QbF?  
gp~yt0AU  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 SON ^CvMs{  
T-a&e9B  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 g08*}0-k  
Ws-6W!Ib%  
于6*8=48行。 Ku<b0<`  
FX HAZ2/\  
SELECT type,pub_name 1MbY7!?PG  
>Z#uFt0<Pm  
FROM titles CROSS JOIN publishers "/ tUA\=j  
?,ZELpg n  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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