The WHERE EXISTS subquery is used when we want to display all rows where we have a matching column in both tables. In most cases, this type of subquery can be re-written with a standard join to improve performance.
Where not exists (subquery)
The WHERE NOT EXISTS subquery is used to display cases where a selected column does not appear in another table.
As a general rule, the use of the NOT EXISTS subqueries are discouraged because the query can often be re-written as a standard join with much faster performance.
Some related examples.
1. Use EXISTS to link two queries.
SQL> SELECT * FROM emp WHERE EXISTS
2 (select * from dept where dept.deptno = emp.deptno);
EMPNO ENAME JOB MGR HIREDATE SAL
---------- ---------- --------- ---------- --------- ----------
7934 MILLER CLERK 7782 23-JAN-82 1300
7839 KING PRESIDENT 17-NOV-81 5000
7782 CLARK MANAGER 7839 09-JUN-81 2450
7902 FORD ANALYST 7566 03-DEC-81 3000
7876 ADAMS CLERK 7788 12-JAN-83 1100
7788 SCOTT ANALYST 7566 09-DEC-82 3000
7566 JONES MANAGER 7839 02-APR-81 2975
7369 SMITH CLERK 7902 17-DEC-80 800
7900 JAMES CLERK 7698 03-DEC-81 950
7844 TURNER SALESMAN 7698 08-SEP-81 1500
7698 BLAKE MANAGER 7839 01-MAY-81 2850
EMPNO ENAME JOB MGR HIREDATE SAL
---------- ---------- --------- ---------- --------- ----------
7654 MARTIN SALESMAN 7698 28-SEP-81 1250
7521 WARD SALESMAN 7698 22-FEB-81 1250
7499 ALLEN SALESMAN 7698 20-FEB-81 1600
2. The EXISTS condition can also be combined with the NOT operator.
SQL> SELECT * 2 FROM emp 3 WHERE not exists (select * from dept 4 Where dept.deptno = emp.deptno);
3. Test the NOT EXISTS version.
SQL> SELECT cust_no, lastname
2 FROM customer c
3 WHERE NOT EXISTS
4 (SELECT cust_no FROM ord
5 WHERE cust_no = c.cust_no);
CUST_NO LASTNAME
---------- --------------------
5 Hill
8 Chili
3 Jason
10 Hack
14 Pete
13 Richer
11 Bill
7 rows selected.
4. Display the customer number and last name of all customers with no orders.
SQL> select cust_no, lastname
2 from customer c
3 where not exists
4 (select * from ord o where o.cust_no = c.cust_no);
CUST_NO LASTNAME
---------- --------------------
5 Hill
8 Chili
3 Jason
10 Hack
14 Pete
13 Richer
11 Bill
7 rows selected.
No comments:
Post a Comment