[3주차]

Join
테이블과 테이블을 붙히는 것
테이블을 붙일 때 기준이 뭔가 하나 필요하다.
(예를 들면, 두 테이블에 공통으로 들어있는 user_id)
(통상적으로 key값이라 부르는 것들이 그러하다)
(엑셀의 vlookup과 동일한데, vlookup보다 쉬움. 그래서 엑셀보다 쉬운 SQL이 되는 것임. 후후.)

! join 굉장히 실무에서 많이 쓰임. 거의 다 쓴다고 보시면 돼요. 거의 모든 쿼리에 Join이 들어간다고 보시면 돼요



테이블을 한 목적에 맞는 것들만 모아 두는 것이 가장 좋습니다
그게 실제로 웹서비스가 동작하는데 있어서
훨씬 더 편하고, 간편하고,
또 그렇게 안하면 나중에 뭔가를 수정하고 싶을 때 문제가 많이 생겨요.
그래서 그렇게 많이들 해 둡니다.




Join의 종류
Left Join, Inner Join
(, Outer Join도 있는데 거의 필요가 없음. 위 2개만 잘 써도 원하는 결과 대부분 얻을 수 있을 것)
(Inner Join이 조금 더 쉽고, 많이 쓰임)

Left Join ?
왼쪽에 있는 거 기준으로 붙인다

Inner Join ?
교집합만 나온다.
(Null값이 있는 건 빼고 나온다)

select * from enrolleds e
inner join courses c on e.course_idd = c.course_id


! 알리아스는 안 헷갈려도 붙여주는 게 좋음.
(?왜인지는 안말함.)



select c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
group by c1.title, c2.week     //두가지 다 써서 최대한 다양한 그룹으로 묶음
order by c1.title, c2.week     //앞에거 먼저 정렬하고, 뒤에 거 정렬



select c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id //한 번 더 묶는다. 바로 앞에 거랑 묶음.
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week



1. sql은 같은 결과에 도달할 수 있는 방법이 여러가지예요. 정답이 하나가 아니다.
2. sql을 쓸 때 저도 마찬가지지만, 지금 계속 해나가는 과정이 그랬지만,
이렇게 해봤다가 또 저것도 확인했다가,
어 에러 나네, 고치고,
또 이렇게 콤마도 넣어 보고,
이렇게 왔다 갔다 왔다 갔다
하면서 만들면 되는 겁니다. 아셨죠?
그 누구도, 한 번에 쭉 위에서부터 써 가지고
탁 실행시켜서 '음 결과가 나왔군~' 이런 사람 없습니다 아셨죠

그래서 정말 심하게 말씀을 드리면
모로 가도 데이터만 나오면 된다
이렇게 일단 생각을 하시고
작업을 하셔도 무방합니다 아셨죠







left join
이런 경우에 많이 쓰겠죠.
한쪽에는 있는데 한쪽에는 없는 것을 가지고 통계내고 싶을 때

그러니, 더 큰 걸 왼쪽에 둠.

null을 찾는 거, null을 빼는 거
NULL은 대문자로 쓸 것

select u.name, count(*) as cnt from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is not NULL
group by u.name

!
count는 NULL을 제외하고 센다.

!
강의 3-7 끝에 정렬 내용 나옴.






Union
필드가 다 똑같은데, (필드명이 같다)
이어보고 싶을 때 씀.
(예를 들어, 7월달 것과 8월달 것)

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

! union에선 order by 가 안먹는다. (그래서 위에서 order by 두 줄을 빼도 결과 같음.)
(다 나온 다음에 order를 해야지, order를 한 상태로 합치는 건 안된다는 거예요.
그래서 다 나온 다음에 다시 한 번 정렬 순서를 주는 방법이 있습니다.) -> 4주차 서브퀴리 개념



클렌징
case when문을 써서
서브쿼리로 계속 써야

엑셀에서 해라






숙제: enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기. user_id도 같이 출력되어야 한다.



select e.enrolled_id, e.user_id, count(*) 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



숙제는 이렇게 나왔으니 시험문제면 
group by에
group by e.enrolled_id, e.user_id 든 group by e.enrolled_id 든 맞겠지만,

실제 업무에선 select문에 맞춰서 group by도 만들어야 함.

(enrolled_id는 내가 강의들을 때 부여받는 아이디)
여기선 enrolled_id로 그룹지어도 user_id가 중복이 되지 않겠지만,
그런 문제가 생길 수 있으니
실제 업무에선 select문에 맞춰서 group by도 만들어야 함.

'SQL' 카테고리의 다른 글

엑셀보다 쉬운 SQL - 문법 정리  (0) 2021.10.24
엑셀보다 쉬운 SQL - 후기  (0) 2021.10.24
엑셀보다 쉬운 SQL - 4주차  (0) 2021.10.24
엑셀보다 쉬운 SQL - 2주차  (0) 2021.10.24
엑셀보다 쉬운 SQL - 1주차  (0) 2021.10.24
Posted by 캬웃
,