1. 핵심 원리
서브 쿼리는 하나의 쿼리 안에 또 다른 쿼리가 포함된 형태를 말합니다. 메인 쿼리가 데이터를 검색할 때, 특정 조건을 더 세부적으로 설정하거나, 계산된 값을 기준으로 검색할 때 주로 사용됩니다. 서브 쿼리는 메인 쿼리의 WHERE 절, FROM 절 또는 SELECT 절에 위치할 수 있으며, 서브 쿼리의 결과는 메인 쿼리의 조건으로 사용됩니다.
2. 실무에서 쓰이는 이유
서브 쿼리는 복잡한 데이터 검색 요구사항을 만족시키기 위해 사용됩니다. 여러 테이블의 데이터를 연관시키거나, 특정 조건에 맞는 데이터를 추출할 때, 서브 쿼리를 사용하면 효율적으로 데이터를 조회할 수 있습니다. 특히, 특정 기준보다 큰 값, 작은 값 또는 특정 집합에 포함된 데이터를 검색할 때 자주 활용됩니다.
3. 실무에서 구체적으로 사용되는 상황 예측
- 특정 사원의 월급보다 더 높은 월급을 받는 사원들의 목록을 검색할 때
- 고객의 총 구매 금액이 특정 금액 이상인 고객 목록을 추출할 때
- 특정 상품군 내에서 가장 인기 있는 제품을 찾기 위해 조회할 때
- 특정 부서에서 근무하는 사원 중에서 특정 기준을 충족하는 사원들의 목록을 찾을 때
4. 자주 사용되는 윈도우 표시 및 설명
이번에 배우는 서브 쿼리와 관련된 자주 사용하는 윈도우 함수는 ROW_NUMBER()입니다. 이 함수는 결과 집합 내에서 각 행에 고유한 숫자를 부여하여 순위를 매길 때 사용됩니다. 서브 쿼리와 함께 사용하면, 특정 조건에 맞는 상위 N개의 데이터를 추출하거나, 특정 순위에 해당하는 데이터를 선택할 수 있습니다.
SELECT ename, sal
FROM (
SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS rnk
FROM emp
)
WHERE rnk <= 3;
이 쿼리는 월급이 높은 순서대로 사원 목록을 정렬하고, 그 중 상위 3명의 사원을 선택합니다.
5. 연습 문제
JONES
보다 더 높은 월급을 받는 사원들의 이름과 월급을 출력하는 SQL 쿼리를 작성하세요.- 특정 사원의 월급과 동일한 월급을 받는 사원들의 목록을 출력하는 쿼리를 작성하세요.
6. 연습 문제 해답 및 테이블 표시
SELECT ename, sal FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'JONES');
출력 결과:
ENAME | SAL |
---|---|
KING | 5000 |
FORD | 3000 |
SCOTT | 3000 |
2.
SELECT ename, sal
FROM emp
WHERE sal = (SELECT sal FROM emp WHERE ename = 'SCOTT');
출력 결과:
ENAME | SAL |
---|---|
FORD | 3000 |
SCOTT | 3000 |
7. 응용 문제
- ‘SCOTT’와 동일한 월급을 받는 사원들 중 ‘SCOTT’은 제외하고 나머지 사원의 이름과 월급을 출력하는 SQL 쿼리를 작성하세요.
8. 응용 문제 해답 및 테이블 표시
1.
SELECT ename, sal
FROM emp
WHERE sal = (SELECT sal FROM emp WHERE ename = 'SCOTT')
AND ename != 'SCOTT';
출력 결과:
ENAME | SAL |
---|---|
FORD | 3000 |
9. 전자상거래 업계에서 쓰일 수 있는 경우 예측
- 특정 고객의 구매 총액보다 더 많은 금액을 구매한 고객 목록을 조회할 때
- 특정 상품군의 매출 상위 N개 제품을 조회할 때
10. 전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성
- ‘A’ 고객보다 더 많이 구매한 고객들의 목록을 출력하는 SQL 쿼리를 작성하세요.
- 특정 카테고리 내에서 가장 높은 판매량을 가진 제품의 정보를 출력하는 쿼리를 작성하세요.
1.
SELECT customer_name, total_purchase
FROM customers
WHERE total_purchase > (SELECT total_purchase FROM customers WHERE customer_name = 'A');
2.
SELECT product_name, sales
FROM products
WHERE sales = (SELECT MAX(sales) FROM products WHERE category = 'Electronics');
죄송합니다. 11번을 빠뜨렸습니다. 지금 추가해서 작성하겠습니다.
11. 10번에 대한 SQL 코드를 시각적으로 이해하기 쉽도록 테이블 예시 작성
- 고객 테이블 예시 (고객 이름과 총 구매액)
| customer_name | total_purchase |
|---------------|----------------|
| A | 5000 |
| B | 7000 |
| C | 6000 |
해당 테이블에서 ‘A’ 고객보다 더 많은 금액을 구매한 고객은 ‘B’와 ‘C’가 됩니다.
- 제품 테이블 예시 (제품 이름, 판매량, 카테고리)
| product_name | sales | category |
|--------------|-------|-------------|
| Laptop | 1000 | Electronics |
| Smartphone | 1500 | Electronics |
| Tablet | 1200 | Electronics |
해당 테이블에서 ‘Electronics’ 카테고리 내에서 가장 높은 판매량을 가진 제품은 ‘Smartphone’입니다.
이렇게 테이블 예시를 통해 10번 문제의 SQL 코드가 어떤 데이터를 처리하고 있는지 시각적으로 이해할 수 있습니다.
추가적으로 필요한 사항이 있으면 알려주세요!