ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2월 4주차-2/26(1)]SQL JOIN과 서브쿼리 정리
    Why Not SW CAMP 5기/수업 기록 2025. 2. 26. 17:09

    데이터베이스에서 데이터를 효율적으로 조회하고 조작하기 위해 JOIN, 서브쿼리, CTE 등의 개념을 이해하는 것이 중요합니다. 이번 글에서는 JOIN과 서브쿼리, 그리고 CTE(Common Table Expression)에 대해 정리해보겠습니다.


    🔹 JOIN

    JOIN은 여러 개의 테이블을 조합하여 데이터를 조회하는 데 사용됩니다.

    ✅ INNER JOIN (교집합 개념)

    두 개 이상의 테이블에서 공통된 값이 있는 행만 반환합니다.

    SELECT
        a.customer_id, a.first_name, a.last_name,
        b.address_id, b.address, b.district, b.postal_code,
        c.city_id, c.city
    FROM customer AS a
        INNER JOIN address AS b ON a.address_id = b.address_id
        INNER JOIN city AS c ON b.city_id = c.city_id
    WHERE a.first_name = 'ROSA';
    

    ✅ OUTER JOIN (부분집합 개념)

    OUTER JOIN은 한쪽 테이블에만 존재하는 값도 포함하여 반환합니다.

    • LEFT OUTER JOIN: 왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 데이터를 가져옵니다.
    • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 데이터를 가져옵니다.
    • FULL OUTER JOIN: 두 테이블에서 모든 데이터를 포함하여 반환합니다. 하지만 MySQL은 FULL OUTER JOIN을 지원하지 않으므로 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 UNION으로 결합해야 합니다.
    SELECT * FROM tableA
    LEFT JOIN tableB ON tableA.id = tableB.id
    UNION
    SELECT * FROM tableA
    RIGHT JOIN tableB ON tableA.id = tableB.id;
    

    ✅ CROSS JOIN (카테시안 곱)

    두 테이블의 모든 조합을 반환합니다. 거의 사용하지 않습니다.

    SELECT * FROM tableA
    CROSS JOIN tableB;
    

    🔹 서브쿼리 (Subquery)

    서브쿼리는 SELECT, FROM, WHERE 절에서 사용되는 쿼리 내부의 쿼리입니다.

    /* 
    SELECT 
        (subquery) -> 반드시 단일 행
    FROM 
        (subquery) -> 단일/다중 가능. IN, ANY, ALL, EXISTS 이용해야 함
    WHERE 
        (subquery) -> 단일/다중 가능. IN, ANY, ALL, EXISTS 이용해야 함
    */
    
    SELECT *
    FROM customer
    WHERE customer_id IN (
        SELECT customer_id FROM customer WHERE first_name IN ('ROSA', 'ANA')
    );
    

    ✅ 서브쿼리의 종류

    1. 인라인 뷰 (Inline View): FROM 절에서 사용하는 서브쿼리
    2. 스칼라 서브쿼리 (Scalar Subquery): SELECT 절에서 사용하는 서브쿼리

    🔹 EXISTS vs IN vs ANY vs ALL 차이점

    IN 서브쿼리 결과 중 하나라도 일치하면 참
    ANY 서브쿼리 결과 중 하나라도 조건을 만족하면 참. 비교 연산 가능 (= ANY(...)는 IN과 동일)
    ALL 서브쿼리의 모든 결과에 대해 조건을 만족해야 참 (> ALL(...)은 최솟값보다 크다는 의미)
    EXISTS 서브쿼리가 값 하나라도 반환하면 참 (존재 여부만 확인)

     


    🔹 CTE (Common Table Expression)

    CTE는 서브쿼리를 더 가독성 높게 사용할 수 있도록 도와줍니다.

    WITH cte_customer (customer_id, first_name, email) AS (
        SELECT customer_id, first_name, email FROM customer WHERE customer_id >= 10
    )
    SELECT * FROM cte_customer;
    

    CTE 활용하면 가독성이 향상되고, 여러 번 사용되는 서브쿼리를 최적화 가능


    🔹 UNION, INTERSECT, EXCEPT (집합 연산)

    UNION, INTERSECT, EXCEPT을 활용해 테이블을 결합할 수 있습니다. 단, 중복값이 제거된 결과가 반환됩니다.

    SELECT column_name FROM tableA
    UNION
    SELECT column_name FROM tableB;
    
    • UNION: 두 쿼리의 합집합
    • INTERSECT: 두 쿼리의 교집합
    • EXCEPT: 첫 번째 쿼리에서 두 번째 쿼리를 제외한 차집합

    🔹 마무리

    이번 글에서는 SQL에서 가장 중요한 개념 중 하나인 JOIN, 서브쿼리, CTE, 그리고 집합 연산에 대해 정리해보았습니다.

    ✅ JOIN은 테이블을 결합하는 가장 일반적인 방법이며, INNER JOIN과 OUTER JOIN을 구분해서 사용할 것!

    ✅ 서브쿼리는 특정 조건을 만족하는 데이터를 조회할 때 유용하지만, EXISTS vs IN vs ANY vs ALL의 차이를 이해하고 사용해야 함

    ✅ CTE를 활용하면 서브쿼리보다 가독성이 좋아지고, 재사용성이 증가

    ✅ UNION, INTERSECT, EXCEPT은 테이블을 결합하는 유용한 연산자지만, 중복 제거 특성을 고려할 것!

     

Designed by Tistory.