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

[原创]SQL查询语句使用

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

一、简单查询 V]kGcS}  
]v\egfW,W  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 DEQE7.]3q  
CL'Xip')T  
表或视图、以及搜索条件等。 M$4=q((0  
~z _](HKoS  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 /`O]etr`d  
m":SE?{{&  
SELECT nickname,email TFYTvUn  
G!VF*yW8  
FROM testtable u !3]RGJ  
K7xWE,y  
WHERE name='张三' 6^IqSNn-  
'Ywpdzz[  
(一)选择列表 P&%eIgAOL  
"(\) &G  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 =i^<a7M~  
4,F3@m:<  
量和全局变量)等构成。 Cq*}b4^;  
9kX=99kf[  
1、选择所有列 M|({ 4C  
%w8GGm8^/  
例如,下面语句显示testtable表中所有列的数据: _:Jp*z  
oS#'u 1k  
SELECT * {pb9UUP2  
~'NpM#A  
FROM testtable ^2C /!Y<  
\9(- /rE  
2、选择部分列并指定它们的显示次序 ta4JWllf  
(YYj3#|  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 8lWH=kA\  
o!toO&=  
例如: ^>X)"'0+  
M9s43XL(&  
SELECT nickname,email I' ! r  
4OOn,09  
FROM testtable \SiHrr5  
S2 "=B&,}  
3、更改列标题 m UWkb  
=0PRAc  
在选择列表中,可重新指定列标题。定义格式为: B?#kW!wj  
bKuj po6  
列标题=列名 C3\E.u ?  
"7yNKO;W  
列名 列标题 [l':G]  
y5/'!L)g  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 `/w\2n  
* K,hrpYR  
标题: $' (QTEM  
) Kc%8hBv  
SELECT 昵称=nickname,电子邮件=email 6mu<&m@  
)W1(tEq59  
FROM testtable BU9J_rCIv  
Zgg'9E  
4、删除重复行  gmRT1T  
Ki/'Ic1  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 2sqm7th  
&whX*IZ{  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 V@v1a@=W  
wMz-U- z  
5、限制返回的行数 v0Ai!#  
iIsEQh  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 I%9bPQ  
3T|Y}  
表示一百分数,指定返回的行数等于总行数的百分之几。 Ts(t:^  
[Y$5zeA  
例如: 3duG.iUlL  
Zn@W7c,_I  
SELECT TOP 2 * l@N;sI<O-  
OQ(D5GR:4  
FROM testtable ok`]:gf  
[6; N3?+  
SELECT TOP 20 PERCENT * s !#HZK  
zb5N,!%r  
FROM testtable Xb]=:x(  
wqlcLIJPR  
(二)FROM子句 .!(,$'(@=  
Z&FkLww  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, x" 'KW (  
K DYYB6|  
它们之间用逗号分隔。 wfxOx$]z K  
X"[dQ_o  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 k7^R,.c@  
'ySljo*It  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 ~n[b^b  
?wd|G4.Vo  
使用下面语句格式加以限定: I?a8h`WS+  
>[ug zJ  
SELECT username,citytable.cityid v@8S5KJ  
P</s)"@  
FROM usertable,citytable _+ twq i  
PSTu/^  
WHERE usertable.cityid=citytable.cityid d/XlV]#2x\  
+ <Z+-  
在FROM子句中可用以下两种格式为表或视图指定别名: d5DP^u  
$]@O/[  
表名 as 别名 gbm0H-A:*  
Tu]&^[B('  
表名 别名 Y4mC_4EU  
`gBD_0<T7  
例如上面语句可用表的别名格式表示为: _QR g7  
iQt!PMF.  
SELECT username,b.cityid b5A Gk  
F:%^&%\  
FROM usertable a,citytable b I4)Nb WQ  
?75\>NiR  
WHERE a.cityid=b.cityid dQ:?<zZ  
8q?;2w\l  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 >']+OrQH  
W*k`  
例如: v&xKi>A il  
z!fdx|PUX  
SELECT a.au_fname+a.au_lname u(W^Nou/+  
c~P)4(udT  
FROM authors a,titleauthor ta $v]T8|h  
o2DtCU-A  
(SELECT title_id,title jFtg.SD  
v btAq^1  
FROM titles RCzV5g  
P: n#S%  
WHERE ytd_sales>10000 _=ugxL #eB  
UL+E,=  
) AS t Fse['O~  
eY T8$  
WHERE a.au_id=ta.au_id 9"~9hOEct  
(]2<?x*  
AND ta.title_id=t.title_id Hk,lX r  
j"5Pe  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 |K%}}g[<e;  
(@ "=F6P  
(三)使用WHERE子句设置查询条件 v"rl5x  
2G?$X?  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 1t+%Gv^sK  
tJ"az=?  
SELECT * XdpF&B&K7Q  
Rho5s@N7  
FROM usertable @0$}? 2  
`)6>nPr7P  
WHERE age>20 ?cJY B)  
~z5@V5 z  
WHERE子句可包括各种条件运算符: 80Ag  
Y)|~:& tZ  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 3 4SA~5  
[g#s&bF  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… gI)u}JX  
8x9Rm  
NOT BETWEEN…AND… 4IZlUJ?j+c  
sTkIR5Z  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) < kz[:n:  
jo)6 %w]  
NOT IN (项1,项2……) wxj>W[V  
cf)J )  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE iNQ0p:<k  
22>;vM."  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL /}=a{J  
4d0#86l~J/  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR tRteyNA  
NvQ%J+  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 .)7:=  
bp#fyG"  
2、列表运算符例:country IN ('Germany','China') j&WL*XP&5  
V5AW&kfd  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 Z'Q*L?E8M  
{b1UX9y  
varchar、text、ntext、datetime和smalldatetime等类型查询。 c` , 2h#  
9x? B5Ap[  
可使用以下通配字符: }p=g*Zo*C;  
ZHCr2^w6  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Q[uAIyv0  
77*qkKr  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 If;R?j0;Q  
4O(@'#LLz  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 7S<UFj   
X D)  8?  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Ra[>P _  
dx@QWTNE  
例如: M;KA]fmc  
rgqQxe=  
限制以Publishing结尾,使用LIKE '%Publishing' Iq^if>  
%H& ].47  
限制以A开头:LIKE '[A]%' %&+TbDE+T  
E"#Xc@  
限制以A开头外:LIKE '[^A]%' 1CkdpYjsj  
mibpG9+d  
4、空值判断符例WHERE age IS NULL  F~6#LT  
^ S  
5、逻辑运算符:优先级为NOT、AND、OR OQScW2a&  
Q`A6(y/s?  
(四)查询结果排序 @*(4dt:V  
"ZT.k5Z  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: _y vLu j  
|CIC$2u  
ORDER BY {column_name [ASC|DESC]} [,…n] f@@s1gdb  
blahi]{Y9  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 #r<?v  
Y%Ieg.o  
序。 wAFW*rO5o  
]\Xc9N8w  
例如: Gf0,RH+  
02\JzBU  
SELECT * m!O;>D  
!8R@@,_v  
FROM usertable }H RK?.Vj:  
*5OCqU+g  
ORDER BY age desc,userid ASC Cqx v"NN  
C!&y   
另外,可以根据表达式进行排序。 .VM3D0aV  
4Po)xo  
  >o~Z>lr  
<x0H@?f7  
二、联合查询 c*;7yh&%  
%}&(h/= e  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 v+=k-;-  
<&<,l58[c  
合查询。UNION的语法格式为: [ohBPQO  
s+Q;pRZW{  
select_statement aDL*W@1S  
*hdC?m. _  
UNION [ALL] selectstatement ]]BOk  
C4\,z\Q  
[UNION [ALL] selectstatement][…n] 9o0!m Cq  
$bsH$N#6T  
其中selectstatement为待联合的SELECT查询语句。 {G3i0 r  
347eis'  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 y'} O)lO1  
p $ouh  
行。 lA^+Flh  
{6G?[ `&ca  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 .Cz %:%9  
* R d#{Io7  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 2p!"p`b~  
W^\d^)  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 Pc_VY>Ty  
JOb MZA$  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 2c(aO[%h9  
Jblj^n?Bm  
型,系统将低精度的数据类型转换为高精度的数据类型。 A8DFm{})c  
z42F,4Gk  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 6!q#x[A  
^qvZ XS  
查询1 UNION (查询2 UNION 查询3) Uxu\u0*  
E9}{1A  
  ymN!-x8q>'  
yx>_scv,T  
  ?okx<'"[  
IQH[Q9%  
三、连接查询 bb-qO#E  
g(ogXA1  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 v [njdP  
e]Fp=*#  
数据库管理系统的一个标志。 Sr_VL:Gg  
 dy>!KO  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 bh p5<N  
'h1b1,b~  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 T=Z.TG|lIx  
v2+!1r7@  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 ^tH#YlV4>9  
hk>;pU(  
查询。 I?Aj.{{$G%  
)C%N]9FvY  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 kA wNly  
sOU_j:A80;  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 [I;^^#'P  
5W? v'"  
SQL-92标准所定义的FROM子句的连接语法格式为: ,*I@  
g I]GUD-  
FROM join_table join_type join_table H%F>@(U  
6Jz^  
[ON (join_condition)] h"+ `13  
MV>$BW  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 ]3iH[,KU3  
Jc6R{C  
个表操作的连接又称做自连接。 ?.=}pAub  
|JF@6  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 e8=YGx^o`  
R&f^+0%f  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 E:`v+S_h  
rN)V[5R#M  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 {a(&J6$VE  
"&.S&=FlI  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 9=X)ung9  
LE6.nmvS  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 = u[#2!  
hr05L<?H  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 *f%>YxF  
txgQ"MGA%  
数据行。 aGZi9O7G}  
3r+.N  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 nC1zzFFJ  
Y?J"wdWJNB  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 /4\wn?f  
7R4z}2F2  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 7nq3S  
<S75($  
运算符等构成。 ikD1N  
8T)&`dM6P~  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 T:]L/wCj  
BQH}6ueZ  
连接。例如: F[ ajOb8  
=3ioQZ^Vz  
SELECT p1.pub_id,p2.pub_id,p1.pr_info _5 ^I.5Z3  
5{e,L>H<  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 j^tW Iz  
39wa|:I  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) sZ,Y60s8a  
L"jY+{oLIJ  
(一)内连接 B.r4$:+jb2  
Ian[LbCWB  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 QqNW}: #  
66x?A0P  
三种: $$APgj"|<  
HB+|WW t>  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 EtbnE*S  
b$ %0.s  
表中的所有列,包括其中的重复列。 x<Vm5j  
,GWNL m\5  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 k3?rp`V1  
;W>Cqg=  
运算符包括>、>=、<=、<、!>、!<和<>。 c~QS9)=E  
=OIw*L8C"I  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 Wq*b~Lw  
D:^$4}h f  
结果集合中所包括的列,并删除连接表中的重复列。 K~=UUB  
WQ yLf;!Lz  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: wNFz*|n  
H{J'# 9H  
SELECT * g~V+4+  
qd3Q}Lk  
FROM authors AS a INNER JOIN publishers AS p No]~jnqDM  
o<IAeH {+  
ON a.city=p.city /~*_x=p:  
jZ`;Cy\<B  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): BH]Ynu&o  
akw,P$i  
SELECT a.*,p.pub_id,p.pub_name,p.country bVP"(H]  
STZPYeXE  
FROM authors AS a INNER JOIN publishers AS p s,#>m*Rh  
;%tF58&  
ON a.city=p.city ljl^ GFo  
`.s({/|[  
(二)外连接 z'T) =ycT  
Zo1,1O  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 ;XM{o:1Y[  
F}Vr:~  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 2'=T[<nNB  
ifN64`AhRX  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 uqz]J$  
}D+}DPL{^  
如下面使用左外连接将论坛内容和作者信息连接起来: X7k.zlH7T  
iq( )8nxi  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b r.7$&BCng  
)95f*wte  
ON a.username=b.username p<=$&*  
{(r6e  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: cw iX8e"3  
45hF`b>%,  
SELECT a.*,b.* %v20~xW :o  
9z6XF]A  
FROM city as a FULL OUTER JOIN user as b y;/VB,4V  
Zd"^</ S  
ON a.username=b.username  : ]C~gc  
N('&jHF  
(三)交叉连接 n:MdYA5,m  
6@DF  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 fb^fVSh>  
]_N|L|]M  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 95el'K[R  
)"Ztlhs`#  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 d!eYqM7-G  
x.S3Zi}=  
于6*8=48行。 U&O: _>~  
 w@,zFV  
SELECT type,pub_name ZP{*.]Qu  
'7O3/GDK  
FROM titles CROSS JOIN publishers vVOh3{e|  
'],J$ge  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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