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行。

浏览 888 评论 0 赞 0 砸 0 标签: oracle
评论
还可以再输入500个字

请您注意

·自觉遵守:爱国、守法、自律、真实、文明的原则
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·您在NoteShare上发表的作品,NoteShare有权在网站内保留、转载、引用或者删除
·参与本评论即表明您已经阅读并接受上述条款