left join과 inner join
SELECT * from users u
inner join point_users pu
on u.user_id = pu.user_id
맨 아래줄의 조건을 기준으로 교집합되는 것만 찾고 싶을 땐 inner join을 쓴다.
즉 위의 코드에서는 유저 아이디를 기준으로 교집합 되는 것만 찾는다.
유저스 테이블과 포인트 유저스 테이블 두가지가 있다고 치면 유저스 테이블이 유저 아이디의 양이 더 많은 테이블인데, 그중에서는 포인트 유저와 겹치는 아이디도 있고 아닌 아이디도 있다. 포인트가 없는 유저도 있기 때문이다.
그래서 포인트가 있는 유저들(겹치는 부분)만 기준으로 조인을 하면 이너조인,
포인트가 없어도 전체 유저 중에서 포인트가 있는 것은 따로 표시해주고 없는 건 null로 처리해주는 조인을 하면 레프트 조인이다.
그래서 이너조인은 교집합, 레프트조인은 합집합이다.
SELECT * from users u
left join point_users pu
on u.user_id = pu.user_id
틀린 그림 찾기
select * from checkins c
inner join courses c2
on c.course_id = c2.course_id
GROUP by course_id
자 위의 코드에서 틀린 것을 찾아보자!
정답은 ...
group by course id (X)
group by c.course_id
라고 해야 한다!
조인한 두 테이블 다 코스 아이디를 공통적으로 가지고 있기 때문에 어느 테이블의 코스아이디를 중심으로 그룹화할지를 지정해주지 않으면 컴터가 엥? 나 뭘로 그룹핑해? 라고 되묻는 오류를 만들어내기 때문이다.

그래서 제대로 된 코드는 아래와 같다.
select * from checkins c
inner join courses c2
on c.course_id = c2.course_id
GROUP by c.course_id
근데 만약에 과목별로 등록한 사람들의 개수를 세고 싶다면?
select c.course_id , c2.title , count(*) as cnt from checkins c
inner join courses c2
on c.course_id = c2.course_id
GROUP by c.course_id
결과는 아래와 같이 나온다.
그룹 바이를 하게 되면 카테고리 개수별로만 딱 나오기 때문에 두개만 나오고 그 두개 카테고리 안에 속한 쿼리가 몇갠지를 카운트로 세서 표현해줄 수 있는 것이다.
[ 많은 포인트를 얻은 순서대로 유저데이터 정렬해서 보기 ]
포인트 많은 순이니까 오더바이 포인트 를 한다음에 desc 을 해줘야겠지?
그리고 유저 데이터가 있는 유저스 테이블과 포인트 내용이 있는 포인트 유저스 테이블을 조인해줘야 한다.
자그럼 코드를 보자.
SELECT u.user_id, u.name, u.email, pu.point from point_users pu
inner join users u
on pu.user_id = u.user_id
order by pu.point desc
[ 네이버 이메일 사용하는 유저의 성씨별 주문 건수 보기 ]
where절 사용하여 네이버 이메일 쓰는 사람을 걸러주고,
성씨별 ~~ 이니까 그룹 바이 네임 해주고,
주문건수 봐야 하니까 카운트 해주면 된다.
SELECT u.name, u.email, count(*) as cnt from users u
inner join orders o
on u.user_id = o.user_id
where u.email like '%naver.com'
GROUP by u.name
ORDER by u.name
퀴즈 1 >>
- 라운드 함수 : 반올림 해주는 함수다. round(대상숫자, 자릿수)
select o.payment_method, count(*), round(avg(pu.`point`)) as avg from point_users pu
inner join orders o
on pu.user_id = o.user_id
group by o.payment_method
ORDER by avg(pu.point) desc
[ 퀴즈 2]
SELECT u.name , count(*) as cnt_name from enrolleds e
inner join users u
on u.user_id = e.user_id
where e.is_registered = 0
group by u.name
order by cnt_name DESC
[ 퀴즈 3 ]
select c.course_id , c.title , count(*) as cnt_notstarted from courses c
inner join enrolleds e
on c.course_id = e.course_id
where e.is_registered = 0
group by c.course_id