sql复杂查询语句的使用

上一篇 / 下一篇  2008-08-01 22:57:12

51Testing软件测试网+Z0eD9~ F%Vc%MU"b

############################复杂查询语句的使用#####################################
k(G!q&q%n5J|01.查询语句的使用
L.IG6[9K#}"Z0使用 select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.
e@ H xO0 51Testing软件测试网-e ?1zqYs'xq$~
1.1相关子查询51Testing软件测试网3F!K] x'r
可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询51Testing软件测试网*mV TLAQ"V
  .where中可以包含一个select语句的子查询
+@:Bh LeT$U;X0  .where中可以包含in,exists语句
+g$hqYr5Hp+@Pv*|0  .最多可以嵌套16层
*@9Y#\*^({ ^0  .层次过多会影响性能51Testing软件测试网'ok/Kq~["xxx
  [例]简单子查询实例
9hRHO)N0  查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目
Z2XT.?0y&}E!wQ/DW`0  (按规定只能以一个单位来申请)51Testing软件测试网NN].ex
  SQL> create table univ_subject51Testing软件测试网~)c:k1_F/X!zu ho
  2    (
5w"Z+^0o,Q6`0  3       name                 varchar2(12) not null,51Testing软件测试网sKmT3g$vw%I
  4       per_id                number     not null,
w4T7Vu8o d'@R MA@t)@3H0  5      dept_name       varchar2(20)            51Testing软件测试网$_MSL"vS*LV
  6    );51Testing软件测试网_1x1Nqn&n#]@}
  SQL> insert into univ_subject  values('gaoqianjing',1001,'信息工程系');51Testing软件测试网!R3|-|/Cuw"moQ
  SQL> insert into univ_subject  values('wangbing',1002,'物理系');51Testing软件测试网-K*xadK5E_RP
  SQL> insert into univ_subject  values('liming',1003,'化学系');
3y VX-vO)F0  ===============51Testing软件测试网8J%b3e8? kW
   SQL> create table  colle_subject
fV)Z?,I/a HoW0  2     (51Testing软件测试网s~[BF&g7Av B
  3              colle_name    varchar2(20),
0vRR&mw](?~S-n%H0  4              per_id              number
eXoD2Ng8D0  5     );
U gd!O&v4pn q.S0  SQL> insert into colle_subject values('电子研究所',1001);
8JFd"G%I9k3A0  SQL>  insert into colle_subject values('物理研究所',1005);
a LeyU~0  ================
sh.E j}n0  SQL> select name,per_id,dept_name from univ_subject where per_id in
j]4e.VSXn0  2    (select per_id from colle_subject);
51Testing软件测试网/XJ3NN9S!]*t Xa.v0TQ

51Testing软件测试网E_f1\/U F|s

  NAME            PER_ID   DEPT_NAME51Testing软件测试网K\ jWi6yfc|
  ------------          ---------     --------------------
0rdd.O;I*K}0  gaoqianjing  1001      信息工程系
51Testing软件测试网qY!i1u/?"|6^&~

51Testing软件测试网~*D;awU

