MySQL 총 정리8: 테이블 조인(JOIN)

데이터 분석/MySQL

MySQL 총 정리8: 테이블 조인(JOIN)

해리누나 2024. 10. 7. 21:35
반응형

 


[ 목차 ]
1. INNER JOIN
2. OUTER JOIN
•  LEFT OUTER JOIN
•  RIGHT OUTER JOIN
•  FULL OUTER JOIN

 

➯ SQL에서 JOIN은 두 개 이상의 테이블연결하거나 결합하여 하나의 결과 집합으로 만드는 방법이다.

➯ JOIN을 사용하면 여러 테이블에 나뉘어 있는 관련 데이터를 하나의 조합 결과로 모을 수 있다.

➯ 이로 인해 데이터 분석이 쉬워지며, 필요한 데이터만 조회하여 효율적인 질의를 수행할 수 있다.

➯ 다양한 JOIN 유형을 통해 원하는 방식으로의 데이터 결합이 가능하다.

1. INNER JOIN

  • 두 개 이상의 테이블에서 공통된 컬럼을 기준으로 데이터를 결합할 때 사용된다.
  • 결합(join) 기준이 되는 컬럼/키의 값이 두 테이블에 모두 존재하는 레코드만 반환된다.
    (매칭되지 않은 행은 결과에서 제외)
# 문법
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블
INNER JOIN 조인할_테이블
ON 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;
# 아래와 같이 작성해도 된다!
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블
JOIN 조인할_테이블
ON 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;

-- 또는
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블, 조인할_테이블
WHERE 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;

 

📚예시

출판사 아이디(publisher_id)라는 공통 컬럼을 가진 두 테이블, 도서 테이블과 출판사 테이블이다.

도서 테이블을 기준으로 출판사 테이블과 inner join을 한다면 결과가 어떻게 나올까?

 

 

  SELECT * FROM book_list

  INNER JOIN publisher

  ON book_list.publisher_id = publisher.publisher_id;

 

INNER JOIN은 기준 테이블(book_list)과 조인할 테이블(publisher)에 결합 기준 컬럼(publisher_id)에 해당하는 값이 모두 존재하는 경우에만 데이터가 조회된다. 도서 테이블의 3번째 행인 책 1984의 경우, 출판사 아이디인 8이 출판사 테이블에 존재하지 않아 조회되지 않는다.

 

SELECT * FROM으로 조인해서 데이터를 조회할 시, 위와 같이 두 테이블의 모든 컬럼에 대한 데이터가 반환되어 공통 컬럼이 두 번 반환되는데 중복 컬럼을 피하기 위해 필요한 컬럼만 SELECT해 주도록 하자.

 

  SELECT book_list.ISBN, book_list.book_name, book_list.writer, book_list.publisher_id, publisher.publisher_name

  FROM book_list

  INNER JOIN publisher

  ON book_list.publisher_id = publisher.publisher_id;

 

자, SELECT 절을 적으면서 느꼈을 것이다. 아 컬럼 이름 일일이 입력하기 정말 귀찮다... 😑적고 나서 코드를 보면 눈도 아프다... 그래서 약어가 필요한 것이다! 아마 많은 join 문들을 보며 이미 눈치챘겠지만 약어를 사용하도록 하자.

 

 

  SELECT b.ISBN, b.book_name, b.writer, b.publisher_id, p.publisher_name

  FROM book_list b

  INNER JOIN publisher p

  ON b.publisher_id = p.publisher_id;

 

약어로 쿼리가 훨씬 간결해지고 가독성도 향상되었다.

 

주의할 점

※ MySQL에서 테이블에 약어를 지정하는 것은 해당 테이블을 참조할 때 그 약어를 사용하겠다고 선언하는 것이다.

• 따라서 약어 지정 시, 해당 테이블을 참조할 때 반드시 약어를 사용해야만 한다!

 


2. OUTER JOIN

LEFT OUTER JOIN

  • 왼쪽 테이블을 기준으로 오른쪽 테이블이 더해지는 형태다.
  • 즉, 왼쪽 테이블 모든 행 데이터 반환되며, 오른쪽 테이블은 왼쪽 테이블과 결합 기준 컬럼값과 일치하는 행만 반환된다.
  • 일치하지 않는 값을 가진 행의 경우, 해당 부분이 NULL로 채워진다.
  • RIGHT보다는 LEFT OUTER JOIN이 주로 쓰인다.
