테이블 두 개를 합칠 수 있습니다.
합친 후 필요한 정보만 한 테이블에 가져올 수도 있습니다.
customers라는 테이블과
select * from customers;
orders라는 테이블이 있습니다.
select * from orders;
두 개 테이블을 합쳐서 하나로 가져오도록 합니다!
합칠 때는 작업에 맞춰서. 주문테이블을 보고 싶고, 거기에 고객정보를 보고 싶으면 주문테이블에 고객정보를 붙이는 식으로 합쳐줍니다. 메인이 되는 정보가 무엇이 되면 좋을지 항상 생각하고 작업하는 것이 좋습니다.
여기에 join() 함수를 사용합니다. join()은 테이블 두개씩 붙여줍니다. join 을 기준으로 양쪽을 left 와 right 로 인식합니다.
select *
from orders
join customers
on orders.customer_id = customers.id ;
테이블의 이름을 줄여서 사용하는 방법
select *
from orders as o
join customers as c
on o.customer_id = c.id ;
때로는 중복된 컬럼 이름을 변경하는 것이 좋습니다.
select o.id as order_id, order_date, amount, o.created_at, c.id as customer_id, first_name, last_name, email
from orders as o
join customers as c
on o.customer_id = c.id ;
위의 join()은!!!
두 개 테이블에, 공통으로 들어있는 데이터만 합쳐서 가져온 것입니다.
위의 join() 테이블에서는 회원가입은 했지만 주문을 안 한 사람은 나오지 않습니다.
모든 고객 데이터 customers 를 가져오되,
주문 정보가 없는 고객도 나타나도록 가져오는 방법 left / right
select *
from customers c
left join orders o
on c.id = o.customer_id;
select *
from orders o
right join customers c
on c.id = o.customer_id;
주문금액이 600달러보다 큰 데이터를 가져오시오.
그 사람의 이메일 주소와 이름을 확인할 수 있어야 합니다.
* 작업 순서가 중요하다.
select *
from orders o
join customers c
on o.customer_id = c.id
where amount > 600 ;
주문 금액이 600 달러보다 큰 사람의 이메일과 주문금액, 주문날짜를 가져오시오.
select c.email, amount, o.created_at
from orders o
join customers c
on o.customer_id = c.id
where amount > 600 ;
위의 결과를 주문날짜 내림차순으로 가져오시오.
select c.email, o.amount, o.created_at
from orders o
join customers c
on o.customer_id = c.id
where amount > 600
order by o.created_at desc;
고객 아이디가 36인 사람의 주문내역을 가져오시오.
select *
from orders o
join customers c
on o.customer_id = c.id
where c.id = 36;
select *
from customers c
join orders o
on c.id = o.customer_id
where c.id = 36;
퍼스트 네임이 'cobby'인 사람의 주문내역
select *
from customers c
join orders o
on c.id = o.customer_id
where first_name = 'cobby' ;
first_name 에 ty가 들어가는 사람의 주문내역을 가져오시오.
select *
from customers c
join orders o
on c.id = o.customer_id
where first_name like '%ty%';
주문금액이 300이상이고 500 이하인 주문내역을 가져오시오.
단 주문한 사람의 이메일 정보도 같이 나와야 합니다.
select *
from orders o
join customers c
on o.customer_id = c.id
where amount between 300 and 500;
select *
from orders o
join customers c
on o.customer_id = c.id
where amount >= 300 and amount <= 500;
각 고객 별로, 주문 수를 나타내시오.
-- left join, order bby 컬럼, count 컬럼
-- 그냥 join 할 건지, left join 할 건지. 생각 잘 해봐야 합니다
select c.id as customer_id, c.first_name, c.last_name, c.email, count(o.id) as order_cnt
from customers c
left join orders o
on c.id = o.customer_id
group by c.id;
각 고객별로 주문 금액 평균이 300 달러 이상인 데이터만 가져오시오.
-- left join 커스토머 정보 다 나오게 할 거야!!
select c.id, c.email, avg(amount) as avg_amount
from customers c
left join orders o
on c.id = o.customer_id
group by c.id having avg_amount >= 300;
각 고객 별로 주문금액 최대값이 600 달러 이상인 데이터만 가져와서 내림차순으로 정렬하시오.
select c.id, c.first_name, c.last_name, c.email, max(amount) as max_amount
from customers c
left join orders o
on c.id = o.customer_id
group by c.id having max_amount >= 600
order by max_amount desc;
오더 날짜의 최소값과 최대값을 확인하시오.
select min(order_date), max(order_date)
from orders;
2019년 12월 20일부터 2020년 1월 10일 사이에 주문한 사람은 몇 명입니까
select count( distinct customer_id )
from orders o
where order_date between '2019-12-20' and '2020-01-10';
2019년 12월 20일부터 2020 01 10 사이의 주문데이터에서
고객별 주문금액 평균이 300 달러 이상인 사람의 이름과 평균금액을 가져오시오
-- 모든 요소의 위치들의 의미를 정확히 확인하세요.
select c.first_name, c.last_name, avg( amount ) as 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;