본문 바로가기

프로그래밍/개발일지

[스코클] 엑셀보다 쉬운 SQL - 3주차

728x90

take-away

1. 각 항목이 어느 테이블에 있는 지 잘 찾아보기
2. SQL은 각 답에 도달할 수 있는 다양한 방법이 있음 - 여기서 알려준것만 정답인건 아님
3. 다양하게 시도해보기 (한번에 답을 내려고 하지말고, 하나씩 순차적으로 입력값 넣고 출력해보기 반복)
4. 모로가도 데이터만 나오면 된다. 일단은...

5. 테이블의 정보를 제대로 파악하는 것이 우선이 되어야 할 것 같음 

6. 지금 잘 안되고 코드가 손에 익지 않더라도 계속 연습해보기

7. 괄호묶기, '.' 등 약속된 기호를 언제 넣고 언제 넣지 않아야 하는지 헷갈림 - 연습만이 살길!

 

1. 오늘 배울 것

1.1. join: 여러 정보를 한눈에 보기 

- 예시) 오늘의 다짐을 잘 쓰면 선물주기 (오늘의 다짐이 있는 테이블과 이름이 있는 테이블 매칭 필요)

1.2. 궁금점: 

- 왜 테이블을 나눠 놓는가? 하나의 테이블은 하나의 목적에 맞게 나눠 보관하기 (회원정보, 수강정보, 결제정보 등)

- 뭘로 두개의 테이블을 연결하나? 기준 필요 (e.g., user_id)

 

2. join을 사용하여 여러가지 연습 진행

2.1. Join이란? 여러 테이블을 연결

- 두테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결하여 한 테이블처럼 보기 (excel에서 vlookup 과 같은 기능)

2.2. Join의 종류: left join, inner join, out join (잘 안씀)

2.2.1. inner join (두 테이블이 공통적으로 갖고 있는 데이터만 합침- null발생하지 않음)

practice6. orders 테이블에 users 테이블 붙이기
- naver.com 이메일 사용하는 유저중 성씨 별 주문건수 세어보기
select u.name, count(*) as cnt from orders o 
inner join users u on o.user_id = u.user_id 
where o.email like '%naver.com'
group by u.name
-> 위 쿼리가 실행되는 순서: from - join - where - group by - select - count

다양한 테이블 붙이기 + 데이터 분석하기 연습문제를 풀어볼 수 있었다. 

2.2.2. left join (left join: 왼쪽 테이블 기준으로 오른쪽 테이블을 붙임, 한쪽이 기준이기 때문에 null이 생성됨)

- NULL 생성: Null 은 count함수를 써도 카운트가 안됨. 

2.3. 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
)
union ALL   #union에서는 order by 가 안 먹는다. order 넣을 필요 없음 why? 합친거에서 다시 order를 해야 함. (서브퀄)
(
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

* 질문: 세개 이상 union 한번에 가능 합니까? 

 

2.4. 숙제설명

- enrolled_id 별 수강완료 (done=1)한 강의 갯수를 세어보고, 완료한 강의 수가 많은 순서대로 정렬해보기. user_id도 같이 출력되어야 함.