# 문법
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블
LEFT OUTER JOIN 조인할_테이블  -- OUTER 빼고 적어도 된다.
ON 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;

 

📚예시

이번에도 이 두 테이블에  LEFT OUTER JOIN을 적용해보자.

 

 

  SELECT * FROM book_list b

  LEFT OUTER JOIN publisher p

  ON b.publisher_id = p.publisher_id;

 

책 '1984'의 경우, 왼쪽 테이블인 book_list 테이블의 데이터이므로, 오른쪽 테이블(publisher)에 관련된 출판사 정보가 없더라도 LEFT OUTER JOIN 결과에 포함된다. 그러나, '조지 오웰' 도서의 publisher_id와 일치하는 데이터가 publisher 테이블에 없기 때문에, publisher 테이블의 컬럼 값들은 NULL로 표시된다.

 

 

  SELECT b.ISBN, b.book_name, b.writer, b.publisher_id, p.publisher_name

  FROM book_list b

  LEFT JOIN publisher p

  ON b.publisher_id = p.publisher_id;

 

필요한 컬럼만 조회

 

RIGHT OUTER JOIN

  • 오른쪽 테이블을 기준으로 왼쪽 테이블이 더해지는 형태다.
  • 즉, 오른쪽 테이블모든 행 데이터반환되며, 왼쪽 테이블은 오른쪽 테이블과 결합 기준 컬럼값과 일치하는 행만 반환된다.
  • 일치하지 않는 값을 가진 행의 경우, 해당 부분이 NULL로 채워진다.
# 문법
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블
RIGHT OUTER JOIN 조인할_테이블  -- OUTER 빼고 적어도 된다.
ON 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;

 

📚예시

이번에는 이 두 테이블에  RIGHT OUTER JOIN을 적용해보자.

 

 

  SELECT * FROM book_list b

  RIGHT OUTER JOIN publisher p

  ON b.publisher_id = p.publisher_id;

 

출판사 '현대 문학'은 오른쪽 테이블인 publisher 테이블의 데이터이므로,  왼쪽 테이블(book_list)에 관련된 도서가 존재하지 않더라도 결과에 포함된다. 그러나, '현대 문학' 출판사의 publisher_id와 일치하는 도서가 book_list에 없기 때문에, 이 도서 테이블의 관련된 컬럼 값들은 NULL로 표시된다.

 

 

  SELECT b.ISBN, b.book_name, b.writer, p.publisher_id, p.publisher_name

  FROM book_list b

  RIGHT JOIN publisher p

  ON b.publisher_id = p.publisher_id;

 

필요한 컬럼만 조회

 

FULL OUTER JOIN

  • 두 테이블의 모든 데이터를 결합한다.
  • 즉, 두 테이블이 가지고 있는 모든 행이 반환된다.
  • 기준 컬럼의 값이 일치하지 않는 경우 해당 부분은 NULL로 채워진다.
  • MySQL에서는 직접적으로 지원하지 않으나, UNION을 통해 구현이 가능하다.
# 문법
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블
LEFT JOIN 조인할_테이블 ON 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;
UNION
SELECT 기준_테이블.컬럼1, 기준_테이블.컬럼2, 조인할_테이블.컬럼1,...
FROM 기준_테이블
RIGHT JOIN 조인할_테이블 ON 기준_테이블.공통컬럼 = 조인할_테이블.공통컬럼;

 

📚예시

다시 이 두 테이블에 FULL OUTER JOIN을 적용해보자.

 

 

  ( SELECT * FROM book_list b

  LEFT JOIN publisher p ON b.publisher_id = p.publisher_id)

  UNION

  (SELECT * FROM book_list b

  RIGHT JOIN publisher p ON b.publisher_id = p.publisher_id);

 

FULL OUTER JOIN으로, 각 테이블에 존재하는 모든 레코드가 결과에 포함된다. 책 '1984'는 publisher_id가 8로 설정되어 있지만, 해당 publisher_id에 일치하는 출판사 정보가 publisher 테이블에 없기 때문에 출판사 관련 컬럼은 NULL로 채워진다. 반대로, publisher 테이블의 출판사 '한빛미디어'는 publisher_id가 4로 설정되어 있지만, 이를 참조하는 책 정보가 book_list 테이블에 없기 때문에 도서 관련 컬럼은 NULL로 표시된다. 이처럼 FULL OUTER JOIN은 양쪽 테이블의 모든 데이터가 결합되며, 일치하지 않는 부분은 NULL로 채워지게 된다.

 


 

 

728x90
반응형