MySQL 여러 테이블을 결합하는 join과 left join, right join 사용 방법 과 예시

2023. 12. 26. 12:30Database/MySQL

728x90
반응형

 

728x90

 

 

 

 

MySQL에서 join은 데이터 베이스내의 여러 테이블의 행을 결합하는데 사용됩니다. 

두 개 이상의 테이블을 엮어야 원하는 결과가 나오는 경우도 있어 이 때 join을 사용하면

두개의 테이블을 엮어서 원하는 데이터를 추출할 수 있습니다.

 

join은 보통 select 문과 자주 사용되며, left join, right join 등으로 나누어 사용하기도 합니다.

 

 

 

join

테이블 여러개를 합쳐서 가져오는 방법

데이터 정규화, 관게형 데이터 베이스

 

ex. 회원정보와 주문정보를 합쳐서 관리(회원 아이디로 통합)

 

select 컬럼 목록
from 첫번째 테이블 이름
join 두번째 테이블 이름
on 조인 조건
[where 검색 조건]

 

 

 

left join

첫번째 테이블을 기준으로 두번째 테이블을 조합하는 join입니다.

왼쪽 테이블의 모든 값이 출력되는 join

 

select 컬럼 목록
from 첫번째 테이블 이름
left join 두번째 테이블 이름
on 조건
[where 검색 조건]

 

 

 

right join

left join과 반대로 두번째 테이블을 기준으로 첫번째 테이블을 조합하는 join입니다.

오른쪽의 테이블의 모든 값이 출력되는 join

 

select 컬럼 목록
from 첫번째 테이블 이름
right join 두번째 테이블 이름
on 조건 
[where 검색 조건]

 

 

 


 

join 실습문제

 

주어진 데이터는 아래와 같습니다.

 

select *
from customers;

 

 

 

 

select *
from orders;

 

 

 


 

 

1. 두개 테이블을 하나로 합쳐서 가져오시오

 

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

 

 

 

 

 

 

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

 

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;

 

 

 

 

 

3. 컬럼 이름이 중복되면, 중복되지 않도록 변경해준다

 

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

 

 

 

 

 

위의 join은 주문 데이터(order)를 위주로 주문자(customer)가 누구인지 오른쪽에 붙인 것!

 

 


 

left join 실습문제

 

 

1. 회원 가입은 했는데 주문을 한번도 안한 사람은 위의 데이터에서 확인이 가능한가?

모든 회원 정보를 가져오되 오른쪽에 주문 정보를 붙여서 주문 안한 사람은 null 이 나오도록 나타내고 싶다.

 

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

 

 

 

 

 

2. 주문 금액이 600달러보다 큰 사람의 데이터를 가져오시오, 그 사람의 이메일 주소와 이름을 확인할 수 있어야 합니다.

 

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

 

 

 

 

 

3. 위에서 이 사람들의 이메일과 주문금액, 주문 날짜를 가져오시오

 

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

 

 

 

 

 

 

4. 위의 결과를 주문날짜 내림차순으로 가져오세요

 

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

 

 

 

 

 

 

5. 고객 아이디가 36인 사람의 주문 내역(모든 정보)를 가져오시오

 

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

 

 

 

 

 

 

6. first_name이 'Cobby'인 사람의 주문내역을 가져오시오

 

select *
from customers c
left join orders o
on c.id = o.customer_id
where c.first_name = 'Cobby';

 

 

 

 

 

 

7. first_name에 ty가 들어가는 사람의 주문내역을 가져오시오

 

select *
from customers c
left join orders o
on c.id = o.customer_id
where c.first_name like '%ty%';

 

 

 

 

 

 

8. 주문금액이 300이상이고 500이하인 주문내역을 가져오시오

단, 주문한 사람의 이메일 정보도 같이 나와야 합니다.

 

select *
from orders o
left join customers c
on c.id = o.customer_id
where o.amount between 300 and 500;

 

 

 

 

select o.*, c.*
from orders o
left join customers c
on c.id = o.customer_id
where o.amount between 300 and 500;

 

 

 

 

select o.*, c.email
from orders o
left join customers c
on c.id = o.customer_id
where o.amount between 300 and 500;

 

 

 

 

 

반응형

 

728x90
반응형