1.2外连接
fuQvm6|f?h4FtL0 [例]外连接实例
Ox1S.d[0 招生中所有学生的信息放在students表中,而部分有特长的学生在另一个表中stuent_skill中同样有该学生51Testing软件测试网$r![j_:bb|-n
 的信息。现在要全部列出所有学生,如果某个学生在表student_skill中就有其特长信息,并显示特长信息,如果51Testing软件测试网]%caf G$O
 某个学生没有特长就显示特长问空.
3^ A?;j M%s0 SQL>  create table students
MJ"Kj o1y_@9E0  2    (
w'f!Lt rCVo$Bk K0  3       st_id    varchar2(20),51Testing软件测试网'EK QP.z7i'F#jG
  4       name  varchar2(10),51Testing软件测试网GCxt`5O;b
  5       age      number(2),51Testing软件测试网?5Y/T$| Ofq&F
  6       tol_score   number(3)51Testing软件测试网,X?/GQ/B t
  7    ) ;51Testing软件测试网&Fi)l,_v){rA9[
SQL>   insert into students values('973231','wangbindu',22,501);51Testing软件测试网 V1mU*H9}P+i5U1] E
SQL>   insert into students values('973232','zhuzhijing',21,538);51Testing软件测试网Z4Ql dY0TJK
SQL>  insert into students values('973233','gaojing',21,576);
/S ^Z-n U0===================
51Testing软件测试网 YWc l `9f

51Testing软件测试网r!LI7fV+afoGv

SQL>  create table student_skill
"[l4U9Zjut0  2   (51Testing软件测试网0TKtz9|e
  3      st_id  varchar2(20),
&E"C}9~9\ f'H Fqr0  4      skill    varchar2(20)
1n6d(T5H` Ghw+k7B$c0  5  );
q9Xb/X])T0SQL>  insert into student_skill values('973231','篮球');51Testing软件测试网$d&H0K&r}z@_ `2c
SQL>  insert into student_skill(st_id) values('973232');
C.b"tj@0SQL>  insert into student_skill values('973233','足球');51Testing软件测试网7D Q c,r#pZ#s8f
===================

?/?st*w051Testing软件测试网(DV0ueWx)U

SQL>   select a.* , b.skill from students a,student_skill b where a.st_id=b.st_id(+)51Testing软件测试网2Nw s;Rq&u5r
order by a.st_id;

.D.y)[7Y8QGl Z ^#c$`0

^.`k1z4TJ0ST_ID                NAME             AGE TOL_SCORE SKILL51Testing软件测试网LElVW%T1^7I
-------------------- ---------- --------- --------- ------------------  --51Testing软件测试网@1Sji9d,qp
973231               wangbindu         22       501        篮球
{+D2b8R:yLR c+c6F0973232               zhuzhijing           21       538
B?"D }%l0973233               gaojing                21       576        足球
51Testing软件测试网V k0CbUb Om@l"?

)xU9?0{)S9u:t^(oR01.3自我连接
S"b8YVJ Bs4}0自我连接是在同一个表或视图内进行条件连接.51Testing软件测试网u9Ht.t2DF-[7jX K
[例]自我连接实例51Testing软件测试网%WT0x3JT*`k _
查询每个雇员的名字和该雇员的经理的名字:51Testing软件测试网X8aGS"z`p
SQL> select e1.ename||'   work for   '||e2.ename "Employees and their Managers"51Testing软件测试网y]K%VD8}
  2  from  scott.emp e1,scott.emp e2 where e1.mgr=e2.empno;
51Testing软件测试网(o_Y8]9YB;M$J

u.FCR+Gz0Employees and their Managers
^['C7?[NB H l9f0-------------------------------------------------
Ah;b"b2D0fU_gA0SMITH      work for   FORD51Testing软件测试网-|M$HT-^5g8Z6{Py2o
ALLEN     work for   BLAKE51Testing软件测试网!eS7k4zg
WARD      work for   BLAKE
2Q|0w&w9s8Dj^i0JONES     work for   KING
-O @8S}1[/I\0MARTIN   work for   BLAKE
Ao |4f4r?0BLAKE     work for   KING51Testing软件测试网*u-L'eQ9Vv/w%g
CLARK     work for   KING51Testing软件测试网}}!~P-BZae
SCOTT      work for   JONES51Testing软件测试网Q tG l!`m
TURNER  work for   BLAKE
!q g|%_ V9fb0Y0ADAMS     work for   SCOTT51Testing软件测试网v6X"l cp0}|#G
JAMES      work for   BLAKE
I6^{ A/I3h"R*gW4@0FORD        work for   JONES
Y0]m*`6a h*h0MILLER     work for   CLARK

q)^g3_h&PN6K051Testing软件测试网4D B7au.I&]

