SQL

SQL 테이블 열연결(JOIN)

봄다온 2025. 2. 5. 13:48

서로 다른 테이블을 가로 방향으로 합쳐보자.

JOIN

select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicy
from rating, ramen
where ramen.id = rating.item_id and rating.item_type = 'ramen';

위 쿼리는 아래와 같이 사용가능하다

select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicy
from ( 
    rating join ramen 
    on ramen.id = rating.item_id and rating.item_type = 'ramen'
);

두 쿼리문의 성능차이는 전혀 없다. JOIN 사용이 가독성이 더 좋기때문에 테이블 열결합시 더 자주 사용한다.

JOIN의 종류

내부JOIN은 두 테이블값이 서로 연결되는 부분만 결과로 출력,
외부JOIN은 서로 연결되지 않고 한쪽만 데이터가 있는 행도 출력

명령어 축약형 내부/외부 구분
INNER JOIN JOIN 내부
LEFT OUTER JOIN LEFT JOIN 외부
RIGHT OUTER JOIN RIGHT JOIN 외부
FULL OUTER JOIN FULL JOIN 외부
# JOIN
두 테이블값이 서로 연결되는 부분만 결과로 출력
select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicy
from ( 
    rating join ramen 
    on ramen.id = rating.item_id and rating.item_type = 'ramen'
);
 user_id | rating |    name    | quantity | is_spicy
---------+--------+------------+----------+----------
       2 |      1 | 고추짜장면 |       15 | f
       9 |      3 | 겨울이라면 |       50 | t
       6 |      4 | 겨울이라면 |       50 | t
       2 |      4 | 진라멘     |        2 | f
       8 |      3 | 고추짜장면 |       15 | f
                    (이하생략)
(11 rows)

# LEFT JOIN
앞 테이블 기준으로 뒤 테이블과 연결되는 정보만 출력, 만약 없다면 NULL 값으로 출력
select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicy
from (
    rating left join ramen
    on ramen.id = rating.item_id and rating.item_type = 'ramen'
);
 user_id | rating |    name    | quantity | is_spicy
---------+--------+------------+----------+----------
       2 |      1 | 고추짜장면 |       15 | f
      10 |      4 |            |          |
       9 |      3 | 겨울이라면 |       50 | t
       5 |      3 |            |          |
       2 |      4 | 진라멘     |        2 | f
       8 |      4 |            |          |
       8 |      3 | 고추짜장면 |       15 | f
       4 |      1 |            |          |
      10 |      2 |            |          |
                    (이하생략)
(20 rows)

# RIGHT JOIN
뒤 테이블 기준으로 앞 테이블과 연결되는 정보만 출력, 만약 없다면 NULL 값으로 출력
select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicy
from (
    rating right join ramen
    on ramen.id = rating.item_id and rating.item_type = 'ramen'
);
 user_id | rating |    name    | quantity | is_spicy
---------+--------+------------+----------+----------
       8 |      3 | 고추짜장면 |       15 | f
       2 |      1 | 고추짜장면 |       15 | f
         |        | 리얼짬뽕   |       47 | t
       4 |      1 | 추풍라면   |       18 | f
                    (이하생략)
(12 rows)

# FULL JOIN
서로 연결하여 출력, 서로 연결되지 않은 행은 NULL 값으로 출력
select rating.user_id, rating.rating, ramen.name, ramen.quantity, ramen.is_spicy
from (
    rating full join ramen
    on ramen.id = rating.item_id and rating.item_type = 'ramen'
);
 user_id | rating |    name    | quantity | is_spicy
---------+--------+------------+----------+----------
       2 |      1 | 고추짜장면 |       15 | f
      10 |      4 |            |          |
       9 |      3 | 겨울이라면 |       50 | t
       5 |      3 |            |          |
         |        | 리얼짬뽕   |       47 | t
                     (이하생략)
(21 rows)

JOIN문이 사용되는 위치

FROM 다음에 사용한다.
2개의 join을 사용할경우 구조 파악을 위해, 괄호를 적으면 파악이 쉽다.

select rating.user_id, rating.rating, 
    ramen.name, ramen.quantity, ramen.is_spicy
from (
    (
        rating full join ramen
        on ramen.id = rating.item_id and rating.item_type = 'ramen'
    )  join users
    on users.id = rating.user_id
)
where rating >= 3;

ON, USING

테이블 join 테이블 on 연결할 조건
테이블 join 테이블 using (두 테이블을 연결할 공통된 컬럼 목록)

using의 경우 두 테이블을 연결하는 컬럼의 이름이 같아야함

# on
select drink_rating.user_id, drink_rating.rating,
    drink.name, drink.quantity, drink.volume
from (
    (
        select rating.item_id as id, rating.rating, rating.user_id
        from rating
        where rating.item_type = 'drink'
    ) drink_rating
    join drink
    on drink.id = drink_rating.id
);
 user_id | rating |     name     | quantity | volume
---------+--------+--------------+----------+--------
       7 |      1 | 에너지드링크 |       36 |    300
       5 |      3 | 더맛         |        3 |   1000
      10 |      4 | 더맛         |        3 |   1000
(3 rows)

# using
select drink_rating.user_id, drink_rating.rating,
drink.name, drink.quantity, drink.volume
from (
(
    select rating.item_id as id, rating.rating, rating.user_id
        from rating
        where rating.item_type = 'drink'
) drink_rating
    join drink
    using (id)
);
 user_id | rating |     name     | quantity | volume
---------+--------+--------------+----------+--------
       7 |      1 | 에너지드링크 |       36 |    300
       5 |      3 | 더맛         |        3 |   1000
      10 |      4 | 더맛         |        3 |   1000
(3 rows)

'SQL' 카테고리의 다른 글

SQL 6장 실습문제  (0) 2025.02.05
SQL 테이블 열연결 응용  (0) 2025.02.05
SQL 테이블 열연결(FROM, WHERE)  (0) 2025.02.05
SQL 테이블 행연결 응용  (0) 2025.02.05
SQL 테이블 행연결(EXCEPT, EXCEPT ALL)  (0) 2025.02.05