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

[原创]SQL查询语句使用

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

一、简单查询 sx9[#6~{Y  
g2lv4Tiq-  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 a.<!>o<t:  
'?|.#D#-c  
表或视图、以及搜索条件等。 OUHd@up@n  
Qe<c@i"  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 Tq6@ 1j6p  
HV3D$~gF  
SELECT nickname,email wZ8LY;  
 `Q^Vm3h  
FROM testtable k/xNqN(  
BW)t2kR&  
WHERE name='张三' z Hj_q%A  
KrECAc  
(一)选择列表 @0:mP  
}>Lz\.Z/+[  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 ku5g`ho  
"%t !+E>nr  
量和全局变量)等构成。 g.EKdvY"%H  
1 pzd  
1、选择所有列 9e 1KH'  
\AR3DDm  
例如,下面语句显示testtable表中所有列的数据: 6 dCqS  
iu,Bmf^oD  
SELECT * 6? (8KsaN  
dZbG#4oO  
FROM testtable )ULxB'Dm  
 hWu#}iN  
2、选择部分列并指定它们的显示次序 ?@_,_gTQ  
s&OwVQ<M  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 rNHV  
|z%*}DPrpa  
例如: w<4){ .dA  
"Zicac@N  
SELECT nickname,email I."4u~[  
u`X}AKC  
FROM testtable U#_rcu  
t#J #DyY5  
3、更改列标题 p&\x*~6u  
[26([H  
在选择列表中,可重新指定列标题。定义格式为: 785Y*.p  
2|^bDg;W+u  
列标题=列名 ].w$b)G   
}oTac  
列名 列标题 ~&IL>2-B  
E~!FEl;  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 k@R)_,2HH  
D#9W [6  
标题: _^ @}LVv+E  
0:Lm=9o  
SELECT 昵称=nickname,电子邮件=email kjW`k?'s  
IF*kLl?  
FROM testtable hE/y"SP3  
I-q@@! =  
4、删除重复行 #P6;-d@a  
{=d\t<p*n  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 58My6(5y  
<BN)>NqM  
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 dTP$7nfe  
*o[*,1Pw  
5、限制返回的行数 .~ W^P>t  
p>p=nLK  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 iyhB;s5Rgw  
ffyKAZ{]po  
表示一百分数,指定返回的行数等于总行数的百分之几。 Xl%&hM  
VuW&CnZ  
例如: 'x10\Q65[  
\bb,gRfP  
SELECT TOP 2 * !$+J7\& 7p  
dDk<J;~jGJ  
FROM testtable Lp/]iZ@  
\G*vY#]  
SELECT TOP 20 PERCENT * (sn|`k3I  
7[V'3  
FROM testtable Z)(C7,Xu  
/T*]RO4%>]  
(二)FROM子句 *Mqg_} 0Y  
c>3W1"  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, }g _#.>D+  
SR S~s  
它们之间用逗号分隔。 T ~t%3G  
6q8qq/h)  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 { lLUZM  
U=%S6uL\bx  
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应 @*l}2W  
Oox5${#^  
使用下面语句格式加以限定: !/$BXUrd  
5,qfr!hN,  
SELECT username,citytable.cityid &e% y|{Y  
Wm.SLr,o0  
FROM usertable,citytable 4//Ww6W:  
s4}}MV3X  
WHERE usertable.cityid=citytable.cityid I)O-i_}L&K  
cEw/F0  
在FROM子句中可用以下两种格式为表或视图指定别名: ]0dp^%  
R m *"SG  
表名 as 别名 `h Y:F(  
U]ouBG8/  
表名 别名 +Mv0X%(N  
`^afbW  
例如上面语句可用表的别名格式表示为: J2H8r 'T  
J(-#(kMyf  
SELECT username,b.cityid $X-,6*  
Fu m1w  
FROM usertable a,citytable b ^yu^Du  
h_d!G+-]  
WHERE a.cityid=b.cityid qx53,^2  
Z!|nc.  
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 /)y~%0  
/{1xpR  
例如: mrd(\&EhA  
R{6.O+j`  
SELECT a.au_fname+a.au_lname T cSj `-  
e[n T'e  
FROM authors a,titleauthor ta JT<Ia  
>1mCjP  
(SELECT title_id,title o,Ew7~u  
XUUS N  
FROM titles Khw!+!(H  
IEeh)aj[  
WHERE ytd_sales>10000 Q:kpaMA1P  
%r~TMU2"  
) AS t G m<t2Csn  
Ra_6}k  
WHERE a.au_id=ta.au_id 0/(YH  
o*I-~k  
AND ta.title_id=t.title_id {q8V  
R`>E_SY  
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 [N#2uo  
Cg21-G .  
(三)使用WHERE子句设置查询条件 qdj,Qz9ly  
9[6*FAFJPP  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据: rxCu V  
^X0<ZI  
SELECT * yNY1g?E  
0R*  
FROM usertable jB?Tua$,s  
2J|Yc^b6  
WHERE age>20 uu=e~K  
|n67!1  
WHERE子句可包括各种条件运算符: AytHnp\H  
6eK18*j%H  
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!< Yw+_( 2 9=  
{n%F^ky+7  
范围运算符(表达式值是否在指定的范围):BETWEEN…AND… Ql\{^s+  
K-_e' )22.  
NOT BETWEEN…AND… RpS'Tz}  
,1F3";`n[  
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) O&\;BF5:R  
aCFO ]  
NOT IN (项1,项2……) 0=(5C\w2  
?exV:OKLb  
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE 1"~@UcJ  
@ou g^]a  
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL k9WihejS  
T6- e  
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR YJXh|@LT  
|'mgo  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 W)w@ju$Ko  
c<-_Vh.:5  
2、列表运算符例:country IN ('Germany','China') 0ltq~K  
aLuxCobV  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、 aeE9dV~  
T3)/?f?|  
varchar、text、ntext、datetime和smalldatetime等类型查询。 ^^)D!I"cA,  
A^ t[PKM"  
可使用以下通配字符: qV^,muyoG  
i v&:X3iB  
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 Gv6EJV1i  
],&WA?>G  
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 hq$:62NYg  
HRje4=:  
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 e [3sWv  
+:wOzTUN  
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 i4v7x;m_p  
[D?RL `ZF  
例如: )iluu1,o  
*V3}L Z  
限制以Publishing结尾,使用LIKE '%Publishing' K )1K ]  
i@Q)`>4  
限制以A开头:LIKE '[A]%' 4wMKl6mL  
-&D~TL#  
限制以A开头外:LIKE '[^A]%' "F}a nPY  
qS|bpC0x  
4、空值判断符例WHERE age IS NULL :kfl q  
TQ.d|{B[  
5、逻辑运算符:优先级为NOT、AND、OR Nx;U]O6A  
?7/n s>}  
(四)查询结果排序 ,H1j&]E!  
W<u63P  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为: $ ;~G  
P0 DvZV8  
ORDER BY {column_name [ASC|DESC]} [,…n] _)zSjFX9  
HpuHJ#l  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排 mn?< Zz  
M8:gHjwsx  
序。 ^'*9,.ltd  
70mQ{YNN  
例如: S;a{wYF6v  
\O^b|0zc  
SELECT * I/_`/mQ  
-?&wD["y  
FROM usertable e ,k,L  
}*hY#jo1  
ORDER BY age desc,userid ASC @T|mHfQ8  
{SbA(a?B  
另外,可以根据表达式进行排序。 0^5SL/2  
`\(Fax  
  7?qRY9Qu  
[>oq~[e)?  
二、联合查询 89U<9j   
wz$1^ml  
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 /^ hB6_'D  
C5\bnk{  
合查询。UNION的语法格式为: <hkg~4EKc  
~:D}L   
select_statement }>6=(!  
kNMhMEez  
UNION [ALL] selectstatement Se%FqI  
@w[WG:-+  
[UNION [ALL] selectstatement][…n] _hMMm6a|  
KaZ*HPe(  
其中selectstatement为待联合的SELECT查询语句。 O+@"l$;N  
\3hhM}6)DM  
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一 [58xT>5`m  
,[D,G  
行。 ^g$k4  
=oV8 !d%]  
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 iL)q':xz  
c_)vWU  
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 "gfy6m  
j,8*Z~\5  
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 WXp=>P[  
Jb#*QJ=  
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 |)} F}~&  
PnJr  
型,系统将低精度的数据类型转换为高精度的数据类型。 $C##S@  
A5Qzj]{ba  
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如: |g}! F-  
zT6ng#  
查询1 UNION (查询2 UNION 查询3) tV9BVsN  
$Ud-aRlD  
  u 3wF)B{  
E tWpBg  
  fJtJ2xi  
xO`w| k  
三、连接查询 {  KE[8n  
o) `zb?  
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 p^Kp= z  
d7g/s'ZHt6  
数据库管理系统的一个标志。 lNs 'jaD  
\5BI!<  
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 U{q6_z|c  
aEW Z*y  
一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 2[}^ zTtA  
0cC5  
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行 {d.`0v9h  
7]_UZ)u  
查询。 Ua#*kTF  
=#[_8)q  
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 @] 1E~  
VjS %!P  
将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 JUok@6  
`zAV#   
SQL-92标准所定义的FROM子句的连接语法格式为: l!ltgj  
y@ J\h8_  
FROM join_table join_type join_table ?D/r1%Z  
=iC5um:  
[ON (join_condition)] [R)?93  
Q*+@"tk<  
其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 E j@M\  
s1<_=sfnT  
个表操作的连接又称做自连接。 y%Ui)UMnw]  
B08q/ qi  
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 f&bY=$iff  
UB@>i3  
较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 Jvw~b\  
%L+/GtxK  
的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 'm# -)R!  
j wlmWO6  
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) W1f]A#t<  
wb 2N$Ew=  
和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 *YZ' Uy?  
41>Bm*if  
配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的 1b+ B  
HNxJ`x~Z~  
数据行。 0|9(oP/:  
ELeR5xT  
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 <1.].A@b*  
-N(y+~wN  
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 {dhuvB  
$74ZC M  
连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 +?zyFb]Km  
F'lG=c3N  
运算符等构成。 z kYl IUD  
g-U'{I5F  
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 O?p.kf{b  
Mc oHV]x  
连接。例如: jb$sIZ%i  
G1  %c<1Y  
SELECT p1.pub_id,p2.pub_id,p1.pr_info c Bb!7?6(  
fz31di9$  
FROM pub_info AS p1 INNER JOIN pub_info AS p2 8)&yjY  
)I9AF,K  
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) Y=sRVypJ  
"\Jq2vM  
(一)内连接 VV)PSodb  
4JKB6~Y  
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分 Vj_(55WQ  
g3 6oEz~|  
三种: :T" !6;  
 T/p}Us  
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 B++.tQ=X.  
#s{>v$F  
表中的所有列,包括其中的重复列。 &<R8'  
8kXbyKX[b  
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些 cveTrY}g  
,WR$xi.j  
运算符包括>、>=、<=、<、!>、!<和<>。 qEX2K^y'4"  
St-:+=V_  
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 5(q\x(N  
ePa:_?(  
结果集合中所包括的列,并删除连接表中的重复列。 CTp~bGIv!=  
8)ZWR3)+W  
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: -20o%t  
p<Wb^BE  
SELECT * xY(+[T!OF  
^LaI{UDw%h  
FROM authors AS a INNER JOIN publishers AS p iaQ[}'6!$  
Z^`&Z3s  
ON a.city=p.city :k6|-A2  
A3*ti!X<6  
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): gF^l`1f"  
MB" uJUk  
SELECT a.*,p.pub_id,p.pub_name,p.country jy(,^B,]  
U2 <*BRJ  
FROM authors AS a INNER JOIN publishers AS p `* "u"7e  
Yd~K\tX :n  
ON a.city=p.city Z2)f$ c  
Q2cF++Q1  
(二)外连接 B)O=wx  
NoO>CjeFb  
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 l " pCxA  
vP^]Y.6  
的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 d#Sc4xuf  
}X$vriW  
连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 \NhCu$'  
GK)3a 9;  
如下面使用左外连接将论坛内容和作者信息连接起来: lyI rO"o  
@^a6^*X>  
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b gn1`ZYg  
O_K@\<;~  
ON a.username=b.username {R `IA|T#k  
z{pNQ[t1Z  
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: 4A^hP![c#]  
7{RI`Er`  
SELECT a.*,b.* Ev0GAc1  
p^Ca-+R3  
FROM city as a FULL OUTER JOIN user as b Msn)jh  
fKOm\R47  
ON a.username=b.username 7Ro7/PT (  
bW;0E%_  
(三)交叉连接 )&1yt4 x6%  
leiED'  
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数 u><ax  
bv;&oc:r  
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 )b m|],'  
uYIw ?fXy  
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 1)/B V{n  
kMKI=>s+  
于6*8=48行。 GC66n1- X  
+cvz  
SELECT type,pub_name GsqR8n=  
vVc:[i  
FROM titles CROSS JOIN publishers Z{+h~?63  
Y:&1;`FBZ  
ORDER BY type
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五