정리

26 TIL 정리 (SQL-Read)

모_아이 2022. 5. 25. 00:11

정리 -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