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

[原创]SQL查询语句使用

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

一、简单查询 _ * s  
;AB,:*  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 sr@XumT  
}_/h~D9-T#  
表或视图、以及搜索条件等。 &c9Fw:f;  
!=:MG#p  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 j=QR*8*  
_ N f[HP  
SELECT nickname,email 5{/Pn%5  
e27CbA{_w  
FROM testtable 3v>,c>b([  
*]{I\rX  
WHERE name='张三' 78J .~v/  
skx=w<YO6]  
(一)选择列表 1nTaKK q  
SVWSO  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 L=w Fo^N  
G/3lX^Z>  
量和全局变量)等构成。 54cgX)E[x  
sH,)e'0  
1、选择所有列 x  Bw.M{  
V+~{a:8[pq  
例如,下面语句显示testtable表中所有列的数据: iwjl--)@K  
5qfKV&D  
SELECT * I%C:d#p  
Bo\v-97  
FROM testtable ]sP9!hup  
[#6Esy8|  
2、选择部分列并指定它们的显示次序 !enz05VW6.  
EjE`S_i=  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 XTaWd0Y  
!;C(pnE  
例如: R{A/ +7!  
,vw`YKg  
SELECT nickname,email gL"Q.ybA  
Eq;frnw>q  
FROM testtable "(&`muIc  
bK%tQeT  
3、更改列标题 KBHKcFk  
 /r@  
在选择列表中,可重新指定列标题。定义格式为: M]TVaN$v#  
c O>:n  
列标题=列名 uOqDJM'RM  
vS__*} ^  
列名 列标题 tU/NwA"  
a(T4WDl^  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 <G?85*Nv_  
6-}e-H  
标题: .V:<w~=b  
6Q.whV%y  
SELECT 昵称=nickname,电子邮件=email >,vW  
?'m5)Z{  
FROM testtable GJfNO-  
'c(Y")QP  
4、删除重复行 jV&W[xKa  
1V$B^/_  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 -"9)c^KVx  
']e4 !  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 xm, yqM!0A  
:?6$}GcW  
5、限制返回的行数 #f;1f8yrN  
> BCX%<&  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 Dohe(\C@  
@$} \S  
表示一百分数,指定返回的行数等于总行数的百分之几。 pFRnPOv  
p&doQh  
例如: `z`;eR2oX  
VZ@@j[F(  
SELECT TOP 2 * NVZNQ{  
sn`?Foh  
FROM testtable 1+c(G?Ava  
Bin&:%|9?  
SELECT TOP 20 PERCENT * >.~k?_Of  
5{aQ4H>~tx  
FROM testtable R:x04!}  
c}s3c >`d  
(二)FROM子句 Xb 1^Oj  
;K-t  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, sswAI|6ou  
5g7}A`  
它们之间用逗号分隔。 W?Abx  
?+o7Y1 k,  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 -3U} (cZ*  
7B"aFnK;[J  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 |noTIAI  
$:Z xb  
使用下面语句格式加以限定: HOb\Hn|6jq  
Z i&X ,K~  
SELECT username,citytable.cityid d0E5;3tQ  
ED&KJnquWJ  
FROM usertable,citytable Nx z ,/d  
O4mWsr  
WHERE usertable.cityid=citytable.cityid vAxtN RS  
aKr4E3`  
在FROM子句中可用以下两种格式为表或视图指定别名: o;/F=Zp  
:8T@96]P  
表名 as 别名 Ggjb86v\  
Kx!|4ya,  
表名 别名 ,{t!->K  
!gQ(1u|r  
例如上面语句可用表的别名格式表示为: hmk5 1  
|<icx8hbr  
SELECT username,b.cityid :\We =oX  
iAhRlQ{Qu  
FROM usertable a,citytable b YP97D n  
s7LX  
WHERE a.cityid=b.cityid aKcV39brr  
c3-bn #  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 Gl1$W=pR:  
5|z[%x~f  
例如: lR^Qm|  
6 VDF@V$E  
SELECT a.au_fname+a.au_lname 13 p0w  
xF0*q  
FROM authors a,titleauthor ta +Q&@2 oY"  
u:?RdB}B_@  
(SELECT title_id,title X)5O@"4 ?  
^>uGbhBp  
FROM titles C.p*mO&N  
w=2 X[V}  
WHERE ytd_sales>10000 Hb4rpAeP  
+O6@)?pI  
) AS t >.>5%  
"<b84?V5  
WHERE a.au_id=ta.au_id [-a /]  
"E#%x{d  
AND ta.title_id=t.title_id i?9Lf  
{+}Lc$O#C  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 d^>se'ya  
roQIP%h!  
(三)使用WHERE子句设置查询条件 -2 ?fg   
2N#L'v@g=+  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: tJ3s#q6  
2Z |kf9  
SELECT * !{\c`Z<#  
Xu0*sQK  
FROM usertable #y%Ao\~kG  
=B2=UF  
WHERE age>20 G9Ezm*I;:  
x$sQ .aT  
WHERE子句可包括各种条件运算符: 6, ~aV  
gUQCKNw  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< cMAfW3j: ;  
>dY"B$A>  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… y0^FTSQ|  
~46ed3eGzi  
NOT BETWEEN…AND… HN%ZN}  
k5M(Ve  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) "m5ZZG#R`  
e{/\znBS%  
NOT IN (项1,项2……) Joj8'  
Zx0c6d!B  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 4mg&H0 !  
S/aPYrk>6  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL l.! ~t1i  
9X~^w_cdk  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR 2(|V1]6D?  
I+SL0  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 ^&%?Q_]  
iV=#'yY  
2、列表运算符例:country IN ('Germany','China') c$;enAf@  
zQJbZ=5Bu"  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 b%F*Nr  
7 5u*ZMK  
varchar、text、ntext、datetime和smalldatetime等类型查询。 !bg3  
glpdYg *  
可使用以下通配字符: HIAd"}^  
&gfQZxT  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 |v&&%>A2  
)Ec;krb+  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 R_ }(p2  
@ ri. r1  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 czzV2P/t}  
] $*cmk(Y  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 Qn7e6u@V  
h2]Od(^[  
例如: ohl%<FqS  
@lI/g  
限制以Publishing结尾,使用LIKE '%Publishing' vPi+8)  
EUgs2Fsb3  
限制以A开头:LIKE '[A]%' VTdZ&%@  
60Z)AQs;+J  
限制以A开头外:LIKE '[^A]%' CpXv?uU   
mB\|<2  
4、空值判断符例WHERE age IS NULL U?>cm`DBP  
O%I'   
5、逻辑运算符:优先级为NOT、AND、OR QX4I+x~oo\  
X}Lp!.i9o  
(四)查询结果排序 y[vjqfdmU  
n3w2&  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: ;L7<mU  
D~Su82 2  
ORDER BY {column_name [ASC|DESC]} [,…n] |(fWT}tg  
]_h"2|  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 h4C B1K  
FP$]D~DMo  
序。 ]!QeJ'BLM  
]iPdAwc.1  
例如: %rsW:nl  
]pt @  
SELECT * @`{UiTN X`  
-3Ffk:  
FROM usertable wJ}8y4O!N  
@S}'_g  
ORDER BY age desc,userid ASC s`{O-  
uf6{M_jXZ  
另外,可以根据表达式进行排序。 :;EzvRy  
PHoW|K_e  
  J_,y?}.e3  
8K qv)FjB  
二、联合查询 Vy biuP  
g8C+j6uR0  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 0|cQx VJb  
vgV0a{u"  
合查询。UNION的语法格式为: 3yQ(,k#  
$]9d((u4  
select_statement I'!KWpYJT  
C5m*pGImG  
UNION [ALL] selectstatement G100L}d"N  
;Wr$hDt^  
[UNION [ALL] selectstatement][…n] SWu=n1J.?H  
@"6BvGU2s  
其中selectstatement为待联合的SELECT查询语句。 z')'8155  
pq@ad\8  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 opBv x>S  
Gr_I/+<  
行。 qdOS=7]W  
W[YtNL;  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 y ^YrGz.  
S7V;sR"V2  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 l4; LV7Ji  
%n( s;/_  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 cNHN h[ C  
_L"rygit  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 vUW!  
{W-PYHZ;  
型,系统将低精度的数据类型转换为高精度的数据类型。 5<u+2x8|  
e}kG1C8  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: 6>l-jTM  
), n?"  
查询1 UNION (查询2 UNION 查询3) Yy&0b(m U  
dsh}-'>  
  ukN#>e+L1  
Y$N|p{Z  
  9:P)@UF  
C'{Z?M>  
三、连接查询 D%Wr/6X  
pDu~84!])  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 /HLQ  
7|2:;5:U  
数据库管理系统的一个标志。 Si;e_a  
zdY`c  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 #pf}q+A  
hM;EUWv  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 0j3j/={|.1  
NoMEe<  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 S"lcePN  
XVY^m}pMe  
查询。 8gZ5D  
zFOX%q  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 <)M?qkjb  
ct/I85c@P  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 y&iLhd!p  
tJ 6:$dh  
SQL-92标准所定义的FROM子句的连接语法格式为: fd(>[RP?  
#0weN%  
FROM join_table join_type join_table I qma vnM#  
Y yI|^f8C  
[ON (join_condition)] BKN]DxJ6  
%bddR;c  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 t]Vw` z%G  
62.{8Uj  
个表操作的连接又称做自连接。 B64%| S  
ek.L(n,J|  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 ~ejHA~QC  
Bs^W0K$uBO  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 nHA2p`T  
:qI myaGQ  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 O^LzS&I*  
q+SDJ?v  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) ?L|@{RS{|  
7^S&g.A  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 2f4*r^  
>b/Yg:t  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 !]W6i]p  
Hd4&"oeY  
数据行。 55hJRm3  
[j&>dE  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 U,)+wZJ  
Dtn|$g,  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Q7i^VN  
!DLIIKO78  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 n`CmbM@@  
D`Fl*Wc4H  
运算符等构成。 u U\UULH0  
j'~xe3j  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 ~?nPp$^  
P[^!Uq[0n7  
连接。例如: N@*v'MEko%  
7kleBDDT  
SELECT p1.pub_id,p2.pub_id,p1.pr_info x_#yH3kJ  
|rsu+0Mtz  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 #t9&X8:U  
IA''-+9  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) $vicxE~-E  
O(CUwk  
(一)内连接 0^zu T  
VYvHpsI  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 QRx'BY$5  
I/fERnHM/+  
三种: <` HLG2  
'j>Q7M7q{  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 )0!hw|0|  
_bFX(~37z?  
表中的所有列,包括其中的重复列。 S__+S7]Nr  
^-rb&kW@:  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 <.~j:GbsE  
%WdAI,  
运算符包括>、>=、<=、<、!>、!<和<>。 vfmKYiLp  
E+csK*A7  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 . [*6W.X  
i yMIP~N,$  
结果集合中所包括的列,并删除连接表中的重复列。 ."cC^og  
lZ'NL bK  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: ,f4Hl%T;  
e>X&[\T  
SELECT * Q_]O[Kx  
dfO84Z} 5  
FROM authors AS a INNER JOIN publishers AS p b1E>LrL  
"rBo?%:  
ON a.city=p.city L/#^&*'B  
A03,X;S+  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): n`;=^^B  
N(6|TE2  
SELECT a.*,p.pub_id,p.pub_name,p.country H"].G^V\6  
kznmA`#jn  
FROM authors AS a INNER JOIN publishers AS p Tj@s\@hv  
B!yAam#^  
ON a.city=p.city NkA|T1w7  
O~Pb u[C  
(二)外连接 ?tg(X[h{S  
7l%O:M(\  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 yLG`tU1  
x~Y]c"'D  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 ,accw}G  
tBp dKJn##  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 |'Z6M];8t  
n:x6bPal]  
如下面使用左外连接将论坛内容和作者信息连接起来: Nq Ve{+1x  
m<hR Lo  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b /a(xUm@.  
/5EM;Mx  
ON a.username=b.username Z[[ @O  
>ouHR*  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 7P|GKN~  
zH eqV  
SELECT a.*,b.* Z<;am  
_/]4:("  
FROM city as a FULL OUTER JOIN user as b 4F^(3RKZ|  
P]bI".A8  
ON a.username=b.username pk:YjJs  
xOp8[6Ga'  
(三)交叉连接 1-Sc@WXd  
f@]4udc e  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 'OK)[\  
t9;yyZh  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 Yx>=(B  
;n?H/(6X8>  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 "at*G>+  
%n SLe~b  
于6*8=48行。 S{XV{o  
+W x/zo  
SELECT type,pub_name g#2Q1t,~U  
.q"`)PT  
FROM titles CROSS JOIN publishers %lF}!  
*$0u A N  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八