본문 바로가기
Database/MySQL

JOIN (INNER, LEFT, RIGHT, FULL)

by 컴돈AI 2024. 3. 12.

목차

    JOIN

    JOIN 소개

    • program, teacher 예시
      • 강사 id에 대한 정보가 teacher table에 저장되어 있습니다.
    • 아래처럼 프로그램, 가격, 강사 출신대학 4개의 컬럼 한번에 출력하려면 어떻게 해야할까요?
      • 단순히 SELECT 문을 사용하면 아래와 같이 전체 조합이 출력됩니다. ( 5 x 3 )
        • SELECT * FROM program, teacher
      • program의 강사id 컬럼과 teacher id 컬럼이 같은 행만 출력하도록 필터링 작업을 진행해주어야합니다.
        • SELECT * FROM program, teacher WHERE program.강사id=teacher.id
      • 위 작업을 INNER JOIN 을 통해서 동일하게 구현 가능합니다.
        • SELECT * FROM program INNER JOIN teacher ON program.강사id=teacher.id

    INNER JOIN

    • INNER JOIN ~ ON ~ 은 두 테이블사이에서 공통점이 있는 행만 필터링하고 싶을 경우 사용합니다.
    • INNER JOIN 문법
      • 테이블 2개 합치가 
        • SELECT 출력할컬럼들
          FROM 테이블1 INNER JOIN 테이블2
          ON 조건문
      • 테이블 3개 합치기
        • SELECT *
          FROM 테이블1 
          INNER JOIN 테이블2 ON 조건1
          INNER JOIN 테이블3 ON 조건2

    CROSS JOIN

    • CROSS JOIN 문법
      • SELECT 출력할컬럼들 FROM 테이블1 CROSS JOIN 테이블2
    • CROSS JOIN은 테이블 2개 이상을 출력할 때 WHERE / ON 조건문을 넣지 않으면 기본적으로 CROSS JOIN이 됩니다.
      • 아래 예시에서 모든 행의 조합이 나오는 것 (5 x 3)

    LEFT / RIGHT / FULL OUTER JOIN

    • INNER / FULL / LEFT / RIGHT 비교
    • LEFT / RIGHT / FULL JOIN을 이해하기 위해 program 테이블과 teacher 테이블에 아래와 같은 데이터를 추가해줍니다.
      • program
      • teacher

    LEFT JOIN

    • 왼쪽 테이블 전체 + 공통된 행 출력하고 싶을 경우 LEFT JOIN을 사용합니다.
    • SELECT 출력할컬럼들
      FROM 테이블1 LEFT JOIN 테이블2
      ON 조건문
    • 예시
      • SELECT * FROM program 
        LEFT JOIN teacher
        ON program.강사id = teacher.id

    RIGHT JOIN

    • 오른쪽 테이블 전체 + 공통된 행 출력하고 싶을 경우 LEFT JOIN을 사용합니다.
    • SELECT 출력할컬럼들
      FROM 테이블1 RIGHT JOIN 테이블2
      ON 조건문
    • 예시
      • SELECT * FROM program 
        RIGHT JOIN teacher
        ON program.강사id = teacher.id

    FULL JOIN

    • LEFT JOIN과 RIGHT JOIN 결과를 합해서 출력하고 싶은 경우 FULL JOIN을 사용합니다.
    • SELECT 출력할컬럼들
      FROM 테이블1 FULL JOIN 테이블2
      ON 조건문
      • 하지만, MySQL, MariaDB, SQLite에서는 사용할수 없습니다. -> LEFT JOIN, RIGHT JOIN 결과를 UNION 연산자를 통해 묶어주면 됩니다.
        • SELECT 출력할컬럼들
          FROM 테이블1 LEFT JOIN 테이블2
          ON 조건문
          
          UNION
          
          SELECT 출력할컬럼들
          FROM 테이블1 RIGHT JOIN 테이블2
          ON 조건문;
    • 예시 
      • SELECT * FROM program 
        LEFT JOIN teacher
        ON program.강사id = teacher.id
        
        UNION
        
        SELECT * FROM program 
        RIGHT JOIN teacher
        ON program.강사id = teacher.id;

    예제

    • 예시 데이터
      • product
      • sales
      • user_table
    • sales 테이블을 아래와 같이 product 테이블에 있던 상품명, 가격도 같이 출력해보기.
      • SELECT sales.id,고객번호,구매날짜,상품명,가격 FROM sales INNER JOIN product ON sales.상품id=product.id
    • sales 테이블을 출력하는데 아래와 같이 상품명, 가격, 고객명도 함께 출력해보기
      • SELECT sales.id,고객번호,구매날짜,상품명,가격,고객명 
        FROM sales 
        INNER JOIN product ON sales.상품id=product.id 
        INNER JOIN user_table ON sales.고객번호=user_table.id;
      • INNER JOIN을 안쓰고 WHERE로도 작성이 가능합니다.
        • SELECT sales.id, 고객번호, 구매날짜, 상품명, 가격, 고객명 
          FROM sales, product, user_table
          WHERE sales.상품id = product.id AND sales.고객번호 = user_table.id;
    • 날짜별 매출 합계를 출력하기
      • SELECT 구매날짜, SUM(가격) AS 일별합계 
        FROM sales 
        INNER JOIN product ON sales.상품id=product.id 
        GROUP BY 구매날짜
    • 매출 내역에 없는 상품들을 출력해보기
      • SELECT 상품명 FROM sales 
        RIGHT JOIN product ON sales.상품id = product.id 
        WHERE 상품id IS NULL
    • 매출 내역에 없는 고객들을 출력해보기
      • SELECT 고객명 FROM sales 
        RIGHT JOIN user_table ON sales.고객번호=user_table.id 
        WHERE 상품id IS NULL

    출처

     

    'Database > MySQL' 카테고리의 다른 글

    SQL문 결과 테이블로 저장하기 / VIEW  (1) 2024.03.12
    UNION (SELECT 결과들 합치기)  (0) 2024.03.12
    IF / CASE  (0) 2024.03.02
    그룹지어 통계내기 (GROUP BY)  (0) 2024.03.02
    select 안에 select (서브쿼리)  (1) 2024.03.01