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

[原创]SQL查询语句使用

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

一、简单查询 E%vT(Kz  
jrZH1dvE  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 *28:|blbL  
[E6ZmMB&  
表或视图、以及搜索条件等。 A`ScAzx5{  
uG{/yJeU  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 HrH! 'bd  
#xfPobQ>il  
SELECT nickname,email 0p[-M`D  
4)+L(KyB2  
FROM testtable .y^T 3?}I  
9KDm<Q-mf  
WHERE name='张三' ;k5B@z/<S  
%hV]vm  
(一)选择列表 YJMaIFt  
R(W}..U0R"  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 -,^Z5N#\|  
$@@@</VbP  
量和全局变量)等构成。 -cL wjI  
|[/'W7TV%?  
1、选择所有列 r9!,cs  
<) VNEy'  
例如,下面语句显示testtable表中所有列的数据: vCsJnKqK  
6<m9guv  
SELECT * 08F~6e6a8  
I6RF;m:Jw  
FROM testtable tde&w=ec  
Yrmd hSY  
2、选择部分列并指定它们的显示次序 PIZK*Lop  
KAR **Mp+  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 #s3R4@{  
JYO("f  
例如: :BpXi|n;  
v/~Lfi  
SELECT nickname,email FN"Ye*d  
#Z1 <lAy  
FROM testtable *rv7#!].  
MoMxKmI  
3、更改列标题 WI\jm&H r  
$[{YE[a  
在选择列表中,可重新指定列标题。定义格式为: 7Kn}KO!Y8  
uE-|]QQo  
列标题=列名 ~U<=SyZYo  
WIYWql>*  
列名 列标题 xa$4P [  
B)=)@h[f  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 + 3c (CTz  
 RR[1mM  
标题: +~za6  
O 2W2&vY  
SELECT 昵称=nickname,电子邮件=email rYPj3!#  
0+6=ag%  
FROM testtable @\|Fd)  
%%qg<iO_  
4、删除重复行 Da&Brm   
2"8qtG`Et  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ` 3h,Cy^  
Zx U?d   
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 jWcfQ  
Z^6qxZJ7  
5、限制返回的行数 KU 98"b5  
(65|QA   
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 JlhI3`X;/  
uh&Qdy!I  
表示一百分数,指定返回的行数等于总行数的百分之几。 6h{>U*N"&d  
gX;)A|9e  
例如: 8&c:73=?X  
buA/G-<e  
SELECT TOP 2 * IyoitIbLl  
qX:Y I3:,@  
FROM testtable h_\OtoRa  
/A1qTG=Br  
SELECT TOP 20 PERCENT * ((T6z$:hA  
bEli!N$  
FROM testtable #@}wl  
ewVks>lbz  
(二)FROM子句 kWbD?i-  
.9@y*_ 9  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, g![?P"i^t  
&Rt^G  
它们之间用逗号分隔。 'W*ODAz6  
~ As_O6JI  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 r;SOAucX  
KZ$^Q<d^  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 Hk@LHC  
!]l;n Fd  
使用下面语句格式加以限定: g4}K6)@  
)}i|)^J  
SELECT username,citytable.cityid :aWC6"ik-W  
$\q}A:  
FROM usertable,citytable )Ag{S[yZ  
5~{s-Ms  
WHERE usertable.cityid=citytable.cityid _NN5e|t  
]^I[SG,  
在FROM子句中可用以下两种格式为表或视图指定别名: H' %#71  
Lv7$@|"H9  
表名 as 别名 sDP8!  
} bm ^`QY  
表名 别名 .wf$]oQQ  
=&#t ("  
例如上面语句可用表的别名格式表示为: 5q _n 69b  
r Fhi:uRV  
SELECT username,b.cityid Cp^`-=r+  
m(CAXq-t  
FROM usertable a,citytable b 2k+u_tj>  
)uC5  
WHERE a.cityid=b.cityid 1-~sj)*k  
AQTV1f_  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 jh"YHe/X  
X.[8L^ldh  
例如: '4,>#D8@O  
!+_X q$9_  
SELECT a.au_fname+a.au_lname .05x=28n%  
<b_?[%(u  
FROM authors a,titleauthor ta lt& c/xi_  
`2,F!kCt  
(SELECT title_id,title ,L-G-V+  
GU7f27p  
FROM titles 495A\8#  
b_']S0$c\  
WHERE ytd_sales>10000 ?6//'bO:%  
a\tv,Lx  
) AS t WP >VQZ&  
t(Gg 1  
WHERE a.au_id=ta.au_id n..R'vNj  
$Go)Zs-bL?  
AND ta.title_id=t.title_id {!xDJnF;  
`gz/?q  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 _:+ k|I  
lf}%^od~6  
(三)使用WHERE子句设置查询条件 FQM9>l@6)>  
jf=\\*64r4  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: "z4V@gk   
'wVi>{?  
SELECT * t)hi j&wzu  
wVkRrFJ  
FROM usertable +Sak_*fq  
&;[e  
WHERE age>20 + I4s0  
"=!sZO?3  
WHERE子句可包括各种条件运算符: b=XHE1^rM  
f{)nxd >#  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< YcN&\(  
f}cCnJK  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… y=LN| vkQ  
B~2M/&rM\  
NOT BETWEEN…AND… 'Xu3]'m*  
j.+ }Z |  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) ?63ep:QEk  
pMzlpmW;P  
NOT IN (项1,项2……) p{[(4}ql  
tgC)vZ&a  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 9{8xMM-  
h@fF`  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL AtNF&=Op  
BVu{To:g  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR `&i\q=u+  
b{}ao  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 uA~?z :~=  
IC+!XZqS  
2、列表运算符例:country IN ('Germany','China') lQ#='Jqfp  
bp>M&1^KY  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 naVbcY  
F<J`1 :  
varchar、text、ntext、datetime和smalldatetime等类型查询。 lsKQZ@LN`  
q,>4#J[2;s  
可使用以下通配字符: h_15"rd  
YR u#JYti  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。  NR98]X  
ftD(ed  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 E <\\/Q%w  
, FR/X/8  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 id [caP=`  
m^>v~Q~~  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 l<:\w.Gl  
^xQPj6P}  
例如: QBb%$_Z  
Nf%/)Tk  
限制以Publishing结尾,使用LIKE '%Publishing' Fb6d1I^wR  
e*M-y C  
限制以A开头:LIKE '[A]%' xB5QM #w\  
1u~a*lO}  
限制以A开头外:LIKE '[^A]%' ^9 ^DA!'  
Y|ErVf4  
4、空值判断符例WHERE age IS NULL {43 J'WsJ  
VcLzv{  
5、逻辑运算符:优先级为NOT、AND、OR \i3)/sZ?l  
j+("4b'  
(四)查询结果排序 ;cGY  
>1$Vh=\OI  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 'cA(-ghY/E  
.JV y}^Q\  
ORDER BY {column_name [ASC|DESC]} [,…n] Rd[^)q4d$w  
GOD{?#c$  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 [F 24xC+  
g0#w 4rGF)  
序。 i?f;C_w  
MH|R@g  
例如: * 'Bu-1{  
i&j]FX6q  
SELECT * q^h/64F  
 vUR gR  
FROM usertable Xn02p,,  
pO)5NbU  
ORDER BY age desc,userid ASC kAq#cLprG  
77-G*PI*I  
另外,可以根据表达式进行排序。 p$mt&,p  
KPA.5,ai  
   %e(DPX  
YT6dI"48  
二、联合查询 O bc>f|l]  
u}89v1._Jn  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 b-RuUfUn0  
I8Y #l'z  
合查询。UNION的语法格式为: a3L-q>h  
a}X. ewg  
select_statement t \-|J SZ  
D9!$H!T _  
UNION [ALL] selectstatement ?hYWxWW  
%DM0Z8P$B-  
[UNION [ALL] selectstatement][…n] 8`_tnARIX  
9I(00t_  
其中selectstatement为待联合的SELECT查询语句。 Y]DC; ,  
?_eHvw  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 kW=!RX[&  
KbMan~Pb6  
行。 gt\kTn."  
g([M hf#  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 AF>t{rw=/  
KW/LyiP#  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 'V\V=yc1  
R{pF IyR  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 4hzdc ] a  
@@cc /S  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 }i J$&CJ  
tV h"C%Vkr  
型,系统将低精度的数据类型转换为高精度的数据类型。 ;,s9jw  
yW&ka3j\  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: C7K]c4T  
-q\Rbb5M  
查询1 UNION (查询2 UNION 查询3) @2;cv?i)  
-d^'-s  
  N_/+B]r }T  
qfjUJ/  
  k U0.:Gcc  
45&Rl,2  
三、连接查询 wo;OkJKF  
+.Xi7x+#O  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 C[5dhFZ  
^PUB~P/  
数据库管理系统的一个标志。 3-'3w,  
Jhfw$DF  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Ss_}@p ^  
(T%Ue2zlY  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 f Xh{ _>  
h/6^>setz  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 1 J}ML}h)  
s+(@UUl  
查询。 vM50H  
HiBI0)N}  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 i.\ e/9]f  
L|B! ]}  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 zrf tF2U  
U uC-R)  
SQL-92标准所定义的FROM子句的连接语法格式为: VfUHqdg-  
$ Ggnn#  
FROM join_table join_type join_table RC?vU  
xsiJI1/68  
[ON (join_condition)] Z{gm4YV  
J4@-?xj=\q  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 zQ#* O'-n  
I?^(j;QpS  
个表操作的连接又称做自连接。 =T\=,B  
Y[H769  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 @_W13@|  
a&UzIFdB  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 @C^wV  
J 5';Hb)  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 $x,EPRNs  
=3`|D0E  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ,HI% ym  
Io[NN aF|  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 Qqx!'fft  
vn!3Z!dm(  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 jw`05rw:  
sG)aw`_j  
数据行。 jOzi89  
sN2m?`?"G  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 _,IjB/PR(  
C!ch !E#  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 }r@yBUW  
LNyrIk/1  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 tP"6H-)X&  
%M))Ak4 ~a  
运算符等构成。 (w:,iw#  
k>7bPR5Mw  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 n1PBpM9!  
k61mRO  
连接。例如: ZhoV,/\+  
 !Q*w]  
SELECT p1.pub_id,p2.pub_id,p1.pr_info v$w}UC%uf  
]:b52Z  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 {f@Q&(g  
\KzJNCOT  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) /'5d0' ,M  
kD?@nx>  
(一)内连接 V)l:fUm2  
`*BV@  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 6q>}M  
&9|L Z9K  
三种: S[zGA<}  
XH@(V4J(.  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 L#uU. U=  
kkWv#,qwU  
表中的所有列,包括其中的重复列。 x^1d9Z  
g6;smtu_T  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 O5Z9`_9<  
N-_APWA  
运算符包括>、>=、<=、<、!>、!<和<>。 K&Bbjb_|  
Em^~OM3U$q  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 M=lU`Sm  
.a7RGT3]m  
结果集合中所包括的列,并删除连接表中的重复列。 C=]<R< Xy  
MkL2I+*  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: _> x}MW+  
NkO+ )=  
SELECT * m#Z&05^  
{Dk!<w I)  
FROM authors AS a INNER JOIN publishers AS p d;]m wLB0  
E #B$.K  
ON a.city=p.city J-<_e??  
/I!62?)-*  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 6 /5,n0  
 BgQ/$,  
