--查询工资不大于1500,同时每月不可得到奖金的雇员
SELECT * FROM emp WHERE NOT(sal>1500 AND comm IS NOT NULL);
为什么上面这句查询出来的结果是不是我想要的?  不是先求括号里面的然后取反吗?下面才是我想要的
SELECT * FROM emp WHERE NOT(sal>1500) AND NOT(comm IS NOT NULL);

解决方案 »

  1.   


    scott@YPCOST> SELECT * FROM emp WHERE NOT(sal>1500 AND comm IS NOT NULL);     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17        800        900         20
          7521 WARD       SALESMAN        7698 1981-02-22       1250        500         30
          7654 MARTIN     SALESMAN        7698 1981-09-28       1250       1400         30
          7698 BLAKE      MANAGER         7839 1981-05-01       2850                    30
          7782 CLARK      MANAGER         7839 1981-06-09       2450                    10
          7839 KING       PRESIDENT            1981-11-17       5000                    10
          7844 TURNER     SALESMAN        7698 1981-09-08       1500          0         30
          7876 ADAMS      CLERK           7788 1987-05-23       1100        900         20
          7900 JAMES      CLERK           7698 1981-12-03        950                    30
          7934 MILLER     CLERK           7782 1982-01-23       1430                    1010 rows selected.
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3956160932--------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |    10 |   380 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| EMP  |    10 |   380 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   1 - filter("COMM" IS NULL OR "SAL"<=1500)/*
    执行计划可以解释很多问题 NOT(sal>1500 AND comm IS NOT NULL) 等价于 comm is null or sal<=1500
    而NOT(sal>1500) AND NOT(comm IS NOT NULL) 等价于 comm is null and sal<=1500
    说到这里 你懂的~~
    */
    scott@YPCOST> SELECT * FROM emp WHERE NOT(sal>1500) AND NOT(comm IS NOT NULL);     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
          7900 JAMES      CLERK           7698 1981-12-03        950                    30
          7934 MILLER     CLERK           7782 1982-01-23       1430                    10
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3956160932--------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     3 |   114 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| EMP  |     3 |   114 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   1 - filter("COMM" IS NULL AND "SAL"<=1500)
      

  2.   

    数理逻辑没学好不是.and没变or
    SQL> SELECT * FROM emp WHERE NOT(sal>1500 AND comm IS NOT NULL);
     
                    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    --------------------- ---------- --------- ----- ----------- --------- --------- ------
                     7369 SMITH      CLERK      7902 1980-12-17     968.12               20
                     7566 JONES      MANAGER    7839 1981-4-2      3599.75               20
                     7698 BLAKE      MANAGER    7839 1981-5-1      3448.50               30
                     7782 CLARK      MANAGER    7839 1981-6-9      2964.50               10
                     7788 SCOTT      ANALYST    7566 1987-4-19     3630.00               20
                     7839 KING       PRESIDENT       1981-11-17    6050.00               10
                     7876 ADAMS      CLERK      7788 1987-5-23     1331.00               20
                     7900 JAMES      CLERK      7698 1981-12-3     1149.50               30
                     7902 FORD       ANALYST    7566 1981-12-3     3630.00               20
                     7934 MILLER     CLERK      7782 1982-1-23     1573.00               10
     
    10 rows selected
     
    SQL> SELECT * FROM emp WHERE NOT(sal>1500) or NOT(comm IS NOT NULL);
     
                    EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    --------------------- ---------- --------- ----- ----------- --------- --------- ------
                     7369 SMITH      CLERK      7902 1980-12-17     968.12               20
                     7566 JONES      MANAGER    7839 1981-4-2      3599.75               20
                     7698 BLAKE      MANAGER    7839 1981-5-1      3448.50               30
                     7782 CLARK      MANAGER    7839 1981-6-9      2964.50               10
                     7788 SCOTT      ANALYST    7566 1987-4-19     3630.00               20
                     7839 KING       PRESIDENT       1981-11-17    6050.00               10
                     7876 ADAMS      CLERK      7788 1987-5-23     1331.00               20
                     7900 JAMES      CLERK      7698 1981-12-3     1149.50               30
                     7902 FORD       ANALYST    7566 1981-12-3     3630.00               20
                     7934 MILLER     CLERK      7782 1982-1-23     1573.00               10
     
    10 rows selected
     
    SQL> 
      

  3.   

    你想要的应该这么写
    SELECT * FROM emp WHERE NOT(sal>1500 or comm IS NOT NULL);
      

  4.   


    也就是:查询sal小于等于1500,同时每月comm为空的员工
    SQL> select * from emp;EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20
     7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30
     7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
     7566 JONES      MANAGER    7839 1981-4-2      2975.00               20
     7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
     7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30
     7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10
     7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20
     7839 KING       PRESIDENT       1981-11-17    5000.00               10
     7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
     7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
     7900 JAMES      CLERK      7698 1981-12-3      950.00               30
     7902 FORD       ANALYST    7566 1981-12-3     3000.00               20
     7934 MILLER     CLERK      7782 1982-1-23     1300.00               1014 rows selectedSQL> select * from emp where sal<=1500;EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20
     7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30
     7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30
     7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30
     7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
     7900 JAMES      CLERK      7698 1981-12-3      950.00               30
     7934 MILLER     CLERK      7782 1982-1-23     1300.00               107 rows selectedSQL> select * from emp where sal<=1500 and comm is null;EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20
     7876 ADAMS      CLERK      7788 1987-5-23     1100.00               20
     7900 JAMES      CLERK      7698 1981-12-3      950.00               30
     7934 MILLER     CLERK      7782 1982-1-23     1300.00               10SQL> 
      

  5.   

    楼主悲剧了,这个是取反的一个简单逻辑啊:
    你要的是工资<=1500 And 奖金 is null的数据,
    那么不需要的数据有三种:1,工资>1500; 2,奖金 is not null;  2,前面两种都有。写成sql也就是(sal>1500 or comm IS NOT NULL),取下反就是not (...)------
    哎呀~额滴神啊,俺可以去当老师了~
      

  6.   

    你少加了个括号,像我这么写才容易理解
    SELECT * FROM emp WHERE NOT((sal>1500 AND comm IS NOT NULL));
      

  7.   

    你少加了个括号,像我这么写才容易理解
    SELECT * FROM emp WHERE NOT((sal>1500 AND comm IS NOT NULL));
      

  8.   

     select * from emp where sal<=1500 and comm is null;
      

  9.   

    SELECT * FROM emp WHERE NOT(sal>1500 or comm IS NOT NULL);
      

  10.   

    SELECT * FROM emp WHERE NOT(sal>1500 or comm IS NOT NULL);      中间要用or