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行。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
原文链接
如有问题, 可邮件(zxy.hope@gmail.com)咨询.