SQL 실전, 문제를 풀어보면서 이해하는 시간을 가져보기
이와 더불어 실무 쿼리를 이해할 때 조건 & 테이블 구조 탐색하며 이해해보면 좋을 것 같다.
✏️ 실무 데이터 테이블을 확인할 때는 어떤 데이터가 왜? 어떤 목적 때문에 수집되어왔는 지를 파악하면 좋다.
1. 포켓몬 중에 type 2가 없는 포켓몬의 수를 작성하는 쿼리를 작성해주세요.
✅ 힌트 : ~가 없다 = 컬럼 IS NULL
✔️ 조건 : type 2가 없는
➡️ type 2가 어떻게 생겼을까? type 2의 정의는 무엇일까를 우선적으로 생각해봐야 한다.
✅ NULL 이란 ? 아무것도 없는 값, 값이 존재하지 않을 때 NULL 이라고 한다.
이때, NULL은 0과 ""랑은 다르고 값이 없는 상태를 말한다.
✔️ type2 IS NULL 만 가능하고 > type2 = null은 불가능하다.
➡️ NULL은 다른 값과 직접 비교(=)가 불가능하기 때문, 거짓이 아닌 알 수 없음의 결과이다.
따라서 IS / IS NOT 활용해야 함
✅ 쿼리 조건
- 어떤 테이블 ? 포켓몬
- 어떤 컬럼 ? 별도로 정해진 건 없다 > 포켓몬의 수만 남기면 된다
- 어떻게 집계 ? 포켓몬의 수 count
- where 절에서 여러 조건 연결하고 싶은 경우, AND 연산자 활용 / OR 조건 -> ( ) OR ( )
* OR 조건의 경우, 이후 연산 조건을 위해 () 괄호 표기하는 것을 습관화하기
select
count(id) as cnt
FROM basic.pokemon
WHERE
type2 is NULL
✏️ 문제를 작성할 때 쿼리 조건과 테이블 탐색을 필수적으로 하자! 익숙해질 때까지 하면 좋다.
2. type2 가 없는 포켓몬의 type1과 type1의 포켓몬 수를 알려주는 쿼리를 작성해주세요.
단, type 1의 포켓몬 수가 큰 순으로 정렬해주세요.
✅ 집계 함수는 GROUP BY와 묶인다. 집계하는 기준(컬럼)이 없으면 COUNT만 쓸 수 있으나,
집계하는 기준이 있다면 그 기준 컬럼을 GROUP BY에 써줘야 한다.
✔️ type 1값과 그 수를 구하고 싶을 때, GROUP BY 필수로 작성해줘야 한다.
➡️ 그룹화된 결과를 묶어서 보여주어야 하기에 필수적으로 작성해주는 것 잊지 말기
✅ 쿼리 조건
- 어떤 테이블 ? 포켓몬
- 어떤 컬럼 ? id, type1 포켓몬 수
- 어떻게 집계 ? type1 포켓몬 수 count
- where 절 : type2 IS NULL
- 정렬 : order by type1 desc
select
type1,
count(id) as cnt
FROM basic.pokemon
WHERE
type2 is NULL
GROUP BY
type1
ORDER BY
count(id)
3. type2 상관없이 type1의 포켓몬 수를 알 수 있는 쿼리를 작성해주세요.
✅ 쿼리 조건
- 어떤 테이블 ? 포켓몬
- 어떤 컬럼 ? type1 포켓몬 수
- 어떻게 집계 ? type1 포켓몬 수 count
- 조건 ? type2 상관없이 => 조건일까? 아닐까? 조건이 아닐 수 있다.
이 부분은 실무에서 데이터 요청에 따라 고민해보면 좋을 부분!
- 정렬 : order by type1 desc
SELECT
type1,
COUNT(id) AS pokemon_cnt,
COUNT(DISTINCT id) AS pokemon_cnt2
FROM basic.pokemon
GROUP BY
type1
✅ DISTINCT 언제 쓸까? 고유한 값만 보고 싶을 때 사용 = unique한 값만 알고 싶은 경우
✔️ count(id) = count(DISTINCT id)는 똑같을 경우가 많다. id 값 자체가 고유한 값이기 때문
➡️ 데이터 구조를 짤 때, id는 기본적으로 중복 없게 설계하지만 그렇지 않은 경우도 있긴 하기에 확인해볼 필요가 있다.
✏️ DISTINCT 의 주요 활용 : DAU 계산, 사람 수 기준으로 볼 때 활용하는 듯하다. 체크해두기!
✅ DAU(Daily Active User) : Active 한 유저의 수를 하루 단위로 집계
✔️ COUNT(DISTINCT user_id) AS DAU : 접속 기록 저장하는 테이블, 이벤트 로그가 여러 raw 존재할 것 => unique 유저 수 집계해야 함(DISTINCT 활용)
✏️ 이번 강의와 학습을 통해 느낀점
✅ 짧고 굵게 SQL 연습 문제 3개 완료! 연습 문제를 풀 때 조건들에 대해서 고민해보고 왜 그러한 조건을 짰는 지에 대해서 생각해보는 과정을 거치면 좋을 것 같다.
✅ 확실히 연습 문제를 풀 때, 실무와 맞닿아서 생각하고 이 쿼리를 왜 보고 싶은 지, 무엇을 보기 위함인 지, 어떤 문제를 풀 지에 대해서 생각하면서 보다 보니 더 유용하게 활용이 되는 듯 하다.
💪🏻 Next to do
☑️ 집계를 통해 간단 추출하기 & 연습 문제를 통해 select절 익숙해지기 반복!
☑️ 실무 쿼리를 볼 때 왜 이렇게 짰을까? 어떤 걸 보고자 했지? 고민해보기
'Google BigQuery' 카테고리의 다른 글
| [강의 수강 6일차] SELECT절 연습 문제 풀어보기 (3) (0) | 2025.05.21 |
|---|---|
| [강의 수강 5일차] SELECT절 연습 문제 풀어보기 (2) (0) | 2025.05.18 |
| [강의 수강 3일차] 집계(Group by, having, sum/count) (0) | 2025.05.08 |
| [강의 수강 2일차] select 절 이해하기 (0) | 2025.05.05 |
| [강의 수강 1일차] 인프런 초보자를 위한 구글 BigQuery 입문하기 (0) | 2025.05.04 |