--以下测试均在删除emp.deptno外键情况下执行 --附件udump.rar为测试报告 每份报告中包含SQL解析过程及执行计划 --(每种SQL分为两条 下一条为oracle最后解析执行的SQL) --【假设要查询的部门必须在部门表中存在】 --【例如:如果员工表中存在部门编号为10的员工,但是部门表中却不存在编号为10的部门,则结果集中不应该显示部门编号为10的员工相关信息】 --第一类要查出必须存在一个部门编号为10的员工的所在部门名称以及员工编码及姓名 --五种写法 --第一种 select d.dname, e.empno, e.ename from emp e, dept d where e.deptno = d.deptno and d.deptno = 10; SELECT "D"."DNAME" "DNAME", "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."EMP" "E", "SCOTT"."DEPT" "D" WHERE "E"."DEPTNO" = 10 AND "D"."DEPTNO" = 10; --第二种 select d.dname, e.empno, e.ename from emp e, (select * from dept t where t.deptno = 10) d where e.deptno = d.deptno; SELECT "T"."DNAME" "DNAME", "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."EMP" "E", "SCOTT"."DEPT" "T" WHERE "E"."DEPTNO" = 10 AND "T"."DEPTNO" = 10; --第三种 select d.dname, e.empno, e.ename from emp e, (select t.deptno, t.dname from dept t where t.deptno = 10) d where e.deptno = d.deptno; SELECT "T"."DNAME" "DNAME", "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."EMP" "E", "SCOTT"."DEPT" "T" WHERE "E"."DEPTNO" = 10 AND "T"."DEPTNO" = 10; --第四种 select d.dname, e.empno, e.ename from emp e, dept d where e.deptno = d.deptno and exists (select 1 from dual where e.deptno = 10); SELECT /*+ */ "D"."DNAME" "DNAME", "SYS_ALIAS_1"."EMPNO" "EMPNO", "SYS_ALIAS_1"."ENAME" "ENAME" FROM "SCOTT"."EMP" "SYS_ALIAS_1", "SCOTT"."DEPT" "D" WHERE EXISTS (SELECT /*+ */ 0 FROM "SYS"."DUAL" "DUAL" WHERE "SYS_ALIAS_1"."DEPTNO" = 10) AND "SYS_ALIAS_1"."DEPTNO" = "D"."DEPTNO" --第五种 select d.dname, e.empno, e.ename from emp e, dept d where e.deptno = d.deptno and exists (select 1 from dept t where d.deptno = t.deptno and t.deptno = 10); SELECT "D"."DNAME" "DNAME", "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."DEPT" "T", "SCOTT"."EMP" "E", "SCOTT"."DEPT" "D" WHERE "T"."DEPTNO" = 10 AND "D"."DEPTNO" = "T"."DEPTNO" AND "E"."DEPTNO" = 10 AND "D"."DEPTNO" = 10; --第二类要查出必须存在一个部门编号为10的员工的员工编码及姓名 --四种写法 --第一种 select e.empno, e.ename from emp e, dept d where e.deptno = d.deptno and d.deptno = 10; SELECT "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."EMP" "E", "SCOTT"."DEPT" "D" WHERE "E"."DEPTNO" = 10 AND "D"."DEPTNO" = 10; --第二种 select e.empno, e.ename from emp e, (select * from dept t where t.deptno = 10) d where e.deptno = d.deptno; SELECT "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."EMP" "E", "SCOTT"."DEPT" "T" WHERE "E"."DEPTNO" = 10 AND "T"."DEPTNO" = 10; --第三种 select e.empno, e.ename from emp e, (select t.deptno from dept t where t.deptno = 10) d where e.deptno = d.deptno; SELECT "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."EMP" "E", "SCOTT"."DEPT" "T" WHERE "E"."DEPTNO" = 10 AND "T"."DEPTNO" = 10; --第四种 select e.empno, e.ename from emp e where e.deptno in (select d.deptno from dept d where d.deptno = 10); SELECT "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."DEPT" "D", "SCOTT"."EMP" "E" WHERE "D"."DEPTNO" = 10 AND "E"."DEPTNO" = 10; --第五种 select e.empno, e.ename from emp e where exists (select 1 from dept d where e.deptno = d.deptno and d.deptno = 10); SELECT "E"."EMPNO" "EMPNO", "E"."ENAME" "ENAME" FROM "SCOTT"."DEPT" "D", "SCOTT"."EMP" "E" WHERE "D"."DEPTNO" = 10 AND "E"."DEPTNO" = 10 AND "E"."DEPTNO" = "D"."DEPTNO"; --第一类SQL结论:1,2,3三条SQL效率一样、4,5两条效率相对较低,4最低。 --第二类SQL结论:1,2,3,4四条SQL效率一样、5效率最高。