스칼라 서브쿼리란? SQL에서의 활용과 주의점
SQL에서 서브쿼리는 하나의 쿼리 내에 포함된 또 다른 쿼리를 의미합니다. 그중에서도 스칼라 서브쿼리(Scalar Subquery)는 단일 값(스칼라 값)을 반환하는 서브쿼리입니다. 이 값은 숫자, 문자열, 날짜 등 어떤 데이터 유형이든 될 수 있으며, 주로 SELECT 절이나 WHERE, HAVING 절에서 사용됩니다. 이번 글에서는 스칼라 서브쿼리의 개념, 활용 사례, 장단점, 그리고 주의점에 대해 알아보겠습니다.
스칼라 서브쿼리란?
스칼라 서브쿼리는 SQL 실행 중 하나의 값을 반환하는 서브쿼리입니다. 보통 다음과 같은 특징을 가집니다:
단일 값 반환
스칼라 서브쿼리는 반드시 단일 값(1개의 행, 1개의 열)을 반환해야 합니다. 만약 다중 행이 반환되면 실행 시 오류가 발생합니다.
사용 위치
스칼라 서브쿼리는 SELECT, WHERE, HAVING, ORDER BY 등 다양한 절에서 사용할 수 있습니다.
상황에 따라 계산
쿼리가 실행될 때마다 해당 값이 동적으로 계산됩니다.
스칼라 서브쿼리의 기본 구조
스칼라 서브쿼리는 보통 소괄호 () 안에 작성됩니다. 다음은 일반적인 문법입니다:
SELECT
column1,
(SELECT column2 FROM table2 WHERE condition) AS scalar_value
FROM
table1
WHERE
column3 = (SELECT column4 FROM table3 WHERE condition);
위 문법에서 스칼라 서브쿼리는 SELECT와 WHERE 절에서 각각 사용됩니다.
스칼라 서브쿼리의 활용 사례
SELECT 절에서 값 계산
스칼라 서브쿼리는 SELECT 절에서 동적으로 값을 계산하거나 보조 데이터를 가져오는 데 사용됩니다.
예제:
SELECT
employee_id,
name,
(SELECT department_name
FROM departments
WHERE departments.department_id = employees.department_id) AS department
FROM
employees;
• 여기서 department_name은 각 employee의 부서 이름을 반환합니다.
• 각 행에 대해 서브쿼리가 한 번씩 실행됩니다.
WHERE 절에서 조건으로 활용
스칼라 서브쿼리는 WHERE 절에서 동적으로 조건을 평가하는 데 유용합니다.
예제:
SELECT
product_id,
product_name
FROM
products
WHERE
price > (SELECT AVG(price) FROM products);
• AVG(price) 서브쿼리는 제품의 평균 가격을 계산합니다.
• 서브쿼리 결과를 기준으로 조건(price > 평균 가격)이 평가됩니다.
3.3. HAVING 절에서 집계 조건으로 활용
스칼라 서브쿼리는 그룹화된 데이터를 필터링할 때도 유용합니다.
예제:
SELECT
department_id,
COUNT(*) AS employee_count
FROM
employees
GROUP BY
department_id
HAVING
COUNT(*) > (SELECT AVG(employee_count) FROM (SELECT department_id, COUNT(*) AS employee_count FROM employees GROUP BY department_id) t);
• 서브쿼리가 각 부서의 평균 직원 수를 계산합니다.
• HAVING 절에서 이 값을 사용해 특정 조건을 만족하는 그룹만 필터링합니다.
스칼라 서브쿼리의 장점
유연성
다양한 조건을 동적으로 계산할 수 있어 복잡한 쿼리를 간결하게 작성할 수 있습니다.
데이터 추출 용이성
다른 테이블에서 특정 값을 실시간으로 가져와 활용할 수 있습니다.
재사용성
반복적으로 사용되는 조건을 별도로 작성하지 않고 서브쿼리로 처리할 수 있습니다.
스칼라 서브쿼리의 주의점과 단점
성능 문제
스칼라 서브쿼리는 각 행마다 서브쿼리가 실행될 수 있어 성능에 영향을 줄 수 있습니다. 특히, 데이터 양이 많거나 복잡한 조건이 포함되면 성능 저하가 심각해질 수 있습니다.
대안:
서브쿼리를 JOIN으로 변환하거나, 공통 테이블 표현식(CTE)을 사용하는 것이 더 효율적일 수 있습니다.
단일 값 반환 제한
서브쿼리가 여러 값을 반환하면 오류가 발생합니다. 따라서 서브쿼리에서 LIMIT 1을 사용하거나 적절히 조건을 추가해 단일 값을 보장해야 합니다.
예제 (오류 방지):
SELECT
product_id,
(SELECT price FROM products WHERE category_id = 1 LIMIT 1) AS single_price
FROM
orders;
가독성 저하
스칼라 서브쿼리가 많아지면 쿼리가 복잡해지고 이해하기 어려워질 수 있습니다. 이를 해결하기 위해 SQL 코멘트나 임시 테이블을 활용하세요.
스칼라 서브쿼리와 JOIN 비교
스칼라 서브쿼리로 작성된 쿼리는 JOIN으로 대체할 수 있는 경우가 많습니다. JOIN은 대량의 데이터를 처리할 때 더 효율적일 수 있습니다.
스칼라 서브쿼리:
SELECT
e.employee_id,
e.name,
(SELECT d.department_name
FROM departments d
WHERE d.department_id = e.department_id) AS department
FROM
employees e;
JOIN으로 변환:
SELECT
e.employee_id,
e.name,
d.department_name
FROM
employees e
JOIN
departments d
ON
e.department_id = d.department_id;
• JOIN을 사용하면 서브쿼리 대신 테이블을 결합하여 한 번에 데이터를 가져옵니다.
• 대량의 데이터가 있는 경우 JOIN이 더 성능이 뛰어납니다.
결론
스칼라 서브쿼리는 단일 값을 반환하는 강력한 SQL 도구로, 특정 조건이나 동적 계산이 필요한 시나리오에서 유용하게 활용됩니다. 하지만 성능 이슈와 단일 값 반환 제한 같은 단점도 있기 때문에 적절한 상황에서 사용하는 것이 중요합니다.
• 언제 사용할까?
데이터가 적고 동적으로 계산된 값을 행별로 사용해야 할 때.
• 언제 피할까?
데이터 양이 많아 성능 문제가 우려되거나 JOIN으로 쉽게 대체할 수 있을 때.
스칼라 서브쿼리는 이해하고 잘 활용하면 SQL 쿼리의 유연성과 가독성을 높이는 데 큰 도움이 될 수 있습니다.