Oracle多表查询

 
SQL> --等值连接
SQL> select e.empno,e.ename,e.sal,d.dname
  2  from emp e,dept d
  3  where e.deptno=d.deptno;
等值操作会忽略某个表中单独存在的东西
 
SQL> -- 不等值连接
 
SQL> select e.empno,e.ename,e.sal,s.grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;
 
SQL> --外连接:
SQL> -- 按部门统计员工信息:部门号 部门名称  人数
SQL> /*
SQL> 当某个字段的数据值存在单独的表中,任然希望包含在最后的结果中
SQL> 左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表任然被包含在最后的结果中
SQL>     写法:where e.deptno=d.deptno(+)
SQL> 右外连接:当where e.deptno=d.deptno不成立的时候,等号右边的表任然被包含在最后的结果中
SQL>     写法: where e.deptno(+)=d.deptno
SQL> */
语句是一样的,都依照范围大的表的字段
SQL> select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数
  2  from emp e,dept d
  3  where e.deptno(+)=d.deptno
  4  group by d.deptno,d.dname;
 
SQL> --自连接:通过表的别名,将同一张表视为多张表
SQL>  --自连接:不适合操作大表
SQL> select e.ename 员工姓名,b.ename 老板姓名
  2  from emp e,emp b
  3  where e.mgr=b.empno;
 
SQL> --层次查询
SQL> select level,empno,ename,mgr//level代表树的深度,当前节点所在深度
  2  from emp
  3  connect by prior empno=mgr链接查询的条件,父节点的员工号=子节点的老板号
  4  start with mgr is null开始的节点位置,该节点的老板号为空
  5  order by 1;排序
层次查询是将所有的数据按照一定的规则读成一棵树,然后对数按要求检索
结果:
     LEVEL      EMPNO ENAME           MGR
---------- ---------- -------- ----------
         1       7839 KING
         2       7566 JONES          7839
         2       7698 BLAKE          7839
         2       7782 CLARK          7839
         3       7902 FORD           7566
         3       7521 WARD           7698
         3       7900 JAMES          7698
         3       7934 MILLER         7782
         3       7499 ALLEN          7698
         3       7788 SCOTT          7566
         3       7654 MARTIN         7698
         3       7844 TURNER         7698
         4       7876 ADAMS          7788
         4       7369 SMITH          7902
 
已选择14行。
 
原文地址:https://www.cnblogs.com/anzhi/p/7515740.html