본문 바로가기
IT/SQL

[MySQL] Join (LEFT, RIGHT, INNER) / UNION

by marketinkerbell 2022. 2. 1.
반응형

 

 

LEFT OUTER JOIN (= LEFT JOIN)

 

왼쪽 테이블 기준으로 오른쪽 테이블을 합침

SELECT
    i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM item AS i LEFT OUTER JOIN stock AS s  #테이블에 alias 붙여줌
ON i.id = s.item_id  #테이블 조인 조건

조인할 때는 SQL 문이 길어지기 때문에 테이블 이름에 alias를 붙여주는 게 좋다.

 

 

 

 

 

RIGHT OUTER JOIN (= RIGHT JOIN)

 

오른쪽 테이블 기준으로 왼쪽 테이블을 합침

SELECT
    i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM item AS i RIGHT OUTER JOIN stock AS s  #테이블에 alias 붙여줌
ON i.id = s.item_id  #테이블 조인 조건

 

 

 

 

 

INNER JOIN 

 

기준이 되는 테이블이 따로 없음

집합으로 치면 두 테이블의 교집합을 구하는 것과 같음

두 테이블 모두 기준 컬럼에 (ON) 값이 있는 row가 합쳐짐 

그래서 LEFT, RIGHT 조인 처럼 NULL 값이 있지는 않음

 

SELECT
    i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM item AS i INNER JOIN stock AS s 
ON i.id = s.item_id  #테이블 조인 조건

 

 

 

 

 Join(조인)의 조건을 설정할 때 ON 절을 사용하는데
만약 조인 조건으로 쓰인 두 컬럼의 이름이 같으면 ON 대신 USING을 쓰는 경우도 있다.

 

 

아래 두 쿼리문은 결과가 같다.

ON 

 

USING

 

조인 조건으로 사용되는 컬럼들의 이름이 같으면 그냥 USING이라고 쓰고 그 안에 컬럼 이름을 쓰는 것도 가능하다.

 

 

 

 

 

UNION,  UNION ALL

 

두 테이블의 합집합을 구해주는 집합 연산자 UNION

일반적으로는 같은 종류의 두 테이블의 합집합을 구하기 위해 사용하지만,

서로 다른 종류의 테이블도, 조회하는 컬럼을 일치시키면 집합 연산이 가능하다.

(총 컬럼의 수와, 각 컬럼의 데이터 타입만 일치하면 UNION 연산이 가능)

 

 

 

예시 > 

두 테이블의 공통 컬럼들인 id, nation, count로 바꿔주고 UNION 실행

 

 

UNION은 두 테이블이 공통적으로 갖고 있는 원소들, 즉 두 테이블의 교집합에 해당하는 영역의 row들은 중복을 제거하고, 그냥 딱 하나의 row만 보여준다.

 

 

UNION ALL은 UNION처럼 두 테이블의 합집합을 보여준다는 점은 같다.

하지만 겹치는 것을 중복 제거하지 않고, 겹치는 것들도 모두 다 보여준다.

 

 

예시 >

 

 

 

서로 다른 3개의 테이블 조인하기

 

조인은 2개, 3개의 테이블 뿐아니라 더 많은 수의 테이블도 조인할 수 있다. 

 

예시 >

 

위 첫번째 노란 박스가 먼저 조인되고, 조인된 결과 테이블이 아래 노란 박스의 member 테이블과 조인 되는 것이다.

= item 테이블과 review 테이블이 조인되고, 그렇게 만들어진 결과 테이블이 member 테이블과 조인 되는 것이다.

 

 

 

예시 >

여성 회원들이 좋은 평점을 준 상품들 정렬해서 보기 (리뷰수는 2개이상인 상품들)

SELECT i.id, i.name, AVG(star), COUNT(*)
FROM
    item AS i LEFT OUTER JOIN review AS r   #item 테이블과 review 테이블 조인
        ON r.item_id = i.id
    LEFT OUTER JOIN member AS m    # 위 결과 테이블과 member 테이블 조인
        ON r.mem_id = m.id
WHERE m.gender = 'f'
GROUP BY i.id, i.name
HAVING COUNT(*) > 1
ORDER BY 
    AVG(star) DESC,
    COUNT(*) DESC;

 

 

출력 결과>

 

 

 

 

 

댓글