1.4UNION , INTERSECT及 MINUS51Testing软件测试网8~ Uv JL$GA9H
UNION:            可以将两个以上的表的相类似的查询结果放在一起 (union all则表示返回所有的行)
*y q~rI^^*n0具体语法:51Testing软件测试网W+Ph8T R!Pm-A
select ...51Testing软件测试网1?!\6U't/u\
union[all]
%h a!B2[E`B `0select...51Testing软件测试网*qv5vyb
==========
51Testing软件测试网6[G'jC*W*u1j@

4J v!LC-U"ud*H0INTERSECT:  返回两个表中相同的信息51Testing软件测试网B-jKg[ h Ok4G0_2\
具体语法:51Testing软件测试网&]2M*K(? gy7I4l|5k#i
select ...51Testing软件测试网 Rq&aMm"^
intersect
%tBP;WZ+z&?0select...51Testing软件测试网#X5\;n7N Jo3]xR
==========
51Testing软件测试网 _"}7F1bWp

51Testing软件测试网:A*]m}'dq d6x

MINUS          :  返回一个表中出现的信息51Testing软件测试网7l1M2G.{(fZ)z:Ba
具体语法:51Testing软件测试网#t n ~z?
select ...
$C8[FQ&e0minus
7C5ZquJO_jP` Q0select...51Testing软件测试网Xy] }:slw
[例1]UNION操作实例
@q8{q W}+h0SQL> select  st_id  from students51Testing软件测试网L `1}+kT1As8Xp9Q:St
  2  union51Testing软件测试网W+Y!}3f]+J;[mh
  3  select  st_id  from student_skill;

0X H)g V4cLDB}0

0\!lAU.k$N af0ST_ID
6om$O.tD%Tz0--------------------51Testing软件测试网~ })~2lg'd7Ot]8V
97323151Testing软件测试网]q _2Pa`@9Jl-_
97323251Testing软件测试网+k-@w2E/Tb
973233

{B/Db%v0

d:gF2uAg${0[例2]INTERSECT操作实例
T:H)m*xC3oh` s0列出有特长的学生的学号51Testing软件测试网!F6AN_&fH
SQL> select st_id from students
P.Bhx4O.G0  2  intersect
nF9[ZK"p0  3  select st_id from student_skill;51Testing软件测试网C)a-O,^M&E
ST_ID
*V/_:?E3Zh!s0--------------------51Testing软件测试网-kEd4kd.IHJlL
973231
-l$v3g%qd0973233
51Testing软件测试网&A\X\/}+et5|/z*d

