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

[原创]SQL查询语句使用

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

一、简单查询 08g2? 5w"  
0%yPuY>  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 w BoP&l  
~b%dBn]n>  
表或视图、以及搜索条件等。 Oe;1f#` 5  
4.>y[_vu  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 7dOpJjv?)  
g\*2w @  
SELECT nickname,email P~PM$e  
f9O_M1=|lo  
FROM testtable d^0-|sx  
E#cu}zi  
WHERE name='张三' b{ tp qNm~  
a|k*A&5u2  
(一)选择列表 }{[JS=A^  
n;>r  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 FS*J8)  
" ^!=e72  
量和全局变量)等构成。 %H3 iX^}*  
UgOhx- 8  
1、选择所有列 ziv+*Qn_b4  
/74)c~.W  
例如,下面语句显示testtable表中所有列的数据: Gsz$H_  
dki3(  
SELECT * V|<'o<h8  
lQ4$d{m`  
FROM testtable Q,};O$h  
g+xcKfN{  
2、选择部分列并指定它们的显示次序 $- Y8@bw  
7'ws: #pC  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 7UUu1"|a|  
\vuWypo  
例如: !P6?nS  
;Q[E>j?w=  
SELECT nickname,email q3|SZoN  
Qz$Wp*  
FROM testtable  TZdJq  
 \7e4t  
3、更改列标题 KYq<n& s  
0;%\L:,O  
在选择列表中,可重新指定列标题。定义格式为: ly@%1  
x6vkd%fCj  
列标题=列名 R?J8#JPXD  
{@PZlQg  
列名 列标题 g9IIC5  
jPg[LZQ'  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 0QEcJ]Qb8  
TjpAJW@-  
标题: &7Xsn^opku  
${97G#  
SELECT 昵称=nickname,电子邮件=email $-(lp0\*  
_6L'}X$)N  
FROM testtable xJOp ~fKG  
|{rhks~  
4、删除重复行 >VG*La' c  
q } (f9  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 8A 'SMJi  
`*i:z'  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 8rNf4]5@X(  
bKh}Y`  
5、限制返回的行数 ft!D2M  
x@|10GC#:  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 )[=C@U  
{l\Ep=O vx  
表示一百分数,指定返回的行数等于总行数的百分之几。 WWLf'89It  
Wq<H sJd/  
例如: y"H(F,(N  
%-|$7?~   
SELECT TOP 2 * G+m[W  
V Y@`)  
FROM testtable %d /]8uO  
.4y44: T  
SELECT TOP 20 PERCENT * JYLAu4s6  
Ctk1\quz  
FROM testtable ,,?XGx  
M1*x47bN  
(二)FROM子句 P|a|4Bb+fW  
d-I=xpB  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, ifmX<'(9A  
*#GX~3A  
它们之间用逗号分隔。 H8E#r*"-m  
6f+@@=Xc  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 !)`m mr  
-JclEp  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 )?( _vrc<  
SN$3cg]z  
使用下面语句格式加以限定: Q0L1!}w   
R,-DP/ (im  
SELECT username,citytable.cityid I1p{(fJ  
raM{!T:  
FROM usertable,citytable UUvR>5@n  
oF s)UR  
WHERE usertable.cityid=citytable.cityid xzf/W+.>.  
_znpzr9H  
在FROM子句中可用以下两种格式为表或视图指定别名: XFi9qL^  
2l~qzT-  
表名 as 别名 8w~X4A,  
(62Sc]  
表名 别名 .pblI  
c Hnd gUW]  
例如上面语句可用表的别名格式表示为: u!McPM8Yk  
<JW %h :\t  
SELECT username,b.cityid 7&Ie3[Rm_3  
V@`%k]k  
FROM usertable a,citytable b |#B)`r8  
_A=i2?g  
WHERE a.cityid=b.cityid *(sv5c!0M8  
) gxN' z  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 XMLl>w2z  
^>z+e"PQA  
例如: 5&]a8p{  
?VyiR40-Cx  
SELECT a.au_fname+a.au_lname EEHTlqvR  
$;)A:*e  
FROM authors a,titleauthor ta 0u I=8j  
/@",5U#  
(SELECT title_id,title ~le:4qaX  
880T'5}S :  
FROM titles %~N| RSec  
Qn/ 6gRLj  
WHERE ytd_sales>10000 Qo80u? *  
C0&ZQvvy1:  
) AS t JE;!~=   
cq$ _$jRx  
WHERE a.au_id=ta.au_id E .CG  
d;).| .}P  
AND ta.title_id=t.title_id eqyUI|e  
= @ 1{LF;  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 hE +M|#o  
+rKV*XX@  
(三)使用WHERE子句设置查询条件 zOis}$GR  
)OFf nKh  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: fD2 N}  
q oz[x  
SELECT * VrJf g  
5zF$Q{3  
FROM usertable 5$*=;ls>J  
~vMJ?P@  
WHERE age>20 ZD<e$PxxCd  
O 2+taB  
WHERE子句可包括各种条件运算符: 6vg` 8  
_ F2ofB'  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< "lB%"}  
]5e|W Q>*X  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… zTw<9Nf  
.Z@iz5  
NOT BETWEEN…AND… @ b} -<~  
gdg "g6b  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) p }3$7CR/  
R^yh,  
NOT IN (项1,项2……) 43!E>mq  
R vd'uIJ  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE (:RYd6i  
3O|2Z~>3  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL nlc$"(eA[H  
^a7a_M  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR {-hu""x>  
5GURfG3{  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ~8)l/I=`);  
I-W ,C &J>  
2、列表运算符例:country IN ('Germany','China') D*g K,`  
|Pv)&'B"  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 k: z)Sw  
"XU)(<p  
varchar、text、ntext、datetime和smalldatetime等类型查询。 L$@qEsO  
c7]0 >nU;  
可使用以下通配字符: 9x#T j/5%  
?:+p#&I  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Am >b7Z!  
{gB9EGY  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 ]#W9l\  
6U1_Wk?   
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 &3\3wcZ,q  
~eXI}KhBw6  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 $?DEO[p.  
:b,An'H  
例如: n/% M9osF  
)hD77(c  
限制以Publishing结尾,使用LIKE '%Publishing' D_BdvWSxj  
{O4&HW%  
限制以A开头:LIKE '[A]%' UXOf  
|J~A )Bw?  
限制以A开头外:LIKE '[^A]%' +)_#j/  
 8(}cbW  
4、空值判断符例WHERE age IS NULL b.cBg.a  
5 axt\  
5、逻辑运算符:优先级为NOT、AND、OR H?;@r1ZAn  
u0%bv\$m  
(四)查询结果排序 Wp^ A.  
af&P;#U  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: v|nt(-JX  
 }D!o=Mg^  
ORDER BY {column_name [ASC|DESC]} [,…n] VL$?vI'  
Q5*"t*L!N  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 -`1)yhS  
-2Dgr\M  
序。 'wo}1^V  
 X*`b}^T  
例如: .+5;AtN  
hSaw)g`w  
SELECT * dA0o{[o=  
fjm 3X$tR  
FROM usertable Y0ACJ?|  
>KJE *X@s  
ORDER BY age desc,userid ASC A" IaFXB  
vg5fMH9ZZ  
另外,可以根据表达式进行排序。 e4;h*IQK  
07>D G#  
  -~ Dn^B1^  
I:YE6${k!  
二、联合查询 -#r=  
'K|F{K  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 SfPtG  
Gyc _B  
合查询。UNION的语法格式为: p@wtT"Y  
y/"CWD/i  
select_statement GYV%RD#  
va!fJ  
UNION [ALL] selectstatement fH% C&xj'&  
gj82qy\:  
[UNION [ALL] selectstatement][…n] -'Z-8  
J5}?<Dd:  
其中selectstatement为待联合的SELECT查询语句。 Z*.rv t  
Q>TNzh  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 +#6f)H(P]  
R  xc  
行。 Zk5AZ R!|  
6dYa07  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 iAXF;'|W  
@QDpw1;V'  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 tZ:fh  p  
DN;$ ->>  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 kE1k@h#/  
|oR#j `  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 hfs QAa  
bUc ++M  
型,系统将低精度的数据类型转换为高精度的数据类型。 hPt=j{aJ%<  
^CB@4$!   
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: PrF('PH7i  
3lgD,_&  
查询1 UNION (查询2 UNION 查询3) x6Q_+!mnk  
\psO$TxF=  
  fF. +{-.  
+B4i,]lCx  
  R[H#a v  
J$ &2GAi  
三、连接查询 rWJKK  
9/O\769"'  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 m [BV{25  
\mw5 ~Rf;  
数据库管理系统的一个标志。 u89Q2\z~"M  
)Zrn?KM  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 |Rb8 / WX  
#2%8@?_-M  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 *\^(-p~M  
gKRlXVS  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 |j4;XaG)  
_ + >V(,{G  
查询。 QV _a M2  
o>I,$=  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 h-\+# .YP  
*?o 'sTH  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 %%lJyLq'Vk  
9dp1NjOtAc  
SQL-92标准所定义的FROM子句的连接语法格式为: #YSFiy:+r_  
}jYVB|2  
FROM join_table join_type join_table <M\#7.](  
+aOX{1w  
[ON (join_condition)] 3*oZol/  
"}:SXAZ5`  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 K^%ONultv  
4"Mq]_D  
个表操作的连接又称做自连接。 LKst QP!I  
'Kd-A:K2g  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 dRBWJ/ 1T  
e)|5 P  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 8/-hODoT_  
5B;;{GR  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 9\%`/tJM  
_]us1  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) (_fovV=  
)yS8(F0  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 ](z*t+">  
,6x>gcR  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 BKu< p<  
B%z+\<3^q  
数据行。 l2kUa'O-  
=@MJEo`D  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 iT</  
4C9k0]k2  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 6e"Lod_ L  
\Z-Fu=8J8^  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 ^[b DE0  
M/YS%1  
运算符等构成。 Uq.hCb`:  
B9]bv]  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ]i8t  
<6C:\{eo  
连接。例如: )%HIC@MM6  
^_uCSA'X  
SELECT p1.pub_id,p2.pub_id,p1.pr_info E*QLw* H  
SxL/]jWR7  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 :13u{5:th  
V/yj.aA*@  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) i\kDb=  
fiLlOr%r  
(一)内连接 Bx|h)e9  
JG{`tTu  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 (dHjf;  
0m4'm<2m  
三种: <A&Zl&^1  
Tj!rAMQk  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 A&X XL~yH  
8*&YQId~  
表中的所有列,包括其中的重复列。 h79~d%-  
(SByN7[g b  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 J#\oc@  
W4)bEWO+q  
运算符包括>、>=、<=、<、!>、!<和<>。 yn.[-  
cuL/y$+EY  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 u"DE?  
CM)V^k*  
结果集合中所包括的列,并删除连接表中的重复列。 <>V~  
LXf|n  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: T `o[whr  
rGay~\  
SELECT *  =sk#`,,:  
{5c]\{O?[  
FROM authors AS a INNER JOIN publishers AS p ]^<\a=U  
^[Y/ +Q.J  
ON a.city=p.city 8qoA5fW>  
z<8VJZd  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): X=Jt4 h 9  
D0h6j0r 5  
SELECT a.*,p.pub_id,p.pub_name,p.country C{,Vk/D-0  
T75N0/teS  
FROM authors AS a INNER JOIN publishers AS p `)TgGny01  
$}=r 45e0K  
ON a.city=p.city M%7|7V<o)^  
AsI.8"  
(二)外连接 JI /iq  
6#HnA"I2n  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 N3w y][bo  
hz5t/E  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 kA9k^uR/  
w7f)v\p  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 7yOBxb   
sY?sQ'E2]  
如下面使用左外连接将论坛内容和作者信息连接起来: =]1g*~%  
tMyMA}`  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b }$s QmR R  
gZ=$bR  
ON a.username=b.username R#s_pW{op  
 lHE+o;-  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: [C@ Ro,mI  
3V<c4'O\W  
SELECT a.*,b.* 2m9qg-W  
V OT9cP^6  
FROM city as a FULL OUTER JOIN user as b /buj(/q^#  
nPH\Lra  
ON a.username=b.username $9Gra#  
!(y(6u#  
(三)交叉连接 Bf" ZmG9  
SBY0L.  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 ^!x qOp!  
n%!50E6*:  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 1yTw*vH F  
T#HF! GH]  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 .`oKd@I*"  
j?VHR$  
于6*8=48行。 V(Oi!(H;v  
S(0JBGC  
SELECT type,pub_name S`vw<u4t  
He&A>bA)z  
FROM titles CROSS JOIN publishers V>ZDJW"G!  
u@Bgyt7Y  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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