≣ 목차
기본적인 SQL 구문에 익숙해졌다면, 이제 더욱 강력하고 효율적인 쿼리를 작성할 시간입니다!
이 글에서는 데이터를 자유자재로 다룰 수 있도록 도와주는 서브쿼리, CASE WHEN, JOIN, WITH 구문에 대해 알아보겠습니다.
SQL 기본 이해를 위해 이전 내용을확인하면 도움이 됩니다. 👇
서브쿼리 사용하기
서브쿼리는 쿼리 안에 또 다른 쿼리를 포함하여 데이터를 처리할 수 있는 방법입니다. 서브쿼리는 주로 WHERE, FROM, SELECT 구문과 함께 사용됩니다.
주의사항 : 서브쿼리를 과도하게 사용하면 쿼리 성능이 저하될 수 있습니다. JOIN을 활용하거나 인덱스를 생성하여 성능을 최적화할 수 있습니다.
단일행 서브쿼리
/*
급여가 5000 이상인 직원의 이름과 부서 정보를 조회합니다. (단일행 서브쿼리)
*/
SELECT
employee_name, -- 직원 이름
department_id -- 부서 ID
FROM
employees
WHERE
salary > ( SELECT
AVG(salary)
FROM
employees
)
다중행 서브쿼리
/*
'개발팀'에 속한 직원의 이름과 급여를 조회합니다. (다중행 서브쿼리)
*/
SELECT
employee_name,
salary
FROM
employees
WHERE
department_id IN ( SELECT
department_id
FROM
departments
WHERE
department_name = '개발팀'
)
상관 서브쿼리
/*
각 직원의 급여와 해당 부서의 평균 급여를 비교합니다. (상관 서브쿼리)
*/
SELECT
employee_name,
salary,
( SELECT
AVG(salary)
FROM
employees
WHERE
department_id = e.department_id
) AS avg_salary
FROM
employees e;
CASE WHEN 사용하기
마치 엑셀의 IF 함수처럼, CASE WHEN 구문을 사용하면 조건에 따라 다른 결과를 출력할 수 있습니다.
데이터를 특정 기준에 따라 분류하거나, 조건에 맞는 값을 계산할 때 유용합니다.
/*
급여 상태를 '우수', '보통', '개선 필요'로 분류하여 조회합니다.
*/
SELECT
employee_name, -- 직원 이름
salary, -- 급여
CASE WHEN
salary > 5000 THEN '우수' WHEN
salary BETWEEN 3000 AND 5000 THEN '보통'
ELSE '개선 필요' END AS salary_status -- 급여 상태를 분류합니다.
FROM
employees
JOIN 사용하기
JOIN은 여러 테이블에 흩어져 있는 정보를 하나로 합쳐줍니다.
테이블 간의 관계를 정의하고, 공통된 컬럼을 기준으로 데이터를 연결하여 원하는 정보를 효율적으로 조회할 수 있습니다.
JOIN 종류
- INNER JOIN : 두 테이블에서 공통된 값을 가진 행만 반환합니다.
- LEFT JOIN : 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.
- RIGHT JOIN : 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.
- FULL OUTER JOIN : 두 테이블의 모든 행을 반환합니다. 일치하는 행이 없으면 NULL 값을 반환합니다.
/*
직원과 부서 정보를 결합하여 조회합니다.
*/
SELECT
employees.employee_name, -- 직원 이름
departments.department_name -- 부서 이름
FROM
employees INNER JOIN departments ON employees.department_id = departments.department_id
WITH 구문 사용하기
WITH 구문은 복잡한 쿼리를 단순화하고 가독성을 높여줍니다.
마치 긴 글을 여러 단락으로 나누어 쓰는 것처럼, 쿼리를 여러 개의 CTE(Common Table Expression)로 나누어 작성할 수 있습니다.
장점
- 가독성 향상 : 쿼리가 간결하고 명확해집니다.
- 재사용성 증가 : CTE를 여러 번 재사용할 수 있습니다.
- 성능 향상 : 쿼리 최적화에 도움이 될 수 있습니다.
/*
상위 3명의 급여가 높은 직원을 WITH 구문을 사용하여 조회합니다.
*/
WITH TopSalaries AS ( SELECT
employee_name, -- 직원 이름
salary -- 급여
FROM
employees
ORDER BY
salary DESC -- 급여 내림차순 정렬
LIMIT 3
)
SELECT
*
FROM
TopSalaries
실용적인 예시
다음은 서브쿼리, CASE WHEN, JOIN, WITH 구문을 종합적으로 사용하는 예시입니다.
예를 들어, 매출이 가장 높은 상위 5개 제품을 매출 합계와 함께 조회하는 복잡한 쿼리를 작성할 수 있습니다.
/*
각 제품의 총 매출을 계산하고, 매출이 가장 높은 5개 제품을 조회합니다.
*/
WITH ProductSales AS ( SELECT
product_id, -- 제품 ID
SUM(sale_amount) AS total_sales -- 총 매출
FROM
sales
GROUP BY
product_id -- 제품별 매출 합계
)
SELECT
ps.product_id, -- 제품 ID
ps.total_sales, -- 매출 합계
CASE WHEN
ps.total_sales > 10000 THEN '우수' WHEN
ps.total_sales BETWEEN 5000 AND 10000 THEN '보통'
ELSE
'개선 필요' END AS performance_status -- 매출 성과 상태
FROM
ProductSales ps
ORDER BY
ps.total_sales DESC
LIMIT 5; -- 매출 상위 5개 제품
👇 자세한 SQL 튜토리얼을 지금 바로 확인하세요 😉
'n8n 이야기' 카테고리의 다른 글
n8n 자동화를 위한 SQL 기본 이해하기 (2) | 2024.12.15 |
---|---|
API란 무엇일까요? 자판기로 쉽게 이해하기 (3) | 2024.12.09 |
n8n 날짜 표현식 마스터하기 : 고급편 (9) | 2024.10.27 |
n8n 날짜 표현식 마스터하기 : 기본편 (20) | 2024.10.25 |
n8n 표현식 완벽 정복 : 기본 사용 설명 (12) | 2024.10.15 |