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

[原创]SQL查询语句使用

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

一、简单查询 o`jVd,aj  
K`R  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 f <DqA/$  
:JxuaM8  
表或视图、以及搜索条件等。 5X`m.lhUc  
cT JG1'm  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 H|N,nkhH}  
Yv;iduc('  
SELECT nickname,email v~O2y>8Z  
oFJx8XU  
FROM testtable %tz foiJ%P  
+_fxV|}P  
WHERE name='张三' kEdAt5/U{  
62OZj%CXN  
(一)选择列表 &ZPyZj  
|A u+^#:;  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 j|WN!!7  
'k$j^ |r>  
量和全局变量)等构成。 -[lOf  
DTV"~>@  
1、选择所有列 M[dJQ (  
_K>YB>W}7  
例如,下面语句显示testtable表中所有列的数据: cr{f*U6`  
fH 5/  
SELECT * s4\_%je<v  
\N]2V(v  
FROM testtable wtro'r3  
<yE d'Z  
2、选择部分列并指定它们的显示次序 o7@81QA!e  
i\k>2df  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 )6-!,D0db  
}W"/h)q  
例如: ]OA8H[U-eA  
[RUYH5>Ik  
SELECT nickname,email uHO>FM,  
a^GJR]] {  
FROM testtable .\ces2,  
@X>Oj.  
3、更改列标题 jUX0sRDk  
czp}-{4X  
在选择列表中,可重新指定列标题。定义格式为: w`K=J!5y2g  
[Gb8o'  
列标题=列名 r`CsR0[  
OM7EmMa;  
列名 列标题 u"1Zv!  
)KD*G;<O]L  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 39,7N2uY  
6<C|O-  
标题: ?,x3*'-(  
nx'D&, VX  
SELECT 昵称=nickname,电子邮件=email -]~vE fq+T  
f+W %X  
FROM testtable =ET|h}I  
PzD ekyl  
4、删除重复行 !@kwHJkv  
(\NZ)Ys  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 OAZ5I)D>  
>FM2T<.;  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 ;V\l, u  
a{7'qmN1  
5、限制返回的行数 V17SJSC-  
$4&e{fLt|v  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Vu_QwWXO  
;sn]Blpq  
表示一百分数,指定返回的行数等于总行数的百分之几。 S U$U  
nhPua&  
例如: ,O/ t6'  
=L&}&pT  
SELECT TOP 2 * CQm(N  
wLz@u$u?  
FROM testtable &C=[D_h  
f^?k?_~PN  
SELECT TOP 20 PERCENT * [kyIF\0  
RwptFO  
FROM testtable jLG Q^v"  
2^$Ha|  
(二)FROM子句 `8D}\w<eI  
&;Jg2f%.  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, <^8&2wAkJ  
GY,HEe]2r  
它们之间用逗号分隔。 &!5S'J %  
Sr?2~R0&  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 *Z,?VEO  
NvqIYW  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 "nEfk{g  
)4BLm  
使用下面语句格式加以限定: -3On^Wj]  
ii :E>O(0B  
SELECT username,citytable.cityid ;X XB^,  
of k@.TmO  
FROM usertable,citytable R9`37(c9+  
CDU$Gi  
WHERE usertable.cityid=citytable.cityid %qqX-SF0C  
.~t.B!rVSB  
在FROM子句中可用以下两种格式为表或视图指定别名: {gwJ>]z"e  
,4tuWO)"  
表名 as 别名 (Ld,<!eN0  
0<C]9[l  
表名 别名  &@h(6  
QlCs ,bT  
例如上面语句可用表的别名格式表示为: VuWBWb?0Q  
sV`!4 u7%}  
SELECT username,b.cityid S)$iHBx{  
E\Et,l#|LY  
FROM usertable a,citytable b (6#, $Ze   
YZyV   
WHERE a.cityid=b.cityid )eaEc9o>  
:sL?jGk\  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 4V9S~^v|  
5:sk&0:@U  
例如: hiQ #<  
L6=`x a,  
SELECT a.au_fname+a.au_lname ydm2'aV  
U+FI^Xrt#  
FROM authors a,titleauthor ta _8I\!  
u?B9zt%$-m  
(SELECT title_id,title Qt`;+N(  
`!A<XiAOmM  
FROM titles ]Ll<Z  
{oK4 u  
WHERE ytd_sales>10000 |)}&: xA%  
;bhD:$NB X  
) AS t zIT)Hs5  
;*}tbh3;.  
WHERE a.au_id=ta.au_id |s$w i>7l  
P/XCaj3a[  
AND ta.title_id=t.title_id dFVx*{6  
&;wNJ)Uc  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ZtLZW/`  
yT<,0~F9  
(三)使用WHERE子句设置查询条件 $WS?/H0C  
P")1_!  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: }@H(z  
"F+m}GJ=a  
SELECT * Q^! x8oUF  
1HS43!  
FROM usertable sm?V%NX&  
QDdH5EfY  
WHERE age>20 gql^Inx<  
x^]J^L45  
WHERE子句可包括各种条件运算符: vnS;T+NZSC  
sRkPXzK  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< x=%wP VJ  
tEFbL~n  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… b[s=FH]#N  
>#Ue`)d`aY  
NOT BETWEEN…AND… u]uZc~T  
0 F-db  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) nc/F@HCB  
0wnC"2GUX  
NOT IN (项1,项2……) eOUv#F  
,?/AIL]_  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 9T;DFUM  
d;FOmo4  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL *mtS\J  
0n-S%e5  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR =Hf`yH\#  
M>_ U9g  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 Lh rU fy  
rMEM$1vPU  
2、列表运算符例:country IN ('Germany','China') @b{I0+li"/  
uP NZ^lM  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 # ; 3v4P  
ki=]#]rg  
varchar、text、ntext、datetime和smalldatetime等类型查询。 fZka$ 4  
vMv? fE"  
可使用以下通配字符: f)#rBAkt  
w)7s]Ld  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 9[ ,+4&wX7  
q'1 86L87  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 8ZL9>"%l  
X(M|T]`b:  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 G{]tB w  
gPqdl6#c  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 =s/UF_JN  
WinwPn+9  
例如: ?w5>Z/V  
L|]!ULi$d  
限制以Publishing结尾,使用LIKE '%Publishing' B6J <  
>&`;@ZOH  
限制以A开头:LIKE '[A]%' ;5!M+nk  
U#>K(  
限制以A开头外:LIKE '[^A]%' 'Hv=\p4$1  
teX)!N [  
4、空值判断符例WHERE age IS NULL y^[?F>wB  
:[d *  
5、逻辑运算符:优先级为NOT、AND、OR GMOnp$@H^s  
,0\P r  
(四)查询结果排序 d8ck].m=  
ni~1)"U.  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: *c>B,  
zr@H Yl  
ORDER BY {column_name [ASC|DESC]} [,…n] _MxKfah'  
B:rzM:BQ  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 Scd_tw.]|  
F~;UD<<"H  
序。 ":W$$w<  
x.kIzI5  
例如: d<_#Q7]I4  
LVe[N-K  
SELECT * JxmFUheLt  
D/&nEMp6  
FROM usertable T0v{qQ  
G7SmlFn?  
ORDER BY age desc,userid ASC ;GV~MH-F  
[5i }C K_=  
另外,可以根据表达式进行排序。 GD@|X wK){  
RG e2N |  
  ,%d?gi"&  
fV o7wp  
二、联合查询 bvF-F$n%F  
u#)ARCx,w  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 .!Q*VTW  
=g{Hs1W  
合查询。UNION的语法格式为: y134m  
wq:"/2p1  
select_statement [ ~:wS@%  
jUGk=/*]e  
UNION [ALL] selectstatement +nz 0ZQ9 a  
'dJ(x  
[UNION [ALL] selectstatement][…n] 0HPqoen$  
bwyj[:6l  
其中selectstatement为待联合的SELECT查询语句。 N}CeQ'l[R  
.1YiNmW=  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 Jk} Dj0o  
 RxO !h8  
行。 RfQ*`^D  
wu~?P`  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 LXS)(-&  
T7LO}(I.&  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 {66P-4Ev(  
OJT%?P%@{  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 }NY! z^  
:rSCoi>K  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 ~%!"!Z4  
75W@B}dZd  
型,系统将低精度的数据类型转换为高精度的数据类型。 WwF2Ry^a  
cI (}  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: Wxa</n8S[n  
Nq"J[l*+g  
查询1 UNION (查询2 UNION 查询3) bx:j`5Uj`  
w=kW~gg  
  cceh`s=cU  
N7UGgn=  
  QC<O=<$Q[  
CXh >'K  
三、连接查询 w`X0^<Fv  
o:PdPuZVR  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 "5@\"L  
se*!OiOt  
数据库管理系统的一个标志。 2Dw}o;1'  
e'T|5I0K  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 (w1$m8`=  
s(pNg?R  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 d8J(~$tXQN  
n+D93d9LP  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 [! Zyp`:  
!`0 El',gY  
查询。 9w.ZXd  
/|p6NK;8L  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 tqXCj}mR  
>~*}9y0$  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 v~:'t\n  
j2s{rQQ  
SQL-92标准所定义的FROM子句的连接语法格式为: eOZ"kw"uHu  
 _j2q  
FROM join_table join_type join_table #'8'5b  
^\g?uH6k U  
[ON (join_condition)] |*B9{/;4  
WSqo\]  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 }ws(:I^  
@y8) "m"  
个表操作的连接又称做自连接。 JnPwqIF1  
F4$9r^21r  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 K$c?:?wmo  
,:xses*7  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 ,SH^L|I  
p9[gG\  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 !@[@&.  
e'2w-^7  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) _Lgi5B%   
( "wmc"qH  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ~F[JupU  
+2,EK   
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 t#2szr+  
\kP1Jr  
数据行。 G;AJBs>Y}  
7`HKa@  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 o?5;l`.L}  
g 9AA)Ykp  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 B4{F)Zb  
9`cj9zz7  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 (97&mhs3  
8=-#LVo~c  
运算符等构成。 " nLWvV1  
SI/3Dz[  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 E=]$nE]b  
B pp(5  
连接。例如: WDF6.i ?  
]F sr k  
SELECT p1.pub_id,p2.pub_id,p1.pr_info Q*8efzgs|  
Ws:+P~8  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 z6Zd/mt~x  
P\&n0C~  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) >:|jds#  
7~H"m/;U&  
(一)内连接 ne# %Gr  
+HEL^  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 ,'byJlw_pv  
zcOG[-  
三种: q OV$4[r  
nG7E j#1  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 <x1,4a~  
>'v{o{k|C  
表中的所有列,包括其中的重复列。 p~z\&&0U0  
B~`:?f9ny5  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ]u47]L#  
dG)}H _  
运算符包括>、>=、<=、<、!>、!<和<>。 H,;9' *84  
, RU  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 pt%Y1<9Eh?  
4o kZ  
结果集合中所包括的列,并删除连接表中的重复列。 %";ap8J04F  
+<'>~lDg  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: h y"=)n(  
`gdk,L]  
SELECT * v,c;dlg_  
}i52MI1-XP  
FROM authors AS a INNER JOIN publishers AS p *R8P brN  
+oiuulA  
ON a.city=p.city R]N"P:wf@  
Lv@'v4.({  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): {; 3a^K  
; Z2  
SELECT a.*,p.pub_id,p.pub_name,p.country mV|Z5= f  
~Hvf"bvK|  
FROM authors AS a INNER JOIN publishers AS p K QCF "  
&X)^G#  
ON a.city=p.city <AB({(  
5 ~YaXh^  
(二)外连接 @!B% ynrG  
M<xF4L3]  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 'h>CgR^NM1  
41c4Xj?'  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 cD9.L  
qjH/E6GGg  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 C:RA(  
\iAs  
如下面使用左外连接将论坛内容和作者信息连接起来: C,,S<=L:  
B1va]=([)W  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b 07>Iq8<mu  
H'jo 3d~+  
ON a.username=b.username F+9(*|x%  
j5m]zh5\J=  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: Dj{=Y`Tw  
'e8O \FOf  
SELECT a.*,b.* u(g9-O  
EO"G(v  
FROM city as a FULL OUTER JOIN user as b ( #rhD}  
U?j[ 8z  
ON a.username=b.username c Sktm&SP  
5 &s<&h  
(三)交叉连接 ):nC&M\W~  
k.wm{d]J  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 {=,+;/0  
^@;P-0Sy  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Z(BZG O<  
:)kWQQ+,  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 x*wr8$@J  
.Kssc lSD1  
于6*8=48行。 838@jip  
3PEW0b*]Pf  
SELECT type,pub_name oI x!?,1  
]>,Lw=_[_  
FROM titles CROSS JOIN publishers ,Ofou8C6  
!$#8Z".{v{  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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