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

[原创]SQL查询语句使用

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

一、简单查询 bUZ_UW  
i%-Ld Ka}"  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 9XLFHV("  
S|em[D[Y^  
表或视图、以及搜索条件等。 /*$hx@ih  
fuUm}N7  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 @*>Sw>oet  
C$d>_ r  
SELECT nickname,email t{dSX?<nt  
AQss4[\Dx  
FROM testtable } fZ`IOf  
u,1}h L  
WHERE name='张三' +/rH(Ni  
,qQG;w,m  
(一)选择列表 #Yuvbb[  
geM6G$V&  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ]ikomCg   
-r<#rITH"  
量和全局变量)等构成。 4-R^/A0  
N@xg:xr  
1、选择所有列 -.IEgggf  
6/Fzco#N  
例如,下面语句显示testtable表中所有列的数据: !TKkec8$  
1u|V`J)0  
SELECT * t *G/]  
ka"337H  
FROM testtable . ]@=es  
f )Z%pgB  
2、选择部分列并指定它们的显示次序 t<j^q`;@v  
amWD-0V  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 V Z y4_v=  
?4 S+edX  
例如: #]]Su91BA  
]y@F8$D!  
SELECT nickname,email &fOdlQ?  
e:w &(is  
FROM testtable F_;DN: {  
l [GOs&D1  
3、更改列标题 jS.g]k  
 \ %=9  
在选择列表中,可重新指定列标题。定义格式为: F {+`uG  
r?/A?DMe  
列标题=列名 <#M`5X.  
G:W>I=^DaR  
列名 列标题 'heJ"k?  
`J0i.0p  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 ^|!I +  
c{+AJ8  
标题: }8-\A7T  
ZR0r>@M3v<  
SELECT 昵称=nickname,电子邮件=email nH|,T%  
k S# CEU7  
FROM testtable )B# ,  
h#r^teui)  
4、删除重复行 \2 y5_;O  
kq=V4-a[  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 a:TvWzX,  
Kl{>jr8B3  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 zSEs?  
)D&M2CUw"f  
5、限制返回的行数 8~lIe:F-  
~PWSo%W8  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 x NK1h-t  
i_R e*  
表示一百分数,指定返回的行数等于总行数的百分之几。 /u%h8!"R  
(-77[+2  
例如: Ny- [9S-<  
YevyN\,}V!  
SELECT TOP 2 * M:KbD|  
g7V8D  
FROM testtable l_'[27  
)d\ j I  
SELECT TOP 20 PERCENT * (>4aibA'P  
:~Q!SL N  
FROM testtable }R[#?ty;]  
$?G"GQ!.  
(二)FROM子句 g>rp@M  
l%ayI  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, $rF=_D6  
)4>2IQ  
它们之间用逗号分隔。 s=6}%%q6  
f3j{VN  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 GQQ.OvEc  
9>zcBG8f  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 j$UV/tp5T  
2aw&YZ&Xo  
使用下面语句格式加以限定: #`TgZKDg2  
TGXa,A{  
SELECT username,citytable.cityid B vo5-P6XY  
>(w2GD?  
FROM usertable,citytable `afIYXP  
U[L9*=P;  
WHERE usertable.cityid=citytable.cityid RO;Bl:x4  
p(;U@3G  
在FROM子句中可用以下两种格式为表或视图指定别名: do*}syQ`O  
I:bD~F b3  
表名 as 别名 vu!d)Fy  
n79QJl/  
表名 别名 ;8WZx  
7(M(7}EKA  
例如上面语句可用表的别名格式表示为: w=]Ks'C]  
%W,D;?lEo>  
SELECT username,b.cityid X"gCR n%tn  
A[IL H_w  
FROM usertable a,citytable b 8dD2  
;*ix~taL%  
WHERE a.cityid=b.cityid Jd\apBIf  
9)xUA;Qw?z  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 )VL96did  
SG}V[Glk  
例如: 5uq3\a  
IK,|5]*Ar  
SELECT a.au_fname+a.au_lname D|Iur W1f  
%75xr9yOP  
FROM authors a,titleauthor ta 6S6f\gAM  
^ -FX  
(SELECT title_id,title aQ^umrj@?9  
)"f N!9,F  
FROM titles 4'$g(+z  
?D,=37  
WHERE ytd_sales>10000 Mb3}7@/[  
Om{l>24i.\  
) AS t k#[F`  
(b?{xf'G  
WHERE a.au_id=ta.au_id +3s%E{  
M(#m0x B  
AND ta.title_id=t.title_id u2oKH{/z  
|KB0P@=a  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 :m86 hBE.  
D=:04V}2+  
(三)使用WHERE子句设置查询条件 !D!~ ^\  
hA\K</h.  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: [."[pY  
8WE{5#oi  
SELECT * 0 a]/%y3V  
??TMSH  
FROM usertable QL6C,#6  
Kp+CH7I*  
WHERE age>20 Rqwzh@}  
,q(&)L$S  
WHERE子句可包括各种条件运算符: =@TQ>Qw%b  
#r PP*  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< 7+x? " 4  
]9}HEu;1M  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… tm7u^9]  
sr@j$G#uW5  
NOT BETWEEN…AND… r{L4]|(utY  
QwhRNnE=  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) P oEqurH0  
.2J L$"  
NOT IN (项1,项2……) VMoSLFp^R  
jx acg^c  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE v]__%_  
?+T^O?r|O  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL \{Q?^E  
S+TOSjfis  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR \om%Q[F7a  
{3N'D2N  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 =^H4Yck/5  
eZ"1gYqy  
2、列表运算符例:country IN ('Germany','China') Bgmn2-  
iC iZJ"  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 RwS@I /  
Y>jiXl?&  
varchar、text、ntext、datetime和smalldatetime等类型查询。 AeAp0cbet  
;3_l@dP"  
可使用以下通配字符: .z13 =yv  
O;7)Hjwt  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 f|u#2!7  
e #/E~r&  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 =] 3tUD  
9&RFO$WH  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 FI"`DMb}  
s1?[7yC  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 E( us'9c   
vkLC-Mzm<  
例如: ;[RZ0Uy=  
Mi~(aah  
限制以Publishing结尾,使用LIKE '%Publishing' i-yy/y-N  
t>8XTqqi  
限制以A开头:LIKE '[A]%' Scv#zuv_  
k+1|I)z  
限制以A开头外:LIKE '[^A]%' ?eV4 SH  
+a^F\8H  
4、空值判断符例WHERE age IS NULL 7)h[Zy,A  
?f/n0U4w  
5、逻辑运算符:优先级为NOT、AND、OR fib}b? vk  
3> /K0N|$  
(四)查询结果排序 5q "ON)x  
DWdW,xG  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: _)]CzBRq\6  
!x'/9^i~v  
ORDER BY {column_name [ASC|DESC]} [,…n] Z,iHy3`  
u1xSp<59C  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 A)ipFB 6K  
u.rY#cS,-R  
序。 yoAfc  
|p$spQ  
例如: ePIiF_X  
1>L(ul(qGF  
SELECT * 4Vq%N  
\@&_>us  
FROM usertable :x_'i_w  
A<;SnXm  
ORDER BY age desc,userid ASC cyJG8f  
}^B6yWUN  
另外,可以根据表达式进行排序。 Ytgj|@jsp  
| >z3E z  
  Rb3V^;i  
imiR/V>N  
二、联合查询 7 I>G{  
^] kF{ o?  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 WOh|U4vt  
i*CZV|t US  
合查询。UNION的语法格式为: ?.Pg\ur  
]r_;dYa  
select_statement aM4k *|H?  
z2Z^~, i  
UNION [ALL] selectstatement 7=(Hy\Q5xH  
a'\o 7_  
[UNION [ALL] selectstatement][…n] Mfv1Os:ST  
41SGWAd#:  
其中selectstatement为待联合的SELECT查询语句。 q{+_ <2U|  
10H)^p%3+  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 <oz!H[!  
;NRF=d>  
行。 *{+G=d  
`O'`eY1f  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 4V~?.  
Y3O#Q)-j$  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 -kbg\,PW  
%w7]@VZ  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 /a6Xa&(B  
UT="2*3gz  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 S]E.KLR?[;  
I" KN"v^  
型,系统将低精度的数据类型转换为高精度的数据类型。 [|l?2j\  
r;m)nRu  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: t'ZWc\  
)aX,%yK  
查询1 UNION (查询2 UNION 查询3) S6[v;{xJ  
>|;aIa@9  
  EAeqLtFqs  
?mlNL/:  
  h>Hb `G<  
-1J[n0O.  
三、连接查询 A2|Ud_  
)Y)pmjZaG  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 _/O25% l  
3N_"rNKD  
数据库管理系统的一个标志。 : "1XPr  
a+Ac[>  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 : >>@rF ,  
-+O 9<3ly  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 `:axzCrCfR  
8.[SU  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 *E{2J:`  
GQ |Mr{.;  
查询。 t#2(j1  
XU"~h64]  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 {GJ@psG*  
J(6oL   
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 i'\T R|qd  
P@FHnh3}Z$  
SQL-92标准所定义的FROM子句的连接语法格式为: DY^;EZ!hb  
AFAAuFE"  
FROM join_table join_type join_table QV\eMuNy  
%HJK;   
[ON (join_condition)] 9:M` j  
<n#DT  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 *BR^U$,e  
]KmO$4  
个表操作的连接又称做自连接。 rdJR 2  
s-v  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 H *)NLp  
]9 @F~)  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 N ,z6y5Lu  
>vA2A1WhW  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 G.UI|r /Kz  
gg8Uo G  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) h2D>;k  
%V nbmoO  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 bcYF\@};  
6H7],aMg$A  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 4#l o$#  
!@v7Zu43,  
数据行。 ynrT a..  
F|!){=   
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 0vw4?>Jf@  
j*vYBGD  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 ~Rr~1I&mR,  
7"C$pm6  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 gdQvp=v]  
c??mL4$'N  
运算符等构成。 pJtex^{!:  
q*>&^V$M  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 w.TuoWo>  
FIsyiSY<j  
连接。例如: BSVxN  
c3CWRi`LE  
SELECT p1.pub_id,p2.pub_id,p1.pr_info w Y_)y  
_/tHD]um  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 u`RI;KF~F  
tw9f%p  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) $A-J,_:T<  
B]l)++~  
(一)内连接 y9Usn8  
5yz(>EVH  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 _BP&n  
;N?]eM}yf  
三种: p|p l  
^\S~?0^m  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 Ug<#en  
qO|R^De  
表中的所有列,包括其中的重复列。 m*kl  
1bn^.768l  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 =UfsL%  
XSyHk"g`  
运算符包括>、>=、<=、<、!>、!<和<>。 m+T;O/lG0{  
e-EUf  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 q}?4f *WC  
ys kO  
结果集合中所包括的列,并删除连接表中的重复列。 Z '7  
P`cq H(   
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: jr:7?8cH0L  
_y} T/I9  
SELECT * bl&nhI)w  
tu66'z  
FROM authors AS a INNER JOIN publishers AS p *(T:,PY  
/$p6'1P8  
ON a.city=p.city R1$:~p2m  
  t!_<~  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): ElW~48  
x5-}h*  
SELECT a.*,p.pub_id,p.pub_name,p.country S;286[oq@  
Rx=>6,)'  
FROM authors AS a INNER JOIN publishers AS p lUMS;H(  
4?q <e*W  
ON a.city=p.city ?b>,9A.Z  
IHv[v*4:  
(二)外连接 9^#c| 0T  
7%|~>  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 6"&6 `f  
"ozr+:#\  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ^Xq 6:  
cmU1!2.1E  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 1oW ED*B  
heC/\@B  
如下面使用左外连接将论坛内容和作者信息连接起来: $m-2Hh qZ  
^<a t'jk6  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b gL *>[@RO  
_8F`cuyW  
ON a.username=b.username q %"VYt4  
st:`y=F_  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: os:A]  
Sp;G'*g  
SELECT a.*,b.* Vg>dI&O  
ic#`N0s?  
FROM city as a FULL OUTER JOIN user as b VKG&Y_7N  
ijK"^4i  
ON a.username=b.username < (fRn`)PT  
>\P@^ h]  
(三)交叉连接 wc}5m Hs  
E%,^Yvh/  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 FE (ev 9@  
i/`m`qdg  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 VyXhl;  
fY51:0{  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 CFMo)"  
%Q fO8P  
于6*8=48行。 e]$}-i@#  
1Vrh4g.l  
SELECT type,pub_name QLvHQtzwX  
J$GUB3 G  
FROM titles CROSS JOIN publishers <oT^A|JFj  
%^4CSh  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

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