[DB] MySQL - join

양희연·2020년 9월 4일
0

database

목록 보기
5/8
post-thumbnail

데이터베이스에서 가장 중요한 부분은 데이터를 가져오는데 걸리는 시간의 최소화이다.
👉 데이터 중복의 최소화

데이터의 중복을 최소화하기 위해 테이블을 분리시킨 후 데이터를 가져올 때 여러 테이블을 하나의 결과로 가져와야 하는데 이럴 때 join문을 사용한다.


아래에 customer 테이블과 reservation 테이블이 있다.
이 두 테이블을 이용하여 join문을 연습해보자. 👊

inner join

on절의 조건을 만족하는 데이터만을 가져온다.

--문법
select * from A_Table (inner) join B_table on 조건;

--아래 명령어도 위와 같은 실행결과를 출력한다.
select * from A_Table, B_table where 조건;

select c.name, c.age, r.room
from customer as c, reservation as r
where c.name = r.name;
+-------+------+------+
| name  | age  | room |
+-------+------+------+
| Ruby  |   17 | A    |
| Dawn  |   20 | B    |
| Ryan  |   19 | C    |
| Eden  |   21 | D    |
| Corey |   22 | E    |
| Ruby  |   17 | B    |
| Ryan  |   19 | C    |
+-------+------+------+

💡 as로 별칭을 지정해 사용할 수 있다.

select c.name as '이름', c.age as '나이', r.room as '방이름'
from customer as c, reservation as r
where c.name = r.name;
+--------+--------+-----------+
| 이름    | 나이    | 방이름      |
+--------+--------+-----------+
| Ruby   |     17 | A         |
| Dawn   |     20 | B         |
| Ryan   |     19 | C         |
| Eden   |     21 | D         |
| Corey  |     22 | E         |
| Ruby   |     17 | B         |
| Ryan   |     19 | C         |
+--------+--------+-----------+
--또 다른 예
--각 음료에 대한 알러지 조회
select d.name, a.name
from drinks as d, allergies as a, allergies_drinks as ad
where d.id = ad.drink_id and a.id = ad.allergy_id;
+-----------+------+
| name      | name |
+-----------+------+
| cold brew | milk |
| macchiato | milk |
+-----------+------+

left join

A_Table을 기준으로 B_Table을 조인한다.
이때, on절의 조건을 만족하지 않는 경우에는 A_Table의 필드값을 그대로 가져온다.
하지만 해당 row의 B_Table의 필드값은 모두 null로 표시된다.

--문법
select * from A_Table left join B_Table on 조건;

select * from customer as c left join reservation as r on c.name = r.name;
+----+--------+------+------+-------+------+
| id | name   | age  | id   | name  | room |
+----+--------+------+------+-------+------+
|  1 | Ruby   |   17 |    1 | Ruby  | A    |
|  1 | Ruby   |   17 |    6 | Ruby  | B    |
|  2 | Dawn   |   20 |    2 | Dawn  | B    |
|  3 | Ryan   |   19 |    3 | Ryan  | C    |
|  3 | Ryan   |   19 |    7 | Ryan  | C    |
|  4 | Eden   |   21 |    4 | Eden  | D    |
|  5 | Corey  |   22 |    5 | Corey | E    |
|  6 | Sam    |   21 | NULL | NULL  | NULL |
|  7 | Aurora |   21 | NULL | NULL  | NULL |
+----+--------+------+------+-------+------+

right join

B_Table을 기준으로 A_Table을 조인한다.
이때, on절의 조건을 만족하지 않는 경우에는 B_Table의 필드값을 그대로 가져온다.
하지만 해당 row의 A_Table의 필드값은 모두 null로 표시된다.

--문법
select * from A_Table right join B_Table on 조건;

select * from customer as c right join reservation as r on c.name = r.name;
+------+-------+------+----+-------+------+
| id   | name  | age  | id | name  | room |
+------+-------+------+----+-------+------+
|    1 | Ruby  |   17 |  1 | Ruby  | A    |
|    2 | Dawn  |   20 |  2 | Dawn  | B    |
|    3 | Ryan  |   19 |  3 | Ryan  | C    |
|    4 | Eden  |   21 |  4 | Eden  | D    |
|    5 | Corey |   22 |  5 | Corey | E    |
|    1 | Ruby  |   17 |  6 | Ruby  | B    |
|    3 | Ryan  |   19 |  7 | Ryan  | C    |
| NULL | NULL  | NULL |  8 | boss  | Z    |
+------+-------+------+----+-------+------+
profile
꾸준히 나아가자!

0개의 댓글