[SQL] 09. JOIN

hhyun·2024년 6월 8일

[SQL]

목록 보기
9/20

📖 JOIN

🌟 JOIN : 두 개 이상의 table을 결합하는 것

• JOIN의 종류

• INNER JOIN
• FULL OUTER JOIN
• LEFT JOIN
• RIGHT JOIN


📖 INNER JOIN

🌟 INNER JOIN

• 두 개의 table에서 공통된 요소들을 통해 결합하는 join 방식

SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column --(기준 제시)
WHERE condition;

🌟 INNER JOIN 예제

• snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 INNER JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
INNER JOIN snl_show
ON celeb.name = snl_show.host;
+----+--------+----+--------+
| id | name   | id | host   |
+----+--------+----+--------+
|  4 | 강동원 |  1 | 강동원 |
|  5 | 유재석 |  2 | 유재석 |
|  6 | 차승원 |  3 | 차승원 |
|  7 | 이수현 |  4 | 이수현 |
+----+--------+----+--------+

📖 LEFT JOIN

🌟 LEFT JOIN

• 두 개의 table에서 공통영역을 포함해 왼쪽 table의 다른 data를 포함하는 join 방식

SELECT column1, column2, ...
FROM tableA    						--left table
LEFT JOIN tableB 					--right table
ON tableA.column = tableB.column  	--(기준 제시)
WHERE condition;

🌟 LEFT JOIN 예제

• snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 LEFT JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
LEFT JOIN snl_show
ON celeb.name = snl_show.host;
+----+--------+------+--------+
| id | name   | id   | host   |
+----+--------+------+--------+
|  1 | 아이유 | NULL | NULL   |
|  2 | 이미주 | NULL | NULL   |
|  3 | 송강   | NULL | NULL   |
|  4 | 강동원 |    1 | 강동원 |
|  5 | 유재석 |    2 | 유재석 |
|  6 | 차승원 |    3 | 차승원 |
|  7 | 이수현 |    4 | 이수현 |
+----+--------+------+--------+

📖 RIGHT JOIN

🌟 RIGHT JOIN

• 두 개의 table에서 공통영역을 포함해 오른쪽 table의 다른 data를 포함하는 join 방식

SELECT column1, column2, ...
FROM tableA 						--left table 
RIGHT JOIN tableB					--right table
ON tableA.column = tableB.column	--(기준 제시)
WHERE condition;

🌟 RIGHT JOIN 예제

• snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 RIGHT JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
RIGHT JOIN snl_show
ON celeb.name = snl_show.host;
+------+--------+----+--------+
| id   | name   | id | host   |
+------+--------+----+--------+
|    4 | 강동원 |  1 | 강동원 |
|    5 | 유재석 |  2 | 유재석 |
|    6 | 차승원 |  3 | 차승원 |
|    7 | 이수현 |  4 | 이수현 |
| NULL | NULL   |  5 | 이병헌 |
| NULL | NULL   |  6 | 하지원 |
| NULL | NULL   |  7 | 제시   |
| NULL | NULL   |  8 | 조정석 |
| NULL | NULL   |  9 | 조여정 |
| NULL | NULL   | 10 | 옥주현 |
+------+--------+----+--------+

📖 FULL OUTER JOIN

🌟 FULL OUTER JOIN

• 두 개의 table에서 공통영역을 포함해 양쪽 table의 다른 영역을 모두 포함하는 join 방식

SELECT column1, column2, ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column	--(기준 제시)
WHERE condition;

❗ MySQL에서는 FULL OUTER JOIN을 지원하지 않는다.

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB ON tableA.column = tableB.column
UNION
SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB ON tableA.column = tableB.column
WHERE condition;

🌟 FULL OUTER JOIN 예제

• snl_show에 호스트로 출연한 celeb 테이블과 snl_show 테이블을 FULL OUTER JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
LEFT JOIN snl_show 
ON celeb.name = snl_show.host
UNION
SELECT celeb.id,  celeb.name, snl_show.id, snl_show.host
FROM celeb
RIGHT JOIN snl_show 
ON celeb.name = snl_show.host;
+------+--------+------+--------+
| id   | name   | id   | host   |
+------+--------+------+--------+
|    1 | 아이유 | NULL | NULL   |
|    2 | 이미주 | NULL | NULL   |
|    3 | 송강   | NULL | NULL   |
|    4 | 강동원 |    1 | 강동원 |
|    5 | 유재석 |    2 | 유재석 |
|    6 | 차승원 |    3 | 차승원 |
|    7 | 이수현 |    4 | 이수현 |
| NULL | NULL   |    5 | 이병헌 |
| NULL | NULL   |    6 | 하지원 |
| NULL | NULL   |    7 | 제시   |
| NULL | NULL   |    8 | 조정석 |
| NULL | NULL   |    9 | 조여정 |
| NULL | NULL   |   10 | 옥주현 |
+------+--------+------+--------+

📖 SELF JOIN

🌟 SELF JOIN

• INNER JOIN과 같은 결과

SELECT column1, column2, ...
FROM tableA, tableB
WHERE condition;

🌟 SELF JOIN 예제

• [예제 1] snl_show 에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
+----+--------+----+--------+
| id | name   | id | host   |
+----+--------+----+--------+
|  4 | 강동원 |  1 | 강동원 |
|  5 | 유재석 |  2 | 유재석 |
|  6 | 차승원 |  3 | 차승원 |
|  7 | 이수현 |  4 | 이수현 |
+----+--------+----+--------+

• [예제 2] snl_show 에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보를 검색

🍀 case 1. 칼럼명 앞에 테이블명 명시

SELECT snl_show.id, snl_show.season, snl_show.episode, celeb.name, celeb.job_title  
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;
+----+--------+---------+--------+-----------+
| id | season | episode | name   | job_title |
+----+--------+---------+--------+-----------+
|  1 |      8 |       7 | 강동원 | 배우      |
|  2 |      8 |       8 | 유재석 | 개그맨,MC |
|  3 |      8 |       9 | 차승원 | 배우      |
|  4 |      8 |      10 | 이수현 | 가수      |
+----+--------+---------+--------+-----------+

🍀 case 2. 칼럼명만 명시 (❗에러 - 동일한 칼럼명을 두 테이블 모두 가지고 있는 경우 )

SELECT id, season, episode, name, job_title  
FROM celeb, snl_show
WHERE name = host;
ERROR 1052 (23000): Column 'id' in field list is ambiguous
🍀 case 3. 동일한 컬럼명이 존재하는 경우에만 테이블명을 명시
SELECT snl_show.id, season, episode, name, job_title  
FROM celeb, snl_show
WHERE name = host;
+----+--------+---------+--------+-----------+
| id | season | episode | name   | job_title |
+----+--------+---------+--------+-----------+
|  1 |      8 |       7 | 강동원 | 배우      |
|  2 |      8 |       8 | 유재석 | 개그맨,MC |
|  3 |      8 |       9 | 차승원 | 배우      |
|  4 |      8 |      10 | 이수현 | 가수      |
+----+--------+---------+--------+-----------+
🍀 쿼리 가독성을 위해 테이블명을 다 붙이는 걸 추천

0개의 댓글