SQL 3주차!!

이단비·2021년 10월 28일
0

3주차 수업 이번 수업은 JOIN과 UION이다.

JOIN 쿼리!

먼저 JOIN은 서로 다른 두 개의 테이블을 연결하여 유의미한 통계값을 내기 위해 사용하는 쿼리이다.
엑셀의 VLOOKUP과 유사한 기능!!

오늘 배운 JOIN은 두 가지 종류로 LEFT JOIN과 INNER JOIN이 있다.

> LEFT JOIN

기준이 되는 테이블을 왼쪽으로 붙이려고 하는 테이블을 오른쪽으로 연결하는 형식이다.

A테이블에 B테이블을 연결시켰을 경우, B테이블에는 데이터가 없는 필드값이 있다면 NULL로 표시된다.

> INNER JOIN

두 개 테이블의 공통된 필드값으로 연결하는 것으로 교집합된 데이터만 뽑아볼 수 있다. 어느 테이블을 앞에 두어야 하는지 크게 신경쓰지 않아도 되어서 LEFT JOIN보다 수월하게 활용할 수 있는 장점이 있다.

JOIN 쿼리 작업 순서

  1. 두 개의 테이블을 이을 공통된 필드 찾기
    JOIN 할 테이블 두 개를 골랐다면, 각 테이블의 필드를 살펴보고, 어떤 공통된 필드가 있는지 확인 후, 해당 필드로 조인한다.
    아래 코드로 테이블 조회하여 공통된 필드 찾기!
SELECT * FROM 테이블명



위 두개 예시를 보면, USERS테이블과 ODERS테이블을 JOIN하기 위해 user_id 필드를 사용할 수 있다.

  1. 공통된 필드로 테이블 연결하기
    공통된 필드를 찾았다면, 아래 코드로 두 테이블을 연결 할 수 있다.
SELECT * FROM users u 
inner join orders o on u.user_id = o.user_id 

한 개 테이블에 너무 많은 데이터를 담는 것은 작업에 무리를 주기때문에
여러 테이블에 나누어서 데이터를 담고, 공통된 필드값으로 join쿼리를 이용하여 다양한 통계값을 다뤄볼 수 있다!

아래 예시는 각 과목의 주차별 학생들의 체크인 수를 세어본 쿼리이다.

select c1.title, c2.week, count(*) as cnt from checkins c2
inner join courses c1 on c2.course_id = c1.course_id
group by c1.title c2.week
order by c1.title, c2.week

결과 값은 아래 이미지!

UNION 쿼리!

UNION은 두가지 결과물을 합치는 쿼리이다.
아래 두 코드를 실행하면 각각 7월 내용, 8월 내용으로 따로 보여지게 된다.

select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at < '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week

select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
inner join courses c on c2.course_id = c.course_id
inner join orders o on o.user_id = c2.user_id
where o.created_at > '2020-08-01'
group by c2.course_id, c2.week
order by c2.course_id, c2.week


두 코드를 UNION쿼리를 사용하여 이어주면 7월 내용과 8월 내용을 한번에 확인 할 수 있다.

(
	select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at < '2020-08-01'
	group by c2.course_id, c2.week
        order by c2.course_id, c2.week
)
union all
(
	select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at > '2020-08-01'
	group by c2.course_id, c2.week
        order by c2.course_id, c2.week
)

이렇게 3주차 강의도 완료!!
다음 강의도 기대가 가득하다!!

profile
왕초보 탈출기 입니다!! :)

0개의 댓글