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

[原创]SQL查询语句使用

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

一、简单查询  *<h  
N!4xP.Ps  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 iTtAj~dfZ  
Aj)< 8  
表或视图、以及搜索条件等。 \c@qtIc  
P*qNRP%  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 BIB>U W  
o^"d2=  
SELECT nickname,email 7l|>  
~QQ23k&  
FROM testtable R4J>M@-0v  
86) 3XE[ 5  
WHERE name='张三' hZF&PV5H  
m@ 'I|!^  
(一)选择列表 U*Q5ff7M6"  
@|*Z0bn'  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 XC8z|A-@  
/x"pj3  
量和全局变量)等构成。 >+c`GpZH  
"x)pp  
1、选择所有列 ,Elga}7u  
\~1zAiSd>#  
例如,下面语句显示testtable表中所有列的数据: K Lv  
3B_} :  
SELECT * 4Hd@U&E  
7=ga_2  
FROM testtable >kLH6.  
PXQ9P<m  
2、选择部分列并指定它们的显示次序 h ?qYy$  
.f!eRV.&  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 RU ,N_GV   
0 ?*I_[Y  
例如: m^s2kB4A[  
-gX2{dW  
SELECT nickname,email g>oYEFFJ  
`8 b6 /  
FROM testtable SJuf`  
Pc-8L]2oaF  
3、更改列标题 qt&"cw  
JSZ j0_ B  
在选择列表中,可重新指定列标题。定义格式为: 5FR#_}k]_F  
6+d"3-R.  
列标题=列名 d/99!+r  
;[\2/$-  
列名 列标题 Gw\HL  
r.G/f{=<@  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 KD3To%  
:?XHZ  
标题: eR 2T<7G  
JFk|Uqs(  
SELECT 昵称=nickname,电子邮件=email _q 9lr8hx  
q,>F#A '  
FROM testtable  WD do{  
z# ?w/NE  
4、删除重复行 y Q @=\'  
EqDYQ 7  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 u9^;~i,  
4uVmhjT:X  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 *UxB`iA  
bOGDz|H``  
5、限制返回的行数 Ch!Q?4  
|+=:x]#vV  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 3jdB8a]T_  
:/[ZgreN6  
表示一百分数,指定返回的行数等于总行数的百分之几。 J?ZVzKTb>}  
Pds*M?&F  
例如: 4qXUk:C@m  
8ch~UBq/  
SELECT TOP 2 * `1v!sSR0R  
$aI MQ[(  
FROM testtable \gQ+@O&+  
S<9d^= a  
SELECT TOP 20 PERCENT * l@F e(^5E  
umrI4.1c  
FROM testtable 2o5< nGn  
?4?jG3p  
(二)FROM子句 Mz. &d:  
fJ lN'F7  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, >!p K94  
5GxM?%\  
它们之间用逗号分隔。 9wJmX<Rm  
v@s`l#  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 ;{7lc9uRj  
@"7dk.|  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 2EcYO$R!  
~\IDg/9 Cj  
使用下面语句格式加以限定: aC]l({-0  
")gCA:1-  
SELECT username,citytable.cityid $^aXVy5p  
Q+M3Pqy  
FROM usertable,citytable w% -!dbmb%  
nt`l6b  
WHERE usertable.cityid=citytable.cityid RSeezP6#  
H 6<@  
在FROM子句中可用以下两种格式为表或视图指定别名: 5j 01Mx A  
|MrH@v7S  
表名 as 别名 Ntrn("!  
LZ]pyoi  
表名 别名 hQx e0Pdt  
b!P;xLcb  
例如上面语句可用表的别名格式表示为: J+|V[E<x  
Q&a<9e&  
SELECT username,b.cityid d~$t{46  
SLB iQd.  
FROM usertable a,citytable b \> dG'  
&.4a  
WHERE a.cityid=b.cityid df rr.i  
3AL=*qq  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Q>*K/%KD  
gb#wrI  
例如: LKY Q?  
"G)?  E|  
SELECT a.au_fname+a.au_lname AG0x)  
FMr$cKvE]W  
FROM authors a,titleauthor ta P.J}\;S T  
U}Fk%Jj  
(SELECT title_id,title 9'aR-tFun;  
}}2hI`   
FROM titles \$UU/\  
},ZL8l{  
WHERE ytd_sales>10000 FKm2slzb  
"t`e68{Ls  
) AS t %LW~oI.  
<v^.FxId  
WHERE a.au_id=ta.au_id -e\kIK %  
lv&wp@  
AND ta.title_id=t.title_id &bx,6dX  
_erH]E| [  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 9K(b Z {  
Q :|E  
(三)使用WHERE子句设置查询条件 ^O"`.2O1  
2yc\A3ft#  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 4D$E  
Q+N @j]'  
SELECT * Y" |U$  
w$HC!  
FROM usertable <[~M|OL9q,  
IrM3Uh  
WHERE age>20 gI{F"7fa=  
`-2`UGB-  
WHERE子句可包括各种条件运算符: QKQy)g  
akwVU\RP  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< ArM e[t0$  
~!u94_:  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… dGN*K}5  
@) wXP@7  
NOT BETWEEN…AND… }c:0cl  
qQryv_QP  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) Jy$-)  
J],BO\ECH  
NOT IN (项1,项2……) c6.|; 4  
c5u?\  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE =p:6u_@XWj  
dksnW!  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL ~Q\[b%>J  
pTd@i1%Nr  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR i ib-\j4d  
i^Q^F  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 cl5:|)  
<L 0_< T  
2、列表运算符例:country IN ('Germany','China') iLei-\w6y  
3]A'C&  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 I115Rp0  
*}=W wG  
varchar、text、ntext、datetime和smalldatetime等类型查询。 y6\#{   
YTsn;3d]}  
可使用以下通配字符: V#Eq74ic  
5@\<:Zmi  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 dfce/QOV  
elQ44)TrQ  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ?:c hAN@  
)Q`<O  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 aQuENsB  
i=rW{0c%  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 n$9!G  
kQtl&{;k?  
例如: _Yv9u'q"  
J<D =\  
限制以Publishing结尾,使用LIKE '%Publishing' 3@SfCG&|e  
pK%'S  
限制以A开头:LIKE '[A]%' ! >V 1zk  
!+U.)u9 '  
限制以A开头外:LIKE '[^A]%' na>B{6  
-lHJ\=  
4、空值判断符例WHERE age IS NULL >"b"K{t  
ZO}*^  
5、逻辑运算符:优先级为NOT、AND、OR 5NK:94&JE  
z Ey&%Ok  
(四)查询结果排序 9i@*\Ada  
w*x}4wW  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: F);C?SW"  
?*HlAVDcFT  
ORDER BY {column_name [ASC|DESC]} [,…n] Oi RqqD  
i "xq SLf=  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 O`4X[r1LD  
Q{l;8MCL  
序。 <=lP6B  
hsh W5j  
例如: 7e4\BzCC  
5 ,HNb  
SELECT * n!2|;|$}Z  
1JY4E2Q  
FROM usertable @%K 8 oYK  
D  UeT  
ORDER BY age desc,userid ASC &yuerNK  
ZsE8eD  
另外,可以根据表达式进行排序。 xxYFWvi  
1E(pJu'K  
  d)@M MF  
i*3_ivc)  
二、联合查询 Ek:u[Uw\  
/V^S)5r  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 *)Y;`Yg$  
}[|"db  
合查询。UNION的语法格式为: mmi~A<  
K)n(U9#  
select_statement =e63>*M|  
& b%6pVj  
UNION [ALL] selectstatement ,b/0_Q  
>2ct1_  
[UNION [ALL] selectstatement][…n] DWDe5$^{  
Zn/1uWO  
其中selectstatement为待联合的SELECT查询语句。 Q{RHW@_/  
W'[!4RQL  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 VYOO8MQI  
y]k`}&-~  
行。 HO' HkVA  
3WhJ,~o-y  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 DwI)?a_+  
6*%lnd+_  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 D:f#  
HHdc[pJ0D  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 ]l4\/E W6  
,YH.n>`s+  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 R!`#pklB  
9P]TIV.  
型,系统将低精度的数据类型转换为高精度的数据类型。 .Xr_BJ _  
{\k9%2V*+  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: Mc.KLz&,FC  
~"(1~7_  
查询1 UNION (查询2 UNION 查询3) `g#\ Ws  
Y?> S.B7  
  dJkT Hmw  
:=* -x  
  V[% r5!83H  
0pu'K)Rb  
三、连接查询 !R-UL#w9W'  
BR|dW4\  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 ~{HA!C#  
r J&1[=s  
数据库管理系统的一个标志。 ='s2S5#1  
{KR/ TQ?A  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 Z-WWp#b  
q,2 @X~T  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 P9c1NX\-  
?[kO= hs  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 A!NT 2YdHZ  
4>(?R[:p)  
查询。 #df Aqg'  
371E S4  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 &c A?|(7-  
u*"tZ+|m  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 yfV{2[8ux  
c$p1Sovw  
SQL-92标准所定义的FROM子句的连接语法格式为: 9"/{gf3D  
H94$Xi"Bd  
FROM join_table join_type join_table 9[:nW p^  
aPWFb.JO4  
[ON (join_condition)] J9 /w_,,R$  
f}*Xz.[bCp  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 iud%X51  
)p&xpB(  
个表操作的连接又称做自连接。 ]J~5{srq:  
U9Y'eP.2  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 u+{5c5_  
r,F'Jd5  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 (33[N  
u{J:wb  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 ) m?oQ#`m  
/+'@}u |  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) -5.>9+W8I  
j&8U:Q,  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 B^eea[  
+1e*>jE  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 g-6!+>w*>e  
18a6i^7  
数据行。 -O2Qz zE&  
yp8 .\.  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 cLamqZf3  
i3YAK$w;&  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 aX0sy\Z]j  
^E>}A  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 O#9Q+BD  
h4sEH  
运算符等构成。  xU)~)eK  
P||u{]vU  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 brZ3T`p+.P  
wp$SO^?-  
连接。例如: LM0 TSB?  
!m78/[LW  
SELECT p1.pub_id,p2.pub_id,p1.pr_info k~Gjfo  
WMrK8e'  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 T_pE'U%[  
1298&C@  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) I4u'b?* je  
i;yz%Ug  
(一)内连接 -^C;WFh8)  
#[J..i/h  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 AX[/S8|6  
G>cTqD6gT  
三种: `lr\V;o!  
Jg^tr>I~  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 SxMh '  
I#9A\.pO  
表中的所有列,包括其中的重复列。 UT"L5{c  
l~!#<=.  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 ^fH]Rlx  
]kc]YO7i%R  
运算符包括>、>=、<=、<、!>、!<和<>。 ^1}}-9q  
hX_;gR&R  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 >C@fSmnOM  
a ipvG  
结果集合中所包括的列,并删除连接表中的重复列。 MiN68x9  
Ro?yCy:L'  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: 0p! [&O  
IgZX,4i=o  
SELECT * ==Ju2D?%  
f'*HP%+Y  
FROM authors AS a INNER JOIN publishers AS p >[ywrB ?T  
julAN$2  
ON a.city=p.city {_PV~8u  
VAV@Qn  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): I C7n;n9  
:x= ZvAvo  
SELECT a.*,p.pub_id,p.pub_name,p.country r0?`t!% V  
PE+N5n2Tl  
FROM authors AS a INNER JOIN publishers AS p kf^Wzp  
E/Y.f  
ON a.city=p.city wHdq:,0-!  
0W#.$X5  
(二)外连接 W&6ye  
@zSoPDYv,  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 H`m| R  
dc"Vc 3)  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 HA"LU;5>2J  
L2AZ0E"ub  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 -x5^>+Y4  
o"K{^ L~u  
如下面使用左外连接将论坛内容和作者信息连接起来: @~/LsYA:  
1,BtOzuRo  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b QZ%_hvY[%>  
IN),Lu0K  
ON a.username=b.username DS-Kot(k(z  
<"aPoGda  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: e$ E=n  
[G4#DP\t>p  
SELECT a.*,b.* XA>@0E>1r  
*T*MLD]Q  
FROM city as a FULL OUTER JOIN user as b H|==i2V{  
]'M Ly#9  
ON a.username=b.username *(s)CWf  
Wv$e/N`l  
(三)交叉连接 Aln\:1MU  
T3Qa[>+\  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 '0z@Jevd?  
8M8=uw~#  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 P7<~S8)Y  
zLC\Rc4  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 )=ZWn,ZB  
xs+MvXTC  
于6*8=48行。 : !J!l u  
'9H]S Ew  
SELECT type,pub_name hZ5h(CQ?"#  
X|@|ZRN  
FROM titles CROSS JOIN publishers 8BC}D+q  
(Kv[~W7lb  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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