[ 목차 ]
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로 채워지게 된다.
'데이터 분석 > MySQL' 카테고리의 다른 글
MySQL 총 정리10: 서브쿼리- 스칼라, 인라인 뷰, 중첩 (0) | 2024.10.12 |
---|---|
MySQL 총 정리9: UNION과 UNION ALL (1) | 2024.10.09 |
MySQL 총 정리7: GROUP BY와 HAVING (2) | 2024.10.05 |
MySQL 총 정리6: mysql 내장함수 모음 (4) | 2024.10.03 |
MySQL 총 정리5: ORDER BY로 데이터 정렬 (1) | 2024.10.02 |