SELECT [테이블 컬럼 ( 필드 ) ], [테이블 컬럼 ( 필드 ) ], ... FROM [TABLE1 명] JOIN(INNER JOIN, LEFT JOIN, OUTTER JOIN ..) [TABLE2 명] ON 절(join 조건절) WHERE 절 GROUP BY 절 ... ORDER BY [테이블 컬럼 (필드)] (DESC, ASC), ...
join문은 내가 조회하고자하는 내용이 2개의 테이블에 존재할 때, 사용한다.
먼저 on 절에 두개의 테이블이 어떠한 관계로 연결을 지어주어 테이블을 합칠 것인지를 정해준다.
sql의 실행순서를 한번 정리해보자
sql 실행순서
from + join (어떤 테이블에서)
▶ on + where(어떤 조건을 가지고 <filter>)
▶ group by (무엇을 기준으로 묶어서)
▶ select (조회할 것인지)
▶ order by (무엇을 기준으로 순서를 정해서)
풀어보기 enrolled_id별 수강완료(done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기. user_id도 같이 출력되어야 한다.
SELECT * FROM enrolleds ;
>> enrolled_id로 두 테이블이 묶여 있는 걸을 확인 여기에는 user_id도 존재한다!
SELECT * FROM enrolleds_detail ;
>> done 에 대한 내용은 enrolleds_detail 에 존재한다.
SELECT e.enrolled_id, e.user_id , count(ed.done) AS max_count FROM enrolleds_detail ed INNER JOIN enrolleds e ON e.enrolled_id = ed.enrolled_id GROUP BY e.enrolled_id;
>> 현재 enrolled_id별로 count 되어 나온다. 하지만 여기에는 done 값이 0, 1 모두 포함되어 있다!
SELECT e.enrolled_id, e.user_id , count(ed.done) AS max_count FROM enrolleds_detail ed inner JOIN enrolleds e ON e.enrolled_id = ed.enrolled_id WHERE ed.done = 1 GROUP BY e.enrolled_id ORDER BY max_count DESC;
결과 도출 완료!
union 문
( [테이블 조회내역] ) UNION ALL ( [테이블 조회내역] )
동일한 FIELD를 가진 테이블 두개를 단순히 붙이고 싶다면?
이럴 때, 사용하는 것이 UNION 문법이다.
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; >> 7월에 대한 반별 수강평 갯수
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; >> 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; )