51Testing软件测试网-Y uw7e(jOg'y0k(Z

[例3]MINUS操作实例
$M.G%pJuC,DK.K `0列出没有特长学生的学号
%Ei3|\'R {&qhU)L'U0select st_id from students
0BO3J)x G(m2u"X:j!h"r#Y0minus51Testing软件测试网/Bz_ x8U{!@ M"n2t
select st_id from student_skill;51Testing软件测试网 c_1P&`Y$Fdy
ST_ID51Testing软件测试网A Yc$ZY
--------------------51Testing软件测试网'B I:n(k8V$M
973232

|f#BH\G051Testing软件测试网3B6rE'S,?*o


shIlHYe02.创建复杂的视图
*RX'BYF*h^&R0许多应用系统有统计等功能,建议最好把这些复杂语句写成视图.下面是几个常用的视图.51Testing软件测试网 S'^x3NIhM
2.1分组视图51Testing软件测试网}2T0V1K(t S%AA$L
[例1]简单的分组视图51Testing软件测试网 \1|H V s$z2C[%H#R
SQL> create or replace view dept_tot as
$t~s5n b@i0  2  select a.dname dept,sum(b.sal) total_sal from scott.dept a,scott.emp b51Testing软件测试网(^E'Cv8b;}?1U
  3  where a.deptno=b.deptno group by a.dname;
51Testing软件测试网/GSX E(j0PB%leV;|

51Testing软件测试网J3A*U9Ox.g)N

查看已建立。
`2L U"{.d:lK0SQL> select * from dept_tot;
51Testing软件测试网9N@"w~7e

/u;KDn;s0DEPT                           TOTAL_SAL51Testing软件测试网&yj b$UJ6c"sM
--------------                     ---------51Testing软件测试网3O3A-oY Q't @ DpS
ACCOUNTING          875051Testing软件测试网5ypp6wVz{(X
RESEARCH              10875
]M8gQ;xr(} O0SALES                        9400

8F ?pD xp9W|e0

-ts%y)E"o ?ElsH0[例2]带复杂函数视图51Testing软件测试网:jmE|A]Xs$`5XL
SQL> create or replace view itemtot as
~%Y'bS)x;n3Zf zb)|0  2  select persion,sum(amount) itemtot from ledger
y n[r.wiv;Ho0  3  where actiondate between51Testing软件测试网 C(\+qtK^I
  4  to_date('01-MAR-1901','dd-mon-yyyy') and
(T$Vw'KDc0  5  to_date('31-MAR-1901','dd-mon-yyyy')51Testing软件测试网+QM8|,V9R
  6  and action in('bought','raid') group by persion;
51Testing软件测试网4H]%uqB6Ms0x

51Testing软件测试网 ]P3j;I_

2.2合计视图51Testing软件测试网7PR:SbBz
[例]合计函数视图实例
#\tM_ EG r0SQL> create or replace view emp_no1  as51Testing软件测试网*KZv(__LA^
  2  select deptno,sum(sal) 工资和,sum(comm) 总和
$YX y;lwV!gr0  3  from scott.emp group by deptno;
Ha+F1xx+O`-D"z0SQL> select * from emp_no1;51Testing软件测试网2Sr"sZv ?2s!t-\
DEPTNO    工资和      总和
ZZ F sV ["l0--------- --------- ---------
G!j']0pA1x*v0       10      8750
"l\-l? \8F0       20     1087551Testing软件测试网[:r2_3VYX f5P!F"aF
       30      9400      2200

Cq _a9?0w051Testing软件测试网5W ^;l ~wC

2.3组合视图51Testing软件测试网3`?9s5A(`1C,`
[例]带组合函数的视图51Testing软件测试网 QH,}#z!L:W
SQL> create or replace view byitem as
.W gt,L0h0S0  2  select l.persion persion.item, amount, 100*amount/item bypersion,100*amount/total bytotal
w@-CR8Zcly0  3  from ledgent l,itemtotal i,total where l.persion=i.persion where l.persion=i.persion51Testing软件测试网7a8e5R b!HJ
  4  and actiondate between51Testing软件测试网6tdW*sXw.`
  5  to_date('01-MAR-1901','dd-mon-yyyy') and
;yY,PM$W/P1l}%n;D0  6  to_date('31-MAR-1901','dd-mon-yyyy')51Testing软件测试网!B&c,g8H5a s Z}.o
  7   and action in('bought','raid') ;
51Testing软件测试网2[ N"QOivjZ

? ?M/BrUiR p)T8S03.家族树51Testing软件测试网uUC,d2D~[&}[
语法:51Testing软件测试网#fD n'zD5y
select column from table_name start with column=value
IcN2Z4s2wd"{+l0connect by prior 父主键=子主键

-a4B-_*GQRQ3k0

(Xa2f%a6w)L5bz03.1排除单一性和分枝51Testing软件测试网J/sV[ r[3R
以ORACLE中的EMP表为例51Testing软件测试网 N6[8i+D:zy0J"i f#Z
[例]从顶到底列出各雇员的信息51Testing软件测试网 N7Ih'K0N1CMI
SQL> select lpad(' ',4*(level-1))||ename name,empno,mgr from emp start with mgr is null
6i9G0\-s4of0  2  connect by prior empno=mgr;

%w&j\#c W[*k6a0

8E gdj2w(X h0NAME                                 EMPNO       MGR
Hu.g:JARQL m(`0---------                                  ---------           ---------51Testing软件测试网 R S8h+K.e5T+AV`
KING                                   7839           
8]b P+h:RN\0    JONES                           7566            783951Testing软件测试网.^9s6CLY!v5G-kJ
          SCOTT                     7788            756651Testing软件测试网3\,VL O eS
                ADAMS              7876            7788
51Testing软件测试网#gj#h#RP%Iq

8Ic1t"F"n3cKH Z;v03.2遍历至根51Testing软件测试网:@;H qe#]
[例1]现在要从某个雇员开始向他的上级列出该雇员的层次结构
k6WxP5E-D'RJ+RM0SQL> col ename for a30;
Mz-kF\;{&r-G)f0SQL> select lpad(' ',4*(level-1))||ename ename,mgr,empno from scott.emp51Testing软件测试网6Q~0q y6H]1~2\iqI
  2  start with mgr=7788 connect by prior mgr=empno;51Testing软件测试网,R$ereg|2xo~1p$a9S
ENAME                                MGR     EMPNO
l3]do`F;U2A7Pr{0------------------------------         ---------    ---------
'F QMa.F0ADAMS                               7788      787651Testing软件测试网+v3Mo}A b
    SCOTT                           7566       7788
v5n4E(ap0Nr#`"B:q.nY0        JONES                       7839       756651Testing软件测试网^5@2{6u U(I` ?
            KING                                        7839

*XlXH L p2@ f0

'rQv+DhxHi0[例2]列出所有雇员的层次结构
"P3`qTCm0SQL> select lpad(' ',4*(level-1))||ename ename,empno,mgr from scott.emp51Testing软件测试网*S)](pr _M7T?
  2  start with mgr is not null51Testing软件测试网P m:pJ,S.b5C(L%a#F
  3  connect by empno=prior mgr;

mie9qh;\*_u g051Testing软件测试网V Rs;@#[I

ENAME                              EMPNO       MGR51Testing软件测试网nN%Sm#y,{J%l
------------------------------       ---------           ---------51Testing软件测试网%\/B}2L7Bp(]M
SMITH                               7369          7902
\|r6a1T#VIn7aI0    FORD                            7902         756651Testing软件测试网zYnH c
        JONES                       7566        7839
*s Ok1w#yx0            KING                    783951Testing软件测试网0xta!I5U z X
ALLEN                               7499        7698
os)b6n,?:~Zh[p0    BLAKE                           7698        7839
Q Z` W/p}0        KING                        783951Testing软件测试网d4j5{wURE
WARD                                7521        7698
5\3a _PbR\oU0    BLAKE                           7698        783951Testing软件测试网 xF YV"Ca_T:]B
        KING                        783951Testing软件测试网%a3da"j*Z5Ua%PwM(Z
JONES                               7566        7839
i0bT pm%J@0    KING                            7839
p]6rOfTR0MARTIN                              7654        769851Testing软件测试网xq]nn9A}5@ r"z
    BLAKE                           7698         7839
w0h \ O ~Uv]9r0        KING                        783951Testing软件测试网 t'g$m\~b
BLAKE                               7698        7839
9^#{%K4~G6f#k s0    KING                            783951Testing软件测试网y8D[(Vt P
CLARK                               7782         7839
]#O@\X8p(ut)?0    KING                            783951Testing软件测试网2l Q2AN RAn#Ll
SCOTT                               7788         756651Testing软件测试网 @;Xa%yo;I
    JONES                           7566        7839

y|4VF.{a+}0

d"X;QnM8xQnA0 51Testing软件测试网u1P2f!MN U&k5` ?

51Testing软件测试网$k4i dLo&E:O{

      
%c `g2]1H0        

Sy`~J4@d0

p(e%M7k!D#]3_AC0           
XL yuE9Hl:i0          

(U7` h rBS051Testing软件测试网 N1ZA(_q5CdG

 51Testing软件测试网_3|;il#RYpy


TAG: 复杂查询语句的使用

 

评分:0

我来说两句

日历

« 2024-04-23  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 3962
  • 日志数: 9
  • 图片数: 1
  • 建立时间: 2008-08-01
  • 更新时间: 2008-10-19

RSS订阅

Open Toolbar