데이터베이스에서 가장 중요한 부분은 데이터를 가져오는데 걸리는 시간의 최소화이다.
👉 데이터 중복의 최소화
데이터의 중복을 최소화하기 위해 테이블을 분리시킨 후 데이터를 가져올 때 여러 테이블을 하나의 결과로 가져와야 하는데 이럴 때 join문을 사용한다.
아래에 customer 테이블과 reservation 테이블이 있다.
이 두 테이블을 이용하여 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 |
+-----------+------+
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 |
+----+--------+------+------+-------+------+
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 |
+------+-------+------+----+-------+------+