카테고리 없음

엑셀보다 쉬운 SQL - 3주차 (개발일지)

mo_noon 2021. 10. 30. 22:31
728x90
반응형

여러 테이블을 연결해보자: Join

  • Join이란? 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미

SQL의 Join은 엑셀의 vlookup과 동일

 

 

  1. Join의 종류: Left Join, Inner Join
  • Left Join : A 데이터의 키값을 기준으로 B데이터를 연결 (값이 비어있거나 맞지 않을 수 있음) 
  • Inner Join : A 데이터와 B 데이터의 합집합을 키값으로 연결

 

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

 

  1. from orders o: orders 테이블 데이터 전체를 가져오고 o라는 별칭을 붙입니다.
  2. inner join users u on o.user_id = u.user_id : users 테이블을 orders 테이블에 붙이는데, orders 테이블의 user_id와 동일한 user_id를 갖는 users 테이블 데이터를 붙입니다. (*users 테이블에 u라는 별칭을 붙입니다)
  3. where u.email like '%naver.com': users 테이블 email 필드값이 naver.com으로 끝나는 값만 가져옵니다.
  4. group by u.name: users 테이블의 name값이 같은 값들을 뭉쳐줍니다.
  5. select u.name, count(u.name) as count_name : users 테이블의 name필드와 name 필드를 기준으로 뭉쳐진 갯수를 세어서 출력해줍니다.

Join의 실행 순서는 항상 from 과 붙어다닌다

 

 

 

결과물 합치기! Union

Select를 두 번 할 게 아니라, 한번에 모아서 보고싶은 경우

(필드명 맞춰주고, 사이에  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

)

728x90
반응형