데이터베이스

[ MySQL ] Join / Left Join 사용법

zzuvely 2022. 5. 17. 16:19

Join 이란 ?

두 개 이상의 테이블을 조합하여 하나의 결과 집합으로 만들어내는 것이다.

* 두 개 테이블에 공통으로 들어있는 데이터만 가지고 온다.

 

select [ 컬럼명 ]
from [ 테이블1 ]
join [ 테이블2 ]
	on [ 조인 조건];

 

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

 

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

 

 

예시 2) 주문 금액이 600 달러보다 큰 사람의 이메일을 가져오시오.

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

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

 

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

 

 

예시 3) 주문 금액이 600 달러보다 큰 사람의 이메일과 주문 날짜와 금액을 가져오고,

주문 날짜 내림차순으로 가져오세요.

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

 

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

 

 

Left Join 이란?

왼쪽 테이블을 중심으로 오른쪽 테이블을 매치시킨다.

* 왼쪽 테이블의 데이터를 모두 가져오고 공통된 데이터가 없으면 NULL로 표시한다.

 

select [ 컬럼명 ]
from [ 테이블1 ]
left join [ 테이블2 ]
	on [ 조인 조건];

 

예시 4) 모든 학생 데이터를 가져오되, 성적 정보가 없는 학생도 나타나도록 가져오시오.

 

select s.first_name, p.title, p.grade
from students s
left join papers p
	on s.id = p.student_id;

 

 

예시 5) 모든 학생 데이터를 가져오되, 성적 평균이 80점 이상이면 'PASSING',

아니면 'FAILING'으로 채우고, 성적 정보가 없으면 average를 0으로 채우시오. 

 

select s.first_name, ifnull(avg(p.grade), 0) as average,
		if(avg(p.grade) > 80, 'PASSING', 'FAILING') as passing_status
from students s
left join papers p
	on s.id = p.student_id
group by s.id
order by average desc;

 

 

예시 5) 리뷰를 쓴 사람의 이름과 리뷰 수, 리뷰의 최소값, 최대값, 평균값, 리뷰를 쓴 상태를 가져오시오.

( 리뷰를 안쓴 사람의 데이터 값은 0으로, 상태 컬럼은 INACTIVE로 구분해준다. )

 

* 컬럼 데이터 값이 null인지 구하는 방법

[ 컬럼명 ] is null (O)

[ 컬럼명 ] = null (X)

 

select rv.first_name, rv.last_name, count(r.rating) as COUNT, 
	ifnull(min(r.rating), 0) as MIN, 
    ifnull(max(r.rating), 0)as MAX, 
    ifnull(avg(r.rating), 0)as AVG, 
    if(r.rating is null, 'INACTIVE', 'ACTIVE') as STATUS
from reviewers rv
left join reviews r
	on rv.id = r.reviewer_id
group by rv.id;

 

 

예시 6) 3개의 테이블을 합치는 방법.

 

select *
from series s
join reviews r
	on s.id = r.series_id
join reviewers rv
	on r.reviewer_id = rv.id;