본문 바로가기

프로그래밍 언어/MySQL

[MySQL] 관계형 데이터베이스 합치기: join, left join

반응형

MySQL에서 많은 데이터 insert 时

- 번개모양 클릭

- 처음부터 끝까지 자동으로 실행해준다. 

 

데이터 입력:

customers 입력값: https://yeo0616.tistory.com/113

orders 입력값: https://yeo0616.tistory.com/114

 

use yh_db;

select * from orders;
select * from customers;

-- 100 명 고객
select count(*) from customers;

-- 700개 주문 
select count(*) from orders;

ㄴ 입력한 데이터 값 확인



관계형 데이터베이스 합치기: join

-- join 뒤에 갖다 붙일 테이블 명을 쓴다. 하나 더 키워드 on을 쓴다. 

ㄴ 두개가 같은 컬럼. 연결시키는 조건

-- 두개 테이블을 하나로 합쳐서 가져오시오.라는 뜻 

join 테이블 이름 on 테이블1 id 컬럼 = 테이블2의 테이블1 id 설정 컬럼

-- customers의 id 컬럼과 orders의 customer_id이 같은 것으로 합쳐라.

ㄴ foreign key가 적용되어있어야한다. 

 

-- 테이블 이름을 줄여서 사용하는 방법

-- as를 써도 되고, 안써도 된다. (생략 가능)

-- 실무에서는 as조차 생략해서 줄여서 쓴다. 

 

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

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

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

-- 현재는 id 컬럼이 두개임. 

-- 뒤에있는 id는 customers의 id임.

-- 실무에서는 *를 줘서 데이터를 가져오지는 않는다. 

- 잇고자 하는 테이블의 컬럼에 반드시 foreign key를 설정해놓은 상태여야한다. 

 

-- 컬럼의 이름이 중복되는 경우는, 컬럼이름을 바꿔서 가져와야 한다. 

 

-- 컬럼의 이름이 중복되는 경우는, 컬럼이름을 바꿔서 가져와야 한다. 

select c.id as customer_id,c.first_name, c.email, 
   o.id as order_id, o.amount, o.order_date
from customers c
join orders o
on c.id = o.customer_id;

 

-- 지금까지 위에서 한 join은, 두 개 테이블에 공통으로 들어있는 데이터만, 가지고 온 것이다. 

ㄴ 교집합: 회원 중에서도 주문을 한 사람들. 

- Null이 없음

 

기본 데이터 + 다른 데이터 정보 추가: left join 

-- 모든 고객 데이터를 가져오되, 주문정보가 없는 고객도 나타나도록 가져오는 방법.

-- left join !!

-- 먼저 작성한 테이블 이름(from뒤에 작성한 테이블)이 left.

– left에 있는 데이터는 다 표시하라.라는 뜻 

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

 

left join 테이블 이름 on 테이블1 id 컬럼 = 테이블2의 테이블1 id 설정 컬럼

-- 고객들 정보는 모두 가져오되, 왼쪽에 남겨두고, on 가져오되, c.id에 있는 값과 o.customer_id의 값이 같은 것을 가져와라. 

 

-- 주문 금액이 600 달러보다 큰 사람의 데이터를 가져오시오. 

select c.id as customer_id,c.first_name, c.email, 
  o.id as order_id, o.amount, o.order_date
from customers c
join orders o
on c.id = o.customer_id
where o.amount>600;

 

-- 주문 금액이 600 달러보다 큰 사람의 이메일를 가져오시오. (단계단계로 가즈아)

select distinct c.email
from customers c
join orders o
on c.id = o.customer_id
where o.amount>600;

ㄴ 중복되어있는 이메일을 가져다주지는 말쟈

 

-- 주문 금액이 600달러보다 큰 사람의 이메일과 주문 날짜와, 금액을 가져오는데, 주문날짜 내림차순으로 가져오세요.

select distinct c.email, o.order_date, o.amount 
from customers c
join orders o
on c.id = o.customer_id
where o.amount > 600
order by o.order_date desc;

 

-- 각 고객별로, 주문수를 나타내시오

select c.first_name, c.last_name, count(*) as order_cnt
from customers c
join orders o
on c.id = o.customer_id
group by c.id;


반응형