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

[原创]SQL查询语句使用

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

一、简单查询 W0f^!}f(  
Rn?JMM]  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 #s{^fUN6  
9vV==A#  
表或视图、以及搜索条件等。 3&y-xZu]  
AXlVH%'  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 S~3|1Hw*tN  
inaO{ny y  
SELECT nickname,email Rf!v{\  
yh E%X  
FROM testtable  |,$&jSe  
N6._J b  
WHERE name='张三' %+l95Dv1  
 )kWxp  
(一)选择列表 ~z:]rgX  
q\@Zf}  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 UQu6JkbLL  
dx@dnWRT,  
量和全局变量)等构成。 q}Q G<%VR  
G!Brt&_'  
1、选择所有列 3Q$ 4`p;  
;5ki$)v"  
例如,下面语句显示testtable表中所有列的数据: =Ydrct  
>=0]7k;  
SELECT * T_D3WHp  
_Q1p_sdg  
FROM testtable $E@n;0P  
&x1A {j_  
2、选择部分列并指定它们的显示次序 c-k3<|H`  
P*6m~`"5  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 !.'D"Me>  
xqX3uq  
例如: 8JY0]G6  
!i t orSl  
SELECT nickname,email q@wD@_  
G?}?>O  
FROM testtable IB;yL/T  
dy_Uh)$$|g  
3、更改列标题 ;O}%SCF7  
f]i"tqoI  
在选择列表中,可重新指定列标题。定义格式为: =6~  
K;6#v%  
列标题=列名 :GIBB=D9  
gkd4)\9  
列名 列标题 gk|>E[.  
oJ4HvrUO  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 tY;<S}[@7w  
0I.KHIB k  
标题: %j\&}>P4$  
t)&U'^  
SELECT 昵称=nickname,电子邮件=email o4" [{LyT  
J]U_A/f  
FROM testtable <mFDC?j  
m+!.H\  
4、删除重复行 HF FG4'  
DT`HS/~fH  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 *V kaFQZ$,  
bJIYe ld  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 )9nW`d+  
zu1"`K3b  
5、限制返回的行数 '6M6e(  
4z(~)#'^  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 b1?^9c#0d  
?(gha  
表示一百分数,指定返回的行数等于总行数的百分之几。 G*4I;'6  
c K\   
例如: mS'Ad<  
j{Px}f(=  
SELECT TOP 2 * Z4i))%or  
3*<@PXpK&  
FROM testtable Z;G*wM"  
F- -g?Q^  
SELECT TOP 20 PERCENT * D>y5&`  
&)OI!^ (  
FROM testtable 8r(a wp  
\oWpyT _  
(二)FROM子句 zwV!6xG  
\ UrD%;sq  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 08xo_Oysq  
?XY'<]o E  
它们之间用逗号分隔。 th73eC'  
4*}&nmW  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 2A\b-;4EP  
r<ww%2HTS  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 LL e*| :  
p/ (Z2N"  
使用下面语句格式加以限定: #$Zx].[lc  
R%szN.cI  
SELECT username,citytable.cityid  oYN"L  
_\4#I(  
FROM usertable,citytable :2KHiT5  
=H)]HxEEM  
WHERE usertable.cityid=citytable.cityid le \f:  
trDw|WA  
在FROM子句中可用以下两种格式为表或视图指定别名: !Wr<T!T  
uZL]mwkj]  
表名 as 别名 4m< ]qw  
 skl3/!  
表名 别名 vSHPN|*  
JlnmG<WLT  
例如上面语句可用表的别名格式表示为:  a[nSUlT&  
F:m6Mf7L  
SELECT username,b.cityid D=^&?@k<  
*1EmK.-'u  
FROM usertable a,citytable b _$R=F/88  
>h8m)Q  
WHERE a.cityid=b.cityid ,^G+<T6  
Jpduk&u  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 b3%x&H<j  
MZ}0.KmaZ  
例如: T */I4"  
r{.pXf  
SELECT a.au_fname+a.au_lname j;.P  
B}TY+@  
FROM authors a,titleauthor ta i6HRG\9nU  
<<LLEdB  
(SELECT title_id,title `R2Iw I&  
5)< Y3nU~  
FROM titles /V*SI!C<f  
YA pC|R,^  
WHERE ytd_sales>10000 ^>E>\uz0v  
_]5UuIMl  
) AS t 1\( N,'h  
Y#c439&  
WHERE a.au_id=ta.au_id _b<;n|^  
Z5TA4Q+Q  
AND ta.title_id=t.title_id @ovaOX  
we _CF*zj  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 ]AA|BeL?|  
d2eXN3"  
(三)使用WHERE子句设置查询条件 XB!qPh .  
C"kfxpCi  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: 6qDt 6uB  
%!t9)pNc  
SELECT * r5xm7- `c  
X`_tm3HC  
FROM usertable 5[)5K?%  
8|@) #:  
WHERE age>20 jv.tg,c_6  
vk E]$4P[$  
WHERE子句可包括各种条件运算符: i&H^xgm  
j-BNHX  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< JL G!;sov  
ifS#9N|8  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… %JDQ[%3qY  
L|WrdT D;  
NOT BETWEEN…AND… GcN}I=4|  
Lx>[`QT  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) +- qk\sQ  
ez32k[eV!  
NOT IN (项1,项2……) ,oH\rrglf  
}*bp4<|  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE <eEIR  
B](R(x>L  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL 33<{1Y[Q6E  
0p.MH~mx  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR zwC ,,U  
5{(4%  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 .+S%hT,v6i  
sxr,] @  
2、列表运算符例:country IN ('Germany','China') d8;kM`U  
i tNuY<"  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 Fk49~z   
cEa8l~GC<  
varchar、text、ntext、datetime和smalldatetime等类型查询。 Fy\q>(v.  
n@tt.n!{l  
可使用以下通配字符: xGyl7$J  
*bo| F%NAz  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 kttJTP77t  
 ^[SW07o~  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 aPlEM_escS  
uxn+.fA  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 mC@v,"  
H0&wn#);6R  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 *~GI-h  
=c \(]xX  
例如: f|(9+~K/7&  
Il4]1d|  
限制以Publishing结尾,使用LIKE '%Publishing' MOh&1]2j5  
9b >+ehjB  
限制以A开头:LIKE '[A]%' 4z P"h0  
mf g>69,w  
限制以A开头外:LIKE '[^A]%' Fc[vs52  
P !f{U;B  
4、空值判断符例WHERE age IS NULL \mLEwNhRY  
`W}pA mhj  
5、逻辑运算符:优先级为NOT、AND、OR ? ch?q~e)  
oU,8?( }'~  
(四)查询结果排序 9O&m7]3  
z*.G0DFw  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: 423%K$710  
, poc!n//  
ORDER BY {column_name [ASC|DESC]} [,…n] ]#4kqj}  
q !9;JrX  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 00D.Jn  
;bG?R0a  
序。 jMBM qQNU  
j5R0e}/r  
例如: p,k1*|j  
h1 (i/{}:  
SELECT * 1o/(fy  
0`.&U^dG  
FROM usertable /-!Fr:Ox>  
O)V;na  
ORDER BY age desc,userid ASC &8f/6dq  
h-"q <eY"  
另外,可以根据表达式进行排序。 c;/vzIJj  
VF11eZ"  
  4Ia'Yr  
,<+:xl   
二、联合查询 } l+_KA  
|LJv*  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 @TW:6v`  
v&G9HiH  
合查询。UNION的语法格式为: ,&3+w ~Ua  
Y(`Bc8h  
select_statement *YH!L{y  
):4)8@]5M  
UNION [ALL] selectstatement cQLPgE0  
~pp< T  
[UNION [ALL] selectstatement][…n] q&[G^9  
i[LnU#+  
其中selectstatement为待联合的SELECT查询语句。 ~M* UMF^  
yuC$S&Y >!  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 6oQ7u90z*  
y`$qcEw  
行。 'LG\]h>+)  
sF)$<[w  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 IAkQR0fcN  
0TV16 --  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 &k|EG![  
m4W (h6  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 q]f7D\ M  
i@6g9\x+  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 |FT.x9e-  
m;"[b (u  
型,系统将低精度的数据类型转换为高精度的数据类型。 `K0.6i [p  
~X2 # z |  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: ~)$R'=  
VJ'-"8tY&  
查询1 UNION (查询2 UNION 查询3) &FRf-6/  
 ~}p k^FA  
  E`HA0/  
c"k nzB vy  
  /|NyO+Io  
c99|+i50  
三、连接查询 XFs7kTY  
 :Kyr}-  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 _}j>  
]3|h6KWq  
数据库管理系统的一个标志。 Pl|I{l*o(`  
lMW6D0^  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 ?$;&DoE  
8hy1yt6t4~  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 HQ=pf >  
ZTqt4H  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 $l.8  
;W+1 H !  
查询。 :#sBNy  
%#4;'\'5  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 ;j;U9-oh  
 WSeiW  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 3Jd a:  
&q4~WRnzJk  
SQL-92标准所定义的FROM子句的连接语法格式为: H/W&a2R^P  
.AX%6+o  
FROM join_table join_type join_table s$9ow<oi]  
R.* k7-(;  
[ON (join_condition)] X_JC1  
vm*9xs  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 h$~$a;2cR  
P*Jk 8MK#G  
个表操作的连接又称做自连接。 .ozBa778u  
>d .|I&  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 _u_|U  
Z$Ps_Ik  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 $h k_v~zM  
>>R)?24,<  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。  ;1,#rTs  
ZFX}=?+  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) : +^`VLIf  
N8r+Q%ov  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 `.VkR5/  
PMQ31f/zf  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 c}=[r1M*  
&,XPMT  
数据行。 |M<R{Tt}nf  
} -hH2  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 \sVzBHy d  
hI<$lEB  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 },5LrX`L  
@ohJ'  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 '@hnqcqXq  
A-\n"}4  
运算符等构成。 y fS  
D 5Z7?Y  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 rY6bc\?`x  
{[H#lX 4  
连接。例如: :^QV,d<C  
rA_r$X  
SELECT p1.pub_id,p2.pub_id,p1.pr_info _cfAJ)8=  
lg (>n&  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 kmfz.:j{  
=>TXo@rVN  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) sh<JB`^$(?  
8p~[8}  
(一)内连接 K}S=f\Q]  
? zic1i  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 y(K:,CI  
b$Bq#vdg:  
三种: <C*%N;F5R  
}2?-kj7  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Si#XF[/  
_{i- .;K  
表中的所有列,包括其中的重复列。 -cXVkH{  
E&W4`{6K4  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 .W-=VzWX  
OHF:E44k  
运算符包括>、>=、<=、<、!>、!<和<>。 79lG~BGE  
?0E-Lac=  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 #>$w9}gFi  
| qf8y  
结果集合中所包括的列,并删除连接表中的重复列。 C\[g>_J  
Q},uM_" +  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: C%Op[H3  
DGAg#jh  
SELECT * ORV'dr  
37,)/8]lG  
FROM authors AS a INNER JOIN publishers AS p /z,+W9`  
M^A;tPw  
ON a.city=p.city Q F_K^(  
2-wvL&pi)  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): l]e7  
!jJH}o/KW  
SELECT a.*,p.pub_id,p.pub_name,p.country fAR0GOI  
TlBu3z'P  
FROM authors AS a INNER JOIN publishers AS p z1~U#  
Q# $dp  
ON a.city=p.city T^ah'WmNw  
ZZ;V5o6E  
(二)外连接 Vuo 8[h>  
{[B`q  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 iuq%Q\0@w  
b{JxTT}03  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 o{QPW  
!}uev  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 ;,_c1x/F  
?jBh=X\]:  
如下面使用左外连接将论坛内容和作者信息连接起来: &4l >_  
9=^4p=1J  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b .l&<-l;UQ  
</d&bS  
ON a.username=b.username D8_-Dvp7H  
[W,maT M"  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: +4p gPv  
Vt," 5c  
SELECT a.*,b.* I:#Es.  
O/Wc@Ln  
FROM city as a FULL OUTER JOIN user as b BcTV5Wcr  
m&#a M8:\  
ON a.username=b.username = l9H]`T/  
=}AwA5G  
(三)交叉连接 A|U_$!cLZ  
D3%`vq u&  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 vo DTU]pf  
jG3i )ALx  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 r*l:F{  
Aa/lKiiz  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 lN^} qg><  
nM)H2'%kL&  
于6*8=48行。 [P_1a`b  
@oL<Ioh  
SELECT type,pub_name vl}uHdeP9  
pn~$u  
FROM titles CROSS JOIN publishers ^E8eW  
~\m|pxcj  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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