정리 -2 ( https://mo-i-programmers.tistory.com/60 )
Join
두 테이블의 공통된 정보 (key값)을 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
-Left Join // A 와 B는 각각의 테이블
-Inner Join
-inner join부터
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id; //course_id 값으로 서로 join
실행 되는 순서 : from >> join >> select
1. enrolleds 테이블 데이터 전체를 가져온다. (enrolleds)
2. courses를 enrolleds테이블에 붙인다. enrolleds 테이블의 course_id와 동일한 course_id를 갖는 courses의 테이블을 붙인다.(inner join coures on e.course_id = c.course_id)
3. 붙여진 모든 데이터를 출력한다. (select *)
※항상 from에 들어간 테이블을 기준으로, 다른 테이블이 붙는다고 생각
-SQL 쿼리가 실행되는 순서
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 >> gorup by >> select
1. orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙임 ( orders o)
2. users 테이블을 orders 테이블에 붙임, orders 테이블의 user_id와 동일한 user_id를 가지는 users 테이블 데이터를 붙임(users 테이블에 u라는 별칭을 붙임)// inner join users u on o.user_id = u.user_id
3. users테이블 email 필드값이 naver.com으로 끝나는 값만 가져옴 (where u.email like '%naver.com')
4. users 테이블의 name필드와 name필드를 기준으로 뭉쳐진 개수를 세어 출력 ( select u.name, count(u.name) as count_name )
-Left Join
select * from users u
left join point_users pu on u.user_id = pu.user_id // point_users를 users에 붙인다.
유저중에, 포인트가 없는 사람 = is NULL, is not NULL
select name, count(*) from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is NULL
group by name
select name, count(*) 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 name
※count 는 null을 세지 않음
-Union
(
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
)
union을 사용하면 내부정렬이 먹지 않는데 서브쿼리를 사용
'정리' 카테고리의 다른 글
27 TIL 정리 (서버리스 프론트엔드) (0) | 2022.05.25 |
---|---|
26-2 TIL 정리 (SQL subquery) (0) | 2022.05.25 |
25 TIL 정리 (SQL-Read) (0) | 2022.05.24 |
23 TIL 정리(GCP-가상머신) (0) | 2022.05.19 |
22 TIL 정리 (java 객체지향) (0) | 2022.05.18 |