개발학습일지

[MySQL] 테이블 합치기 _ join, left join, right join, 3개 이상 테이블 join 본문

MySQL

[MySQL] 테이블 합치기 _ join, left join, right join, 3개 이상 테이블 join

처카푸 2024. 5. 16. 16:07

테이블을 하나로 합치기

 

테이블 합치기 전에 Foreign Key를 지정해야 한다.

참고. https://msdev-st.tistory.com/119

 

[MySQL] Foreign Keys 지정해서 테이블끼리 연결하는 방법

Foreign Keys 지정해서 테이블끼리 연결하는 방법 FOREIGN KEYFOREIGN KEY 제약 조건을 설정한 필드는 외래 키라고 부르며, 한 테이블을 다른 테이블과 연결해 주는 역할을 한다.외래 키가 설정된 테이블

msdev-st.tistory.com

 

 

테이블을 하나로 합칠 때는 join 키워드를 사용한다.

- from -- join -- on --

-- 두개 테이블을 하나로 합쳐서 가져오시오.
select *
from orders
join customers
	on orders.customer_id = customers.id; 
    
-- as 를 사용해도되고, as 빼고 해도 된다.
select *
from orders as o
join customers as c
	on o.customer_id = c.id; 

select *
from orders o
join customers c
	on o.customer_id = c.id; 

-- 컬럼 이름 중복 생기지 않게,
-- 컬럼 이름을 변경해준다.
-- c.* 는 c 테이블의 전체 데이터를 뜻한다.
select o.id as order_id, o.order_date, o.amount, o.customer_id, c.*
from orders o
join customers c
	on o.customer_id = c.id;

^ 위에서 한 join은 두 테이블의 공통으로 들어있는 데이터만 나온다.

 

 

테이블을 하나로 합칠 때,

from 테이블의 데이터를 다 가져오고 싶으면 left join 또는  right join  키워드를 사용한다.

- 일치하지 않은 데이터는 null값으로 표시

-- 예를 들어서, 회원가입은 했는데, 주문을 한번도 안한 사람들도 있다.
-- 따라서, 모든 고객 데이터를 가져오되, 주문 안한 사람들도 정보를 볼 수 있도록 하는 방법!!
-- 전부 살려주고 싶은 데이터를 선택해서 사용하면 된다.
select *
from customers c
left join orders o 
	on c.id = o.customer_id;
    
select *
from customers c
right join orders o 
	on c.id = o.customer_id;

 

 

join 키워드의 복잡한 버전

- left join

-- 어떤 컬럼을 카운트 할 건지 잘생각해봐야한다.
-- 한쪽 테이블에 데이터는 항상 있기 때문에 다른 한쪽에 데이터가 없어도 1개로 나온다

-- 각 고객별로, 주문 수를 나타내시오.
-- (고객의 이름과 이메일이 함께 나와야 합니다.)
select c.first_name, c.last_name, c.email, count(o.id) as order_cnt
from orders o
left join customers c
	on o.customer_id = c.id
group by c.email;

left join

- join

-- 2019년 12월 20일부터 2020년 1월 10일 사이의 주문 데이터에서
-- 고객별 주문금액 평균이 300달러 이상인 사람의
-- 이름과 평균 금액을 가져오세요.
select concat(c.first_name, ' ', c.last_name) full_name, avg(o.amount) avg_amount
from orders o
join customers c
	on o.customer_id = c.id
where order_date between '2019-12-20' and '2020-01-10'
group by c.id
	having avg_amount >= 300
order by avg_amount desc;

join

 

 

테이블이 3개 이상일 경우, 테이블 전체를 join하는 방법

- 어떤 테이블이 먼저 나오는지는 상관이 없다.
- 이어지는 테이블이 있는지만 생각하면 된다.

-- 3개의 테이블 다 같이 보기
select *
from series s
join reviews rv
	on s.id = rv.series_id
-- ^ 위에 자체가 하나의 테이블이기 때문에 또 join이 가능하다
join reviewers r
	on rv.reviewer_id = r.id;
    

select s.title, rv.rating, concat( r.first_name, ' ', r.last_name ) reviewer
from reviews rv
right join reviewers r
	on rv.reviewer_id = r.id
right join series s
    on rv.series_id = s.id;