暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 我只想知道下面两个查询之间的区别。

askTom 2018-05-29
215

问题描述

问: 列出比自己的MGRS高的Emps。

从emp e中选择 *,emp m其中e.mgr = m.empno和e.hiredate
从emp e中选择 *,emp m其中e.empno = m.mgr和e.hiredate> m.hiredate;


以上两个查询得到相同的结果,但我想知道这两个查询之间的确切区别。

专家解答

当我们取出hiredate并在列中添加一些别名时,它变得更加清晰

SQL> select e.*, m.*
  2  from emp e,emp m
  3  where e.mgr = m.empno;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20       7566 JONES      MANAGER         7839 02-APR-81       1232                    20
      7788 SCOTT      ANALYST         7566 09-DEC-82       3000                    20       7566 JONES      MANAGER         7839 02-APR-81       1232                    20
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500                    30       7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30       7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30       7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30       7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30       7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10       7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7876 ADAMS      CLERK           7788 12-JAN-83       1100                    20       7788 SCOTT      ANALYST         7566 09-DEC-82       3000                    20
      7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30       7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7566 JONES      MANAGER         7839 02-APR-81       1232                    20       7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10       7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20       7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

13 rows selected.

SQL> select e.*, m.*
  2  from emp e,emp m
  3  where e.empno= m.mgr ;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7566 JONES      MANAGER         7839 02-APR-81       1232                    20       7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7566 JONES      MANAGER         7839 02-APR-81       1232                    20       7788 SCOTT      ANALYST         7566 09-DEC-82       3000                    20
      7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30       7844 TURNER     SALESMAN        7698 08-SEP-81       1500                    30
      7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30       7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30       7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30       7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30       7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10       7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
      7788 SCOTT      ANALYST         7566 09-DEC-82       3000                    20       7876 ADAMS      CLERK           7788 12-JAN-83       1100                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10       7698 BLAKE      MANAGER         7839 01-MAY-81       1232                    30
      7839 KING       PRESIDENT            17-NOV-81       5000                    10       7566 JONES      MANAGER         7839 02-APR-81       1232                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10       7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20       7369 SMITH      CLERK           7902 17-DEC-80        800                    20


所以

查询1: “e” 代表员工,“m” 代表经理
查询2: “e” 实际代表管理者,“m” 代表员工

因此,需要翻转hiredate谓词的 “<” 和 “>”。

就理解而言,您可能会认为第一个查询 “更正确”,因为所使用的别名和结果之间没有歧义。





「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论