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

[原创]SQL查询语句使用

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

一、简单查询 zv8aV2?D  
7qCJ]%)b6  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 !#}v:~[A  
AsTMY02|  
表或视图、以及搜索条件等。 Fr1;)WV  
9:bh3@r/  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 nF|#@O`1  
#j(q/ T{x  
SELECT nickname,email \] tq7  
<1;,B%_^  
FROM testtable MzBfHt'Rk  
23(B43zy  
WHERE name='张三' ,-w-su=J_  
`I]1l MJ)o  
(一)选择列表 hY\Eh.  
[Q2S3szbt6  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 7j9D;_(.^$  
<~IH`  
量和全局变量)等构成。 0X ] ekq  
?^+#pcX]t|  
1、选择所有列 /\IAr,w[  
x!Z:K5%O  
例如,下面语句显示testtable表中所有列的数据: X ,V= od>  
GC5#1+fQ  
SELECT * U89]?^|bb  
L%c]%3A  
FROM testtable 8:3oH!n  
9,Crmbw8  
2、选择部分列并指定它们的显示次序 DTX/3EN  
"1gk-  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 2?#y |/  
y9l#;<b  
例如: ~frPV8^DP  
`dG.L  
SELECT nickname,email @p9e:[  
o$[a4I  
FROM testtable k1QpX@  
/xX,   
3、更改列标题 i_oro "%yL  
;-Y]X(z>  
在选择列表中,可重新指定列标题。定义格式为: lOowMlf@2  
W TXD4}  
列标题=列名 w@ gl  
`? 9] '  
列名 列标题 f)u*Q!BDD  
%x cM_|AyR  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 <3],C)Zwc  
=F^->e0N  
标题: }iiG$?|.  
Cu)%s  
SELECT 昵称=nickname,电子邮件=email z[0LU]b<  
YW4b m  
FROM testtable _{2Fx[m%  
3isXgp8  
4、删除重复行 wB1-|= K1  
Pq[0vZ_}dN  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 NIWI6qCw  
,J`lr U0  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。  Rsa\V6N>  
-N-4l  
5、限制返回的行数 %>I?'y^  
c'TiWZP~  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 ei|*s+OZu  
8;+Hou  
表示一百分数,指定返回的行数等于总行数的百分之几。 kMJQeo79  
T}b( M*E  
例如: :?&WKW  
IgHs&=  
SELECT TOP 2 * QYf/tQg$  
&4[#_(pk  
FROM testtable $Z(g=nS>  
)\I? EU8  
SELECT TOP 20 PERCENT * r0hta)xa  
Je4.9?Ch  
FROM testtable b. %B;qB  
@kCD.  
(二)FROM子句 .JD4gF2N  
mER8> <  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, VFO&)E/-  
_($-dJ {  
它们之间用逗号分隔。 yuy+}]uB@  
j-C42Pfr  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 -!bLMLIg  
b*6c. o  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 0Z1H6qn  
^NnU gj  
使用下面语句格式加以限定: yG4LQE  
C9z~)aL}7  
SELECT username,citytable.cityid #0YzPMV  
Ck/_UY|  
FROM usertable,citytable &)"7am(S`  
nM(=bEX  
WHERE usertable.cityid=citytable.cityid Hq"<vp  
_A~~L6C  
在FROM子句中可用以下两种格式为表或视图指定别名: "[".3V  
}G,SqpcG  
表名 as 别名 ~\@<8@N2a6  
:}3qZX  
表名 别名 ^*?B)D=,  
wE8a4.  
例如上面语句可用表的别名格式表示为: n|4D#Bd1w  
3<UDVt@0  
SELECT username,b.cityid \$~oH3m&  
D?*sdm9r`  
FROM usertable a,citytable b ` HE:D2b  
b0z{"  
WHERE a.cityid=b.cityid $jm>tW&;  
u{{xnyl?  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 =Zb"T5E  
qqom$H<  
例如: "ZJ1`R=Mj  
J:mu%N`  
SELECT a.au_fname+a.au_lname hiK[!9r  
G(|(y=ck  
FROM authors a,titleauthor ta Ek B6- nz  
xn x1`|1u  
(SELECT title_id,title ]\9B?W(#  
Cf1wM:K|8  
FROM titles SFk11  
1UA~J|&gi^  
WHERE ytd_sales>10000  /nD0hb  
Oz9Mqcx  
) AS t Y4 ~wNs6  
?C>VB+X}y  
WHERE a.au_id=ta.au_id m^oi4mV  
jO3u]5}.6  
AND ta.title_id=t.title_id T>uWf#&pjs  
l"pz )$eE  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 (h@yA8>n  
>s 8:1l  
(三)使用WHERE子句设置查询条件 j2{,1hj  
T.m)c%]^/  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: I ;11j  
D-+)M8bt  
SELECT * O"s`-OM;n  
^* /v,+01f  
FROM usertable ZNH*[[Pf  
GT\s!D;<  
WHERE age>20 3RH# e1Y  
 eS@!\H x  
WHERE子句可包括各种条件运算符: '*LN)E> d  
7s fuju(  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 9bcyPN  
cmGj0YUQ1  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… ga1gd~a  
%_@5_S  
NOT BETWEEN…AND… DneSzqO"o  
SeJFZ0p  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) k4AE`[UE  
I}W-5%  
NOT IN (项1,项2……) KutgW#+40  
':R3._tw\  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE k\thEEVP0*  
7Ae,|k  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL g$-D?~(Z  
3f2Hjk7,d  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR }vxH)U6$q  
; R|#ae@  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ~ :b:_ 5"  
5bznM[%xO  
2、列表运算符例:country IN ('Germany','China') ?VN]0{JSp  
(#l_YI -  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 T# _n-b>  
ESf7b `tS  
varchar、text、ntext、datetime和smalldatetime等类型查询。 $E_vCB _  
kcz#8K]~  
可使用以下通配字符: at(p,+ %  
Jx ;"a\KD  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 ):\{n8~  
H{A| ~V)  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 Ho._&az9cT  
hy&Hl  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 z9kX`M+  
<%#y^_  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 uj1E* 98m  
e}4^N1'd/  
例如: 2=,Sz1`t  
[oN> :  
限制以Publishing结尾,使用LIKE '%Publishing' 2:5gMt  
\^(vlcy  
限制以A开头:LIKE '[A]%' S{)n0/_  
>]Yha}6h  
限制以A开头外:LIKE '[^A]%' ZO0]+Ko  
}:D~yEP  
4、空值判断符例WHERE age IS NULL Z a1|fB  
56 kgL;$h  
5、逻辑运算符:优先级为NOT、AND、OR FR6I+@ oX~  
<C96]}/ ?  
(四)查询结果排序 k42ur)pb  
sv6U%qV  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ?*mbce[  
+G[HZ,FL  
ORDER BY {column_name [ASC|DESC]} [,…n] |{LaZXU&  
XM@i|AK M0  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 898wZ{9  
9-iB?a7{.  
序。 j}.J$RtW1f  
`8.32@rUB.  
例如: 4Hpu EV8Q  
utl=O  
SELECT * _,0!ZP-  
= hX-jP  
FROM usertable od's1'c R  
x)wt.T?eL  
ORDER BY age desc,userid ASC Aag)c~D  
2hC$"Dfp  
另外,可以根据表达式进行排序。 'U{: zBh  
3jeV4|  
  m"7R 4O  
Y6%OV?}v!  
二、联合查询 Yg,lJ!q  
n@,eZ!  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 s]8J+8 <uO  
+U)|&1oa  
合查询。UNION的语法格式为: bnY8.Lpf|  
-qP[$Q  
select_statement fQ_8{=<-&X  
7`<? f O  
UNION [ALL] selectstatement X6*y/KG N  
+siNU#!  
[UNION [ALL] selectstatement][…n] uvv-lAbjw  
[%,=0P}  
其中selectstatement为待联合的SELECT查询语句。 St&HE:  
.:!x*v  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 }J'w z;t1  
G/3lX^Z>  
行。 =}GyI_br;8  
sH,)e'0  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 {ZEXlNPww  
Dlf=N$BL7d  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 iwjl--)@K  
5qfKV&D  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 I%C:d#p  
Bo\v-97  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ]sP9!hup  
[#6Esy8|  
型,系统将低精度的数据类型转换为高精度的数据类型。 (IHBib "  
il%tu<E#J~  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: !;C(pnE  
R{A/ +7!  
查询1 UNION (查询2 UNION 查询3) ,vw`YKg  
gL"Q.ybA  
  #&KE_ n  
)mVYqlU"  
  (Ha}xwA~(  
t\d;}@bl  
三、连接查询 7#. PMyK9  
kGiw?~t=%  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 = d.W'q|  
A2_3zrE  
数据库管理系统的一个标志。 %_O>Hy|p  
\1'R}B@;  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 I>~BkR+u%o  
 VgoKi  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 "hY^[@7 W  
K2`WcEe  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 <U`Nb) &  
tS|zf,7  
查询。 * t9qH  
vm}.gQ  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 Awf = yE:  
ms<uYLp  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 zGz'2, o3  
l^?A8jG  
SQL-92标准所定义的FROM子句的连接语法格式为: >Mw =}g@P  
}C`0" 1  
FROM join_table join_type join_table 8&hn$~ate  
]JuB6o_L  
[ON (join_condition)] r9*H-V$  
l<_mag/j9o  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 `z`;eR2oX  
k r^#B^  
个表操作的连接又称做自连接。 n8aiGnd=v  
1U9N8{xg9  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 HTpd~W/\  
*]?YvY  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 }mZ*f y0t  
xi=uXxl  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 2+cicBD  
lS*.?4zX  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) m?G+#k;K  
uxiX"0)g>  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 o;I86dI6C  
iGNKf|8{  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 xmd$Jol^  
IFoN<<7/2$  
数据行。 B#n}y  
Ps4A B#3  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 `&7? +s  
]r5Xp#q2  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 1 K',Vw_  
iqP0=(^m  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 x l=|]8w  
&`W,'qD$  
运算符等构成。 IQY#EyTb  
>m{-&1Tx  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 v A~hkkj{  
7O :Gi*MA  
连接。例如: A1T;9`E  
sJ()ItU5i  
SELECT p1.pub_id,p2.pub_id,p1.pr_info .sMi"gg  
~h|L;E"  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 4HmRsOl  
1&E&8In]$r  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) W7> _nK+g?  
%'5wwl  
(一)内连接 74wa  
D)6||z}  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 (XWs4R.mkb  
(I g *iJ%2  
三种: :PkSX*E[q  
T5G+^XDA  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 @cNI|T  
#]^`BQ>  
表中的所有列,包括其中的重复列。 L6qA=b~iz  
T8 /'`s  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 WG4|Jf Y  
&_gmQ;%t:  
运算符包括>、>=、<=、<、!>、!<和<>。 l%/,Ef*3  
$"1&!  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Ut@)<N  
`?m(Z6'  
结果集合中所包括的列,并删除连接表中的重复列。 ` XY[ HK  
THZ3%o=X  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: .1M>KRSr,  
uS.a9 Q(  
SELECT * 'iK*#b8l  
JDlIf  
FROM authors AS a INNER JOIN publishers AS p u?/]"4  
%&GQ]pmcY  
ON a.city=p.city {.W%m  
Fd'L:A~  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 6h8NrjX  
AlV2tffY^  
SELECT a.*,p.pub_id,p.pub_name,p.country A(5? ci  
qpCi61lTDJ  
FROM authors AS a INNER JOIN publishers AS p JOk`emle  
"5bk82."  
ON a.city=p.city Gu=bPQOj  
{'[1I_3  
(二)外连接 S_=uv)%a  
9rz"@LM  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 r&;AG@N/  
hw2Hn   
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ](pD<FfS]'  
-n-X/M  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 E ..[F<5  
PX'%)5:q;i  
如下面使用左外连接将论坛内容和作者信息连接起来: beoMLHp  
}o.ZCACYg  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b "w1jr 6"  
f}4h}Cq  
ON a.username=b.username hG]20n2  
E}+A)7mA  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: /@e\I0P^  
I&0yUhn  
SELECT a.*,b.* |n/id(R+  
1??RX}8[L+  
FROM city as a FULL OUTER JOIN user as b !b=$FOC>  
^&%?Q_]  
ON a.username=b.username iV=#'yY  
L3\{{QOA  
(三)交叉连接 n\4+xZr  
-TWo-iu^  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 .>e~J+oL  
@P>@;S  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 C+j+q648>  
6(=:j"w0  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 usi p>y  
Ws(>} qjy  
于6*8=48行。 R_ }(p2  
@ ri. r1  
SELECT type,pub_name Fk:(% ci  
/uVB[Tk^  
FROM titles CROSS JOIN publishers ~qF9*{~!  
%;S5_K,  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五