-
MySQL - SELECT(3주차)DB 2023. 6. 2. 14:49728x90
수업내용
- join 문
- union
join 문
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;
)
'DB' 카테고리의 다른 글
index - mysql (0) 2023.08.13 MySQL - SELECT(4주차) (0) 2023.06.02 MySQL - SELECT(2주차) (0) 2023.06.02 MySQL - SELECT(1주차) (0) 2023.06.01