SELECT a.*,p.pub_id,p.pub_name,p.country ;Q^>F6+_m  
BxjSo^n  
FROM authors AS a INNER JOIN publishers AS p RL/y7M1j  
s1[&WDedM  
ON a.city=p.city NjpWK ;L  
u[Kz^ga<  
(二)外连接 vdC0tax  
r)>3YM5  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 B^r?N-Z A  
;?tH8jf>  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 K) fKL   
7C 0xKF  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 !%ju.Xs8  
E;{RNf|  
如下面使用左外连接将论坛内容和作者信息连接起来: m*A b<$y  
HY FMf3  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b f? @Qt<+k  
\)rMC]  
ON a.username=b.username jwa6`u  
s_XCKhN:  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: `Wg"m~l$N  
_,)_(R ,h  
SELECT a.*,b.* #}+H  
] xHiy+  
FROM city as a FULL OUTER JOIN user as b H-+U^@w  
boGdZ2$h4  
ON a.username=b.username |1(x2x%}D^  
|+W{c`KL  
(三)交叉连接 -X!<$<\y;  
I9qFXvqL  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 I`X!M!dB)  
b4-gNF]Yt  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 gac31,gH  
+]A,fmI.  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 uX3yq<lK"  
vJ}WNvncVF  
于6*8=48行。 qnboXGaFu  
; F'IS/ttX  
SELECT type,pub_name gv>DOez/  
yuBRYy#E|%  
FROM titles CROSS JOIN publishers F:T(-,  
el*|@#k}  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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