일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- OrderBy
- Database
- 최단경로
- JOIN
- 배포
- SQL
- 크루스칼
- 다익스트라
- 코딩테스트
- 구현
- 누적합
- 백준
- Java
- EC2
- 자바
- 프림
- MST
- 그래프 탐색
- 피로그래밍
- Baekjoon
- 알고리즘
- SQL코딩테스트
- db
- AWS
- 프로그래머스
- GROUPBY
- django
- Pirogramming
- BFS
- union find
- Today
- Total
NullNull
MySQL DB JOIN 정리 본문
MySQL의 JOIN을 정리해보려 한다. 아래의 그림이 JOIN을 잘 설명하고 있다.
예시를 통해 하나씩 알아보자. 예시 테이블은 다음과 같다.
A table
ID | NAME |
1 | KIM |
2 | LEE |
B table
ID | HOME |
2 | SEOUL |
3 | ANSAN |
4 | DAEGU |
1. INNER JOIN
INNER JOIN은 두 테이블의 교집합을 찾는 것이다. A 테이블과 B 테이블을 id값을 기준으로 JOIN 할 때 두 테이블에 모두 존재하는 값들만 결과로 조회된다.
SELECT A.ID ID, A.NAME NAME, B.HOME HOME
FROM A INNER JOIN B
ON A.ID = B.ID
2. LEFT JOIN
LEFT JOIN은 A와 B 테이블을 합치되, A 테이블에는 존재하지만 B 테이블에 없는 속성에 대해서는 NULL이 된다. 예를 들어 A 테이블에는 id가 1인 레코드가 있지만 B 테이블에는 id가 1인 레코드가 존재하지 않는다. 따라서 A LEFT JOIN B를 하면 id가 1인 레코드의 HOME 속성은 NULL이 된다.
SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID;
3. LEFT JOIN without INNER JOIN
LEFT JOIN 을 한 상태에서 WHERE B.ID IS NULL 속성을 추가하면 A에만 존재하는 속성을 조회할 수 있다. LEFT JOIN 을 실행하면 왼쪽 테이블에는 존재하지만 오른쪽 테이블에 없는 레코드는 NULL 값을 가진다. 이때 WHERE 절에 그러한 NULL값을 가지는 값들만 표시하도록 조건을 주면 결과적으로 왼쪽에만 있는 데이터가 나오게 된다.
SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID IS NULL;
4. RIGHT JOIN
RIGHT JOIN은 LEFT JOIN과 같은 방법으로 동작하지만 기준이 오른쪽 테이블이 된다는 점만 다르다. B 테이블에는 id가 3인 레코드가 있지만 A 테이블에는 id가 3인 레코드가 존재하지 않는다. 따라서 A RIGHT JOIN B를 하면 id가 3인 레코드의 NAME 속성은 NULL이 된다.
SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID;
5. RIGHT JOIN without INNER JOIN
RIGHT JOIN 을 한 상태에서 WHERE A.ID IS NULL 속성을 추가하면 B에만 존재하는 속성을 조회할 수 있다.
SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID
WHERE A.ID IS NULL;
6. FULL OUTER JOIN
MySQL에는 OUTER JOIN이 존재하지 않는다. 따라서 UNION을 사용해서 LEFT JOIN의 결과와 RIGHT JOIN의 결과를 합쳐주는 방법으로 구현해야 한다.
SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID
UNION
SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID
ORDER BY ID;
7. FULL OUTER JOIN without INNER JOIN
LEFT JOIN과 RIGHT JOIN을 합친 이후에 두 테이블에 공통으로 들어있는 데이터를 제거한다. 즉 LEFT OUTER JOIN without INNER JOIN과 RIGHT OUTER JOIN without INNER JOIN을 합친 것과 같다.
SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID
WHERE A.ID IS NULL
UNION
SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID IS NULL
ORDER BY ID;
'SQL' 카테고리의 다른 글
프로그래머스 SQL 있었는데요 없었습니다 (0) | 2022.03.01 |
---|---|
프로그래머스 SQL 없어진 기록 찾기 (0) | 2022.03.01 |
프로그래머스 SQL NULL 처리하기 (0) | 2022.02.28 |
프로그래머스 SQL 이름이 있는 동물의 아이디 (0) | 2022.02.28 |
프로그래머스 SQL 이름이 없는 동물의 아이디 (0) | 2022.02.28 |