본문 바로가기
카테고리 없음

코딩 배우기 2차전_SQL 3주차

by 개발자A입니다 2022. 5. 4.

하루에 2주치를 끝냈다ㅎㅎ

 

괜히 뿌듯한데 벌써 새벽 1시 40분이다ㅎㅎ

 

내일 출근도 해야하지만, 재미가 있어서 할 수 밖에 없다:)

 

 

결과물 부터 보자면 이렇다

SELECT 	e.enrolled_id , 
		e.user_id ,
		round(COUNT(e.user_id),0) as max_count 
  FROM enrolleds e 
inner join enrolleds_detail ed on e.enrolled_id =ed.enrolled_id 
where done = 1
group by e.enrolled_id, e.user_id  
order by max_count desc;

몇일만에 내가 이걸 이해할 수 있는 지식을 갖췄다니ㅎㅎ

괜시리 뿌듯하다ㅎ

벌써 한주차만 남았다는게 함정ㅠㅠ

 

자 이제 오늘 배운 것을 정리해 보겠다.

 

1) Join의 종류: Left Join, Inner Join

Join이란? 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미해요.

- Left Join: A에 B가 겹치는 것 

select * from users u
left join point_users p
on u.user_id = p.user_id;

어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있습니다.

꽉찬 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재해서 연결한 경우 비어있는 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재하지 않는 경우

비어있는 데이터의 경우, 회원이지만 수강을 등록/시작하지 않아 포인트를 획득하지 않은 회원인 경우에요!

 

- Inner Join: A와 B의 교집합

select * from users u
inner join point_users p
on u.user_id = p.user_id;

여기서는 비어있는 필드가 있는 데이터가 없어요! 그 이유는, 같은 user_id를 두 테이블에서 모두 가지고 있는 데이터만 출력했기 때문이에요.

 

2) 결과물 합치기! Union

Select를 두 번 할 게 아니라, 한번에 모아서 보고싶은 경우, 있을걸요!

근데, 그러려면 한 가지 조건이 있어요! 노란색과 파란색 박스의 필드명이 같아야 한답니다.

(
	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
)

union을 사용하면 내부 정렬이 먹지 않아요. 이 때 유용한 방법이 있지요. 바로, SubQuery(서브쿼리) !