--查询工资不大于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);
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);
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)
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>
SELECT * FROM emp WHERE NOT(sal>1500 or comm IS NOT NULL);
也就是:查询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>
你要的是工资<=1500 And 奖金 is null的数据,
那么不需要的数据有三种:1,工资>1500; 2,奖金 is not null; 2,前面两种都有。写成sql也就是(sal>1500 or comm IS NOT NULL),取下反就是not (...)------
哎呀~额滴神啊,俺可以去当老师了~
SELECT * FROM emp WHERE NOT((sal>1500 AND comm IS NOT NULL));
SELECT * FROM emp WHERE NOT((sal>1500 AND comm IS NOT NULL));