본문 바로가기
개발/Database

조인 : JOIN (INNER, OUTER, CROSS, SELF)

by BellOne4222 2024. 2. 5.

JOIN

  • 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
  • 기본키와 외래키 관계로 맺어져야하고, 일대다 관계를 형성해야한다.

 

  • song 테이블

 

  • girl_group 테이블

 

INNER JOIN(내부 조인)

  • 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
SELECT <열 목록>
FROM <첫 번째 테이블>
    INNER JOIN <두 번째 테이블>
    ON <조인 조건>
[WHERE 검색 조건]

#INNER JOIN을 JOIN이라고만 써도 INNER JOIN으로 인식합니다.

 

SELECT gg._id, gg.name, s.title FROM girl_group AS gg 
JOIN song AS s ON s._id = gg.hit_song_id; # ON은 WHERE을 대신 사용해도 된다.
  • girl_group 테이블에 없는 데이터는 나오지 않는다.

 

  • INNER JOIN 대신 JOIN을 사용해도 된다.
  • ON 대신 WHERE도 사용가능하다.
  • ON 뒤에는 두 테이블이 결합하는 조건문

 

OUTER JOIN(외부 조인)

  • 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
  • LEFT OUTER JOIN
    • 왼쪽 테이블의 모든 값이 출력되는 조인
  • RIGHT OUTER JOIN
    • 오른쪽 테이블의 모든 값이 출력되는 조인
  • FULL OUTER JOIN
    • 왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 조인
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
    <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
     ON <조인 조건>
[WHERE 검색 조건]

 

 

SELECT s._id, s.title, gg.name FROM girl_group AS gg
RIGHT OUTER JOIN song AS s ON s._id = gg.hit_song_id;
  • 일치 하지 않는 값을 가지고 있더라도 song 테이블 기준으로 합치는 조인을 사용하여 표시 할 수 있다.

 

SELECT gg._id, gg.name, s.title
FROM girl_group AS gg
LEFT JOIN song AS s
ON s._id = gg.hit_song_id;
  • LEFT OUTER 대신 LEFT나 RIGHT만 입력해도 같은 기능을 수행한다.
  • A LEFT JOIN B = B RIGHT JOIN A

  • 같지 않음을 표현하는 연산자
    • !=
    • ^=
    • <>
    • NOT 컬럼명 =
  • ~보다 크지 않다. 
    • NOT 컬럼명 >
SELECT s._id, s.title, gg.name FROM girl_group AS gg
JOIN song AS s ON s._id <> gg.hit_song_id;
  • song테이블의 _id 와 girl_group테이블의 hit_song_id가 다른 경우를 모두 출력
  • 각 걸그룹의 히트곡인 경우를 제외하고 모든 경우의 수 출

 

CROSS JOIN(상호 조인)

  • 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능
  • 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수
  • 카티션 곱(CARTESIAN PRODUCT)라고도 한다.
SELECT *
FROM <첫 번째 테이블>
    CROSS JOIN <두 번째 테이블>
SELECT s._id, s.title, gg.name
FROM girl_group AS gg
CROSS JOIN song AS s;

SELECT s._id, s.title, gg.name
FROM girl_group AS gg, song AS s;

 

  • 두 쿼리 모두 같은 결과가 만들어 진다.

 

SELF JOIN(자체 조인)

  • 자기 자신과 조인
  • 1개의 테이블만 사용
SELECT <열 목록>
FROM <테이블> 별칭A
    INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]

 

chicken_gate 테이블

 

  • boss _id를 통해서 boss의 name을 나타내는 테이블
SELECT c.name AS child, p.name AS parent FROM chicken_gate AS p
JOIN chicken_gate AS c ON p._id = c.boss;