ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [About _ MySQL _ join]
    About_Datascience/SQL 2023. 2. 1. 18:49

    JOIN은 여러 개의 테이블을 특정 컬럼을 기준으로 결합해서 데이터를 출력하는 방법이다. 

    Pandas 의 merge 와 같은 기능을 한다고 생각하면 좋을 것 같다. 

     

    JOIN에는 종류에 따라 inner join , left join , right join , outer join이 있다. 

    여기서 outer join이라는 명령어는 MySQL에 따로 없고 UNION이라는 명령어를 이용하여 구현할 수 있다.

     

    벤다이어 그램을 생각해보면 

    inner join 은 말 그대로 교집합 부분이고 , left join교집합을 포함한 벤다이어그램의 왼쪽 부분 , 

    right join은 그 반대인 교집합 포함 오른쪽 벤다이어그램 부분 , outer join합집합 개념으로 생각하면 된다.

    즉 , 모두 출력을 하는 것이다. 

    이렇게 join을 할 때 , 빈 값은 null 값으로 출력된다.

     

    <기본적인 사용법>

    SELECT 출력하고자 하는 column1 , column2 ...
    FROM 결합할 table이름1
    (LEFT,RIGHT) JOIN 결합할 table이름2
    ON (겹치는, 묶어줄) 컬럼1 = (겹치는, 묶어줄) 컬럼2

     


    설명을 위해 임의로 두 개의 테이블(user , addr)을 만들었다 . 

    user 테이블
    addr 테이블

     

    1. INNER JOIN

    SELECT user.ui , user.name, addr.an
    FROM user
    INNER JOIN addr # INNER 생략 가능!
    ON user.ui = addr.ui; # ui 가 겹치는 컬럼이기 때문에 ui를 기준으로 join

    inner join 결과

     

     

    2. LEFT JOIN / RIGHT JOIN

    # left join
    SELECT user.ui , user.name, addr.an
    FROM user
    LEFT JOIN addr 
    ON user.ui = addr.ui;

    left join 결과

     

     

    # right join
    SELECT addr.ui , user.name, addr.an # user.ui 에 4,5번이 없다. 따라서 addr.ui를 가져와야함.
    FROM user
    RIGHT JOIN addr 
    ON user.ui = addr.ui;

    right join 결과

     

     

    3. OUTER JOIN (UNION)

    OUTER JOIN 은 SELECT 문을 실행한 결과를 합쳐서 출력하는 방법으로 구현한다. 

    여기서 UNION 의 중복제거 특성을 이용하면 OUTER JOIN 을 구현할 수 있게 된다.

     

    #outer join 구현 
    SELECT user.ui , user.name, addr.an
    FROM user
    LEFT JOIN addr 
    ON user.ui = addr.ui
    UNION
    SELECT addr.ui , user.name, addr.an
    FROM user
    RIGHT JOIN addr 
    ON user.ui = addr.ui;

    outer join 결과

     

     

    예시 (sakila dataset)

    #sakila dataset
    # payment_id , staff_id(로 JOIN) , staff_fullname(CONCAT 이용), amount , payment_date(DATE_FORMAT 이용)
    
    SELECT payment.payment_id ,
    	payment.staff_id,
    	CONCAT(staff.first_name ,' ', staff.last_name) AS staff_fullname,
        payment.amount,
        DATE_FORMAT(payment.payment_date ,'%Y-%m') AS 'year_month'
    FROM payment
    JOIN staff
    ON payment.staff_id = staff.staff_id;

    예시 결과

     

    'About_Datascience > SQL' 카테고리의 다른 글

    [About _ MySQL _ INDEX]  (0) 2023.02.03
    [About _ MySQL _ Sub Query]  (0) 2023.02.02
    [About_MySQL _ group by 와 having]  (0) 2023.02.01
    [About_MySQL _ 함수 , 조건절]  (0) 2023.01.31
    [About_MySQL 기본문법(2)_DML의 CRUD]  (0) 2023.01.31
Designed by Tistory.