1. 핵심 원리
NOT IN 서브 쿼리는 메인 쿼리에서 특정 조건에 해당하지 않는 데이터를 필터링하기 위해 사용됩니다. 즉, 특정 조건을 만족하지 않는 데이터를 검색하여 그 결과를 반환합니다. 이 예제에서는 관리자가 아닌 사원들의 이름과 월급, 직업을 출력하기 위해 사용됩니다.
2. 실무에서 쓰이는 이유
NOT IN 연산자는 특정 집합에 포함되지 않는 데이터를 검색하는 데 유용하며, 특히 서브 쿼리를 사용하여 복잡한 조건을 처리할 때 자주 사용됩니다. 이 방법은 특히 데이터베이스 내에서 누락된 데이터를 식별하거나 제외해야 할 데이터를 필터링할 때 유용합니다.
3. 실무에서 구체적으로 사용되는 상황 예측
- 사원 관리 시스템에서 특정 관리자에게 할당되지 않은 사원 목록을 출력할 때.
- 특정 제품군에 속하지 않는 제품을 필터링하여 분석할 때.
- 프로젝트에서 제외된 팀원들을 식별하기 위해 사용될 수 있습니다.
4. 자주 사용되는 윈도우 표시 및 설명
이번 NOT IN 서브 쿼리와 관련하여 자주 사용되는 SQL 함수는 다음과 같습니다:
- RANK()
- RANK() 함수는 결과 집합 내에서 순위를 매길 때 사용됩니다. 동일한 값에는 동일한 순위를 부여합니다.
- SQL 코드 예시:
sql SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) AS rank FROM emp;
- ROW_NUMBER()
- ROW_NUMBER() 함수는 결과 집합에 고유한 순번을 부여합니다.
- SQL 코드 예시:
sql SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS row_num FROM emp;
- DENSE_RANK()
- DENSE_RANK() 함수는 동일한 값에는 동일한 순위를 부여하지만, 순위에서 간격이 발생하지 않습니다.
- SQL 코드 예시:
sql SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS dense_rank FROM emp;
5. 연습 문제
관리자가 아닌 사원들의 이름, 월급, 직업을 출력하는 쿼리를 작성하시오.
6. 연습 문제 해답 및 테이블 표시
SELECT ename, sal, job
FROM emp
WHERE empno NOT IN (SELECT mgr
FROM emp
WHERE mgr IS NOT NULL);
결과 테이블:
ENAME | SAL | JOB |
---|---|---|
ADAMS | 1100 | CLERK |
WARD | 1250 | SALESMAN |
ALLEN | 1600 | SALESMAN |
JAMES | 950 | CLERK |
SMITH | 800 | CLERK |
MILLER | 1300 | CLERK |
MARTIN | 1250 | SALESMAN |
TURNER | 1500 | SALESMAN |
7. 응용 문제
관리자가 아닌 사원 중에서 월급이 1200 이상인 사원들의 이름, 월급, 직업을 출력하는 쿼리를 작성하시오.
8. 응용 문제 해답 및 테이블 표시
SELECT ename, sal, job
FROM emp
WHERE empno NOT IN (SELECT mgr
FROM emp
WHERE mgr IS NOT NULL)
AND sal >= 1200;
결과 테이블:
ENAME | SAL | JOB |
---|---|---|
WARD | 1250 | SALESMAN |
ALLEN | 1600 | SALESMAN |
MILLER | 1300 | CLERK |
MARTIN | 1250 | SALESMAN |
TURNER | 1500 | SALESMAN |
9. 전자상거래 업계에서 쓰일 수 있는 경우 예측
- 특정 관리자에게 할당되지 않은 상품이나 주문을 검색할 때.
- 특정 카테고리에 속하지 않은 제품 목록을 필터링할 때.
10. 전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성
- 특정 관리자에게 할당되지 않은 주문 목록을 검색하시오.
SELECT order_id, order_date
FROM orders
WHERE manager_id NOT IN (SELECT manager_id
FROM managers
WHERE manager_id IS NOT NULL);
- 특정 카테고리에 속하지 않은 제품을 검색하시오.
SELECT product_id, product_name
FROM products
WHERE category_id NOT IN (SELECT category_id
FROM categories
WHERE category_id IS NOT NULL);
11. 10번에 대한 SQL 코드를 시각적으로 이해하기 쉽도록 테이블 예시 작성
- 주문 테이블 예시: ORDER_ID ORDER_DATE MANAGER_ID 1001 2023-01-15 NULL 1002 2023-01-16 102 1003 2023-01-17 103 SQL 결과 예시:
SELECT order_id, order_date
FROM orders
WHERE manager_id NOT IN (SELECT manager_id
FROM managers
WHERE manager_id IS NOT NULL);
- 결과:
1001 | 2023-01-15 | NULL
- 제품 테이블 예시: PRODUCT_ID PRODUCT_NAME CATEGORY_ID 2001 Laptop NULL 2002 Phone 201 2003 Tablet 202 SQL 결과 예시:
SELECT product_id, product_name
FROM products
WHERE category_id NOT IN (SELECT category_id
FROM categories
WHERE category_id IS NOT NULL);
- 결과:
2001 | Laptop | NULL
요약: 이 예제에서는 NOT IN 연산자를 사용하여 데이터베이스에서 특정 조건을 만족하지 않는 데이터를 효과적으로 필터링할 수 있음을 보여줍니다.