RDBMS

스칼라 서브쿼리란? SQL에서의 활용과 주의점

ghyeong 2024. 11. 25. 00:16
반응형

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 쿼리의 유연성과 가독성을 높이는 데 큰 도움이 될 수 있습니다.

반응형