数据库Oracle之多表查询:笛卡尔积、等值连接、不等值连接、外连接,自连接




1笛卡尔积



 
列数相加
 
行数记录相乘

 
   SQL> ed
  
已写入 fileafiedt.buf
  
    1  select count(*)
    2* from dept, emp
  SQL> /
  
    COUNT(*)
  ----------
          56
    
通过连接条件可以避免笛卡尔积       
    1  select *
    2  from dept d, emp e
    3* where e.deptno = d.deptno
  SQL> set linesize 160
  SQL> /



2、等值连接



 eg:
查询员工信息,员工号,姓名,月薪,部门名称
 
 select e.empno, e.ename, e.sal, d.dname
  from emp e, dept d
  where e.deptno = d.deptno
  /        
3、不等值连接 



 eg:
查询员工信息,员工号,姓名,月薪,薪水级别 
 
  
  select  e.empno, e.ename, e.sal, s.grade
  from emp e, SALGRADE s
  where e.sal >= s.losal and e.sal <= s.hisal 
  -- where e.sal between s.losal and s.hisal 
       EMPNOENAME            SAL      GRADE
  ---------- ---------- ---------- ----------
        7369 SMITH            800          1
        7900JAMES            950          1
        7876ADAMS           1100          1
        7521WARD            1250          2
        7654MARTIN          1250          2
        7934MILLER          1300          2
        7844TURNER          1500          3
        7499ALLEN           1600          3
        7782CLARK           2450          4
        7698BLAKE           2850          4
        7566JONES           2975          4
        7788 SCOTT           3000          4
        7902FORD            3000          4
        7839KING            5000          5
  
  
已选择14行。
  
4、外连接



 eg:
按部门统计员工人数:部门号部门名称各部门人数
 
 -- 1
确定是多表查询,因为部门表中没有人数,人数和员工表有关
 -- 2
因为按照各个部门人数 ,所以用到分组查询
 
 select d.deptno, d.dname, count(*)
 from dept d, emp e
 where d.deptno = e.deptno
 group by d.deptno, d.dname
 
 
第一阶段 
select d.deptno, d.dname, count(*)
 from dept d, emp e
 where d.deptno = e.deptno(+)
 group by d.deptno, d.dname
/


SQL>/


   DEPTNO DNAME           COUNT(*)
---------- -------------- ----------
        10ACCOUNTING             3
        20RESEARCH               5
        30SALES                  6
       
 ==
分析40号部门为什么没有被统计对.....
 ===
我们希望把不符合条件的部门(40部门)也要显示出来..
 ===
希望把不满足等值条件(whered.deptno = e.deptno)的数据,也显示出来
 
 ======>
外连接
 
左连接:想把 d.deptno都显示出来,,(+)写在等号的右边,叫左连接
 
右连接:想把 d.deptno都显示出来,,(+)写在等号的左边,叫右连接
 


   1  select d.deptno, d.dname, count(e.empno)
    2     from dept d, emp e
    3     where d.deptno = e.deptno(+)
    4*    group by d.deptno, d.dname
  SQL> /
  
      DEPTNODNAME          COUNT(E.EMPNO)
  ---------- -------------- --------------
          10ACCOUNTING                 3
          40OPERATIONS                 0
          20RESEARCH                   5
          30 SALES                      6
  
  SQL> ed
 

5、自连接:


--查询员工信息 ,老板信息
 
显示:  ****的老板是**** 
 
 ---
员工的 .老板 ....
 ---
员工表老板表
 --
等值连接条件
   
员工表的老板=老板表的员工
   
   select e.ename || '
的老板是'||b.ename
   from emp e, emp b
   where e.mgr = b.empno
   
   select e.ename || '
的老板是'||b.ename
   from emp e, emp b
   where e.mgr = b.empno(+)
   
  
  
  
  ----
大老板没有出来....通过左连接 ....
     1  select e.ename || '
的老板是'|| b.ename
 2                    from emp e, emp b
 3*                   where e.mgr = b.empno(+)
SQL> /
  
  
  
  E.ENAME||'
的老板是'||B.ENAME
  ----------------------------
  SMITH
的老板是FORD
  ALLEN
的老板是BLAKE
  WARD
的老板是BLAKE
  JONES
的老板是KING
  MARTIN
的老板是BLAKE
  BLAKE
的老板是KING
  CLARK
的老板是KING
  SCOTT
的老板是JONES
  KING
的老板是
  TURNER
的老板是BLAKE
  ADAMS
的老板是SCOTT
  JAMES
的老板是BLAKE
  FORD
的老板是JONES
  MILLER
的老板是CLARK
  
  
已选择14行。
 
 
 ======
显示优化  
SQL> ed
已写入 file afiedt.buf


 1  select e.ename || '的老板是'||nvl(b.ename, '他自己')
 2                    from emp e, emp b
 3*                   where e.mgr = b.empno(+)
SQL> /


 E.ENAME||'的老板是'||NVL(B.E
 ----------------------------
 SMITH
的老板是FORD
 ALLEN
的老板是BLAKE
 WARD
的老板是BLAKE
 JONES
的老板是KING
 MARTIN
的老板是BLAKE
 BLAKE
的老板是KING
 CLARK
的老板是KING
 SCOTT
的老板是JONES
 KING
的老板是他自己
 TURNER
的老板是BLAKE
 ADAMS
的老板是SCOTT
 JAMES
的老板是BLAKE
 FORD
的老板是JONES
 MILLER
的老板是CLARK
 
 
已选择14行。


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值