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

[原创]SQL查询语句使用

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

一、简单查询 3o6N&bQ b  
wsM5T B  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 Q?vGg{>  
7[Y<5T]  
表或视图、以及搜索条件等。 K2&pTA~OR  
^NP" m  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 ^Xh9:OBF  
TK'(\[E  
SELECT nickname,email t&ngOF  
X _XqT  
FROM testtable T1Xm^{  
k)4   
WHERE name='张三' Q+S>nL!*#1  
$AoN,B>  
(一)选择列表 ) ~X\W\  
pmfyvkLS  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 C0'Tua'  
c" yf>0  
量和全局变量)等构成。 KVJiCdg-  
DI+kO(S  
1、选择所有列 -B R&b2  
Ucv-}oa-?  
例如,下面语句显示testtable表中所有列的数据: HZR~r:_ i  
ns@b0'IF]  
SELECT * "",V\m  
-8g ;t3z  
FROM testtable q W) ,)i  
UAa2oY&  
2、选择部分列并指定它们的显示次序 2uz<n}IV  
yt$V<8a  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 UA}k"uM  
d!!5'/tmS  
例如:  u"tv6Qp  
X=-pNwO   
SELECT nickname,email |Zz3X  
.I[uXd  
FROM testtable 7x`uGmp1  
'H:lR1(,  
3、更改列标题 H=EvT'g  
pkhZW8O  
在选择列表中,可重新指定列标题。定义格式为: Aqq%HgY:t  
\S3C"P%w  
列标题=列名 /8lGP! z  
8xlj:5;(w  
列名 列标题 0/;T\9  
.hnGHX  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 8\/E/o3  
JQ!D8Ut  
标题: bc%7-%  
$f_Brc:n {  
SELECT 昵称=nickname,电子邮件=email ACc.&,!IZ  
>AV?g8B;  
FROM testtable -49OE*uF  
_<&IpT{w+  
4、删除重复行 KD=T04v  
J %URg=r  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 u JGYXlLE  
V\^?V|  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 19h8p>Sx0  
F(:+[$)  
5、限制返回的行数 ` Y"Rh[C  
!ZHPR:k|  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 FX 0^I 0  
n~k;9`  
表示一百分数,指定返回的行数等于总行数的百分之几。 uG~%/7Qt{  
'Q?nU^:F#  
例如: IKH#[jW'IB  
5Tkh6s  
SELECT TOP 2 * =]E;wWC  
qVx0VR1:  
FROM testtable 8g^OXZ   
c(i-~_  
SELECT TOP 20 PERCENT * s9zdg"c'  
dyD =R  
FROM testtable I"y=A7Nq  
OiZPL"Q(K  
(二)FROM子句 -(@dMY  
hBO I:4u[  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, h{VCx#!]  
bo`w( h_  
它们之间用逗号分隔。 Fn yA;,*  
^3F[^#"  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 0l!@bj  
26&^n Uy  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 AS'a'x>8>,  
79z(n[^  
使用下面语句格式加以限定: Xq1n1_Z  
vH9/}w2  
SELECT username,citytable.cityid wqK>=Ri_  
[-=PK\ B  
FROM usertable,citytable Rq<T2}K  
eZk [6H  
WHERE usertable.cityid=citytable.cityid 7?dB&m6W  
n@Y`g{{e~  
在FROM子句中可用以下两种格式为表或视图指定别名: ;XRLp:y  
/)e&4.6  
表名 as 别名 x?VX,9;j  
&S]\)&Yt  
表名 别名 -6aGcPq  
5a&[NN  
例如上面语句可用表的别名格式表示为: fYl$$.  
A!x_R {,yH  
SELECT username,b.cityid N yFa2Ihd  
pg;agtI  
FROM usertable a,citytable b S2@[F\|r  
TY],H=  
WHERE a.cityid=b.cityid Nj@k|_1  
(G*--+Gn  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 "9>~O`l,  
fr4#< 6,  
例如: 0bVtku K;G  
FDkRfhK  
SELECT a.au_fname+a.au_lname VX2 KE@  
1.4]T, `  
FROM authors a,titleauthor ta s 'u6Ep/V  
^8a,gA8.  
(SELECT title_id,title -"UK NB!  
<}L`d(E@f  
FROM titles k:nr!Y<  
[>=D9I@~  
WHERE ytd_sales>10000 '(7]jug  
]3BTL7r  
) AS t =\eM -"r  
Eg FV  
WHERE a.au_id=ta.au_id `_N8A A  
;^^u_SuH  
AND ta.title_id=t.title_id &&\ h%-Jc  
DvKM[z3j  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 Vr D?[&2pE  
n{6XtIoYq  
(三)使用WHERE子句设置查询条件 {Nuwz|Ci  
U"v(9m@  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: kOmTji7  
[-x~Q[  
SELECT * Nq/,41  
NIY0f@1z-  
FROM usertable >2_BL5<S  
MS)#S&  
WHERE age>20 U}x2,`PI  
h \hQ  
WHERE子句可包括各种条件运算符: 5wmH3g#0  
S#8wnHq  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< YR@@:n'TP  
1Thr74M  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… :z_D?UQ  
EW%%W6O6  
NOT BETWEEN…AND… L=O,OS+  
;]D@KxO$dJ  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) #'^!@+)  
tV<}!~0,*  
NOT IN (项1,项2……) KwndY,QD  
m"t\@f  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE ^/47 *vcN5  
DN2K4%cM%'  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL >_!pg<{,  
AU)"L_ i}  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR R] tHd=kf  
N)K};yMf  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 E ~<SEA  
o3P`y:&  
2、列表运算符例:country IN ('Germany','China') Qr Dzf e[  
:DXkAb2  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 +AhR7R!  
O8(;=exA  
varchar、text、ntext、datetime和smalldatetime等类型查询。 I\&..e0l  
q(M[ij  
可使用以下通配字符: .h~M&d!  
9$c0<~B\  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 P%z\^\p"5  
=QHW>v  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 <W2}^q7F^  
*91iFeKj=  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 &PI}o  
&?IOrHSv!  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 ~ ' 81  
BG_m}3j  
例如: p%EU,:I6  
.Qg!_C  
限制以Publishing结尾,使用LIKE '%Publishing' `<i|K*u  
6Xb\a^ q  
限制以A开头:LIKE '[A]%' b#(SDNo6  
>*(4evU  
限制以A开头外:LIKE '[^A]%' UK*+EEv  
S5*wUd*p#  
4、空值判断符例WHERE age IS NULL .^>[@w3  
m(,vym t  
5、逻辑运算符:优先级为NOT、AND、OR 0AP wk }  
nud,ag  
(四)查询结果排序 PwU}<Hrl]  
*/sVuD^b`  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: Z#BwJHh  
_v{,vLH  
ORDER BY {column_name [ASC|DESC]} [,…n] 6^F"np{w  
RXh0hD  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 kbJ/7  
/6B!& b2f  
序。 fQi7e5  
$IX>o&S@|  
例如: 4Z)`kS} =]  
`e .;P  
SELECT * ;ob-'  
7Oe |:Z  
FROM usertable w~y+Pv@   
]|18tVXc  
ORDER BY age desc,userid ASC zDeh#  
:BKY#uH~  
另外,可以根据表达式进行排序。 +8Yt91   
; 29q  
  !SEHDRp  
W-<E p<7{  
二、联合查询 }@=m[Zx#  
Un@B D}@\  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 4SCb9| /Q  
yS p]+  
合查询。UNION的语法格式为: 5<w"iqZ\?N  
uNZJNrV%  
select_statement <Z{\3X^  
y?GRxoCD"e  
UNION [ALL] selectstatement REDh`Wd  
Ay;=1g)8+f  
[UNION [ALL] selectstatement][…n] fp|!LU  
htk5\^(X  
其中selectstatement为待联合的SELECT查询语句。 #x$.  
,u^i0uOg  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 zD}dvI}  
mV^+`GWvo  
行。 I$xfCu  
v/=O:SM}  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 G 5w:  
_?#}@?  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 /f~ V(DK  
oRFHq>-.g  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 |VbF&*v`  
rD<G_%hP  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 P0uUVU=B|  
@;2,TY>Di  
型,系统将低精度的数据类型转换为高精度的数据类型。 8`XpcK-0  
= q9>~E{}  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: H8.U#%  
P9; =O$s  
查询1 UNION (查询2 UNION 查询3) GV#"2{t j  
EpSVHD:*  
  S~0 mY} m  
+Rn]6}5m\  
  |K| c  
%$ |=_K)Ks  
三、连接查询 ~f0Bu:A)  
NF&R}7L  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 'qwFVP  
>M[wh>  
数据库管理系统的一个标志。 m-S4"!bl  
eE5U|y)_  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 fw kX-ON  
$HT {}^B  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 q|BR-0yi  
f{MXH&d 1\  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 'AU(WHf  
Bpt%\LK\~O  
查询。 Pd9qY 8CP  
h'YC!hjp   
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 `K37&b;`[  
d?^bCf+<  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 {eA0I\c(C  
b!Pz~faXD  
SQL-92标准所定义的FROM子句的连接语法格式为: nylrF"'e  
udVEO n$  
FROM join_table join_type join_table |n3fAN  
eFS;+?bu  
[ON (join_condition)] \9T CP;{  
/\P3UrQ&]  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 C1_':-4  
1uBnU2E  
个表操作的连接又称做自连接。 MLg+ 9y  
XM o#LS  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 qE?*:$  
]pr(hk  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 5<h7+ %?t9  
;zVtJG`  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 {#"[h1  
0.C[/u[  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) dnt: U!TW@  
DU(QQ53  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 fvnj:3RK  
`%_yRJd|;  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 e<o{3*%p)  
OhMnG@@  
数据行。 at"-X?`d  
UkK`5p<D7  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 S_?{ <{  
ZP75zeH  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 {"hX_t  
t;X  !+  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 [yj-4v%u`  
'jh9n7mH  
运算符等构成。 [~e{58}J|  
xQ4 5B` $  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 %GS^=Qr  
'| (#^jAj  
连接。例如: Y&M}3H>E  
fui;F"+1  
SELECT p1.pub_id,p2.pub_id,p1.pr_info yneIY-g(p  
T= Q"| S]V  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 w5zr Ek#  
pIcvsd  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) CqHCJ '  
06pEA.ro  
(一)内连接 zIc%>?w  
#+dF3]X(&  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分  /6)6  
Yzo_ZvL  
三种:  g=W1y  
K[} 5bjh>  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Q'-g+aN  
:: IAXGH)  
表中的所有列,包括其中的重复列。 oAaUXkQE  
2}:{}pw  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 1=Npq=d  
+pDZ,c,  
运算符包括>、>=、<=、<、!>、!<和<>。 K??(>0Qr}r  
EG=~0j~  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 fsd,q?{a:  
J3/2>N]/}  
结果集合中所包括的列,并删除连接表中的重复列。 +M@p)pyu  
MP"Pqt  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: hH Kd+QpI  
,au-g)IFZ  
SELECT * 7nr+X Os  
c*F'x-TH  
FROM authors AS a INNER JOIN publishers AS p 6,Aj5jG  
Gp*U2LB  
ON a.city=p.city $TU)O^c  
, c3gW2E  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): 2|a@,TW}-  
tR`'( *wh  
SELECT a.*,p.pub_id,p.pub_name,p.country ;&="aD  
)X-~+X91 S  
FROM authors AS a INNER JOIN publishers AS p Iu(j"b#  
t<sy7e='  
ON a.city=p.city N=4`jy =  
!l2=J/LJj  
(二)外连接 J*4byu|  
}?PvNK]",  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 C|"BMam  
B_Qi  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 Tz/=\_}  
!{On_>` ,  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 dt -EY  
P|M#S9^]  
如下面使用左外连接将论坛内容和作者信息连接起来: v(Vm:oK,  
]<y _ =>  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ruqx #]-  
Um4$. BKD  
ON a.username=b.username  -w7g}  
+[W_J z  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: f+A!w8E  
rID_^g_tP8  
SELECT a.*,b.* vpTYfE  
4(2iR0N  
FROM city as a FULL OUTER JOIN user as b 'dTJE--@  
ur*a!U  
ON a.username=b.username |n9q 4*dN  
/m>%=_nz  
(三)交叉连接 e[5= ?p@|  
{/Mz /|%  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 W=Y?_Oz  
Xgq-r $O2X  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 "l83O8 L  
2y_R05O0  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 ykq9]Xqhv  
>$^v@jf  
于6*8=48行。 =^nb-9.  
e G8Zn<:s  
SELECT type,pub_name RDFOUqS  
P1 \:hh  
FROM titles CROSS JOIN publishers g7>p,  
bKAR}JM&  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五