3. NOT IN
특정 쿼리에서 검색한 데이터 중 다른 쿼리에 없는 데이터를 검색하려면 NOT IN 연산자를 사용한다.
EX ) 관리자가 아닌 사원들의 이름과 월급, 직업을 출력하라.
관리자가 아닌 사원은 직속 부하 직원이 한 명도 없는 사원을 의미한다. 즉 사원번호(EMPNO)가 관리자 번호(MGR)와 같지 않은 사원을 찾으면 된다.
이 경우 또한 단일행 서브 쿼리의 연산자를 사용하면 에러가 발생한다.
SELECT ENAME, SAL, JOB
FROM EMP
WHERE EMPNO != (SELECT MGR
FROM EMP);
ORA-01427: single-row subquery returns more than one row
따라서 이 경우에는 다중 행 서브 쿼리 중 NOT IN을 사용하여 문제를 해결할 수 있다. 그러나 NOT IN을 사용하여 쿼리를 작성해도 선택된 레코드가 없다
SELECT ENAME, SAL, JOB
FROM EMP
WHERE EMPNO NOT IN (SELECT MGR
FROM EMP);
선택된 레코드가 없는 이유는 MGR에 NULL 값이 포함되어있기 때문이다.
NOT IN을 사용할 경우 서브 쿼리에서 메인 쿼리로 NULL 값이 하나라도 리턴되면 결과가 출력되지 않는다. 이는 NOT IN으로 작성한 서브쿼리문은 다음의 SQL과 같기 때문이다.
SELECT ENAME, SAL, JOB
FROM EMP
WHERE EMPNO != 7839 AND EMPNO != 7698 AND EMPNO != 7902 AND EMPNO != 7566 AND
EMPNO != 7566 AND EMPNO != 7788 AND EMPNO != 7782 AND EMPNO != NULL;
이 SQL의 결과는 NULL 이다. 전체가 NULL이 되어버려 결과가 출력되지 않는다. 따라서 서브 쿼리문에서 NOT IN을 사용할 때는 반드시 서브 쿼리문에서 메인 쿼리문으로 NULL 값이 리턴되지 않게 해야한다.
4. EXISTS / NOT EXISTS
특정 테이블의 데이터가 다른 테이블에도 존재하는 지, 존재하지 않는 지 여부를 확인하기 위해 EXISTS / NOT EXISTS를 WHERE절 바로 다음에 사용한다.
EXISTS
A 테이블의 데이터가 B테이블에도 존재하는 지 여부를 확인하기위해 EXISTS문을 사용한다.
EX ) 부서 테이블에 있는 부서 번호 중에서 사원 테이블에도 존재하는 부서 번호의 부서번호, 부서명, 부서 위치를 출력하시오
부서 테이블(DEPT)에 있는 부서 번호(DEPTNO)가 사원 테이블(EMP)에도 존재하는지 D.DEPTNO = E.DEPTNO 조건을 통해 검색하게 된다.
SELECT *
FROM DEPT D
WHERE EXISTS (SELECT *
FROM EMP E
WHERE D.DEPTNO = E.DEPTNO);
NOT EXISTS
EXISTS와 반대로 A 테이블의 데이터가 B 테이블에 존재하지 않는지의 여부를 확인하기 위해 NOT EXISTS를 사용한다.
SELECT *
FROM DEPT D
WHERE NOT EXISTS (SELECT *
FROM EMP E
WHERE D.DEPTNO = E.DEPTNO)
'Study > SQL' 카테고리의 다른 글
[SQL]데이터 입력, 수정, 삭제 - INSERT, UPDATE, DELETE, TRUNCATE, DROP (0) | 2023.01.11 |
---|---|
[SQL] 서브 쿼리 사용하기 3 - HAVING절, FROM절, SELECT 절 (0) | 2023.01.09 |
[SQL] 서브 쿼리 사용하기 1 - 단일 행, 다중 행 (0) | 2022.01.10 |
[SQL]여러 테이블의 데이터를 조인해서 출력하기(ON절, USING절, NATURAL JOIN, LEFFT/RIGHT OUTER JOIN) (0) | 2021.11.08 |
[SQL] JOIN - EQUI JOIN, NON EQUI JOIN, OUTER JOIN, SELF JOIN (0) | 2021.10.15 |