Join
1) Join이란?
: 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
2) join의 종류
- left join (첫번째 원에 붙이는 것!- left join은 어디에 뭐를 붙일건지 순서가 중요함)
어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있음.
- inner join(교집합)
여기서는 비어있는 필드가 있는 데이터가 없음
두 테이블에서 모두 가지고 있는 데이터만 출력했기 때문
3) SQL 쿼리가 실행되는 순서(예시)
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id
위 쿼리가 실행되는 순서: from → join → select
- from enrolleds: enrolleds 테이블 데이터 전체를 가져옵니다.
- inner join courses on e.course_id = c.course_id: courses를 enrolleds 테이블에 붙이는데, enrolleds 테이블의 course_id와 동일한 course_id를 갖는 courses의 테이블을 붙입니다.
- select * : 붙여진 모든 데이터를 출력합니다.
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
위 쿼리가 실행되는 순서: from → join → where → group by → select
- from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
- inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)
- where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
- group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
- select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.
➡️ Join의 실행 순서는 항상 from 과 붙어다닌다고 생각하면 편해요!
Union 배우기
- Select를 두 번 할 게 아니라, 한번에 모아서 보고싶은 경우
(대신 조건이 있어요! 노란색과 파란색 박스의 필드명이 같아야 한답니다.)
- union 예시
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
위 서식을 아래 그림처럼 만들기
우선, 'month'를 붙여줘야함
다음으로
union all 붙여주기!
(
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
)
위 서식처럼 하면 완성!
'스파르타코딩 SQL' 카테고리의 다른 글
SQL 4주차 (0) | 2023.02.17 |
---|---|
SQL 2주차 (0) | 2023.02.16 |
SQL 1주차 (0) | 2023.02.14 |