SQL 실전, 문제를 풀어보면서 이해하는 시간을 가져보기 2번째
짧고 굵게나마 짬을 내서 공부하는 시간을 자주 가져보기 목표..!
일주일에 3번, 30분 이상은 시간을 투자하기로 마음 먹었다.
✏️ 조건들을 파악할 때 왜 그 조건이지? 생각해보는 과정이 필요하다.
✏️ 쿼리 작성할 때 쿼리 작동 흐름 / 조건들을 파악하기 위해 흐름을 잡아 연습할 필요가 있다.
✔️ 어떤 테이블? FROM > 어떤 그룹? GROUP BY > 어떤 컬럼? SELECT, 어떤 집계? COUNT > 어떤 조건 ? WHERE
4. 전설 여부에 따른 포켓몬 수를 알 수 있는 쿼리를 작성해주세요
✅ 힌트 : 전설 여부
✔️ 조건 : 없음
➡️ 전설 여부에 따른 이기 때문에 조건 필터링이 아닌 group별로 보는 게 필요하다.
✅ 쿼리 조건
- 어떤 테이블 ? 포켓몬
- 어떤 컬럼 ? 전설 is.legendary
- 어떻게 집계 ? 포켓몬 수 count
SELECT
is.legendary,
--컬럼의 이름 앞부분 일부를 입력하고 기다리면 자동 완성 할 수 있음 > 찾아서 엔터
COUNT(id) AS pokemon_cnt
FROM basic.pokemon
GROUP BY
is.legendary
✅ ORDER BY 사용 Tip
GROUP BY : is_legendary가 길다. GROUP BY에는 컬럼이 많을 수 있음(5개 +COUNT)
GROUP BY 1 => SELECT의 조회된 첫 컬럼 의미함
ORDER BY에도 1, 2 등을 사용할 수 있음
✏️ 단, 1,2는 쿼리를 빠르게 작성하고 결과를 보는 과정에서 활용하면 좋고 완성된 쿼리문에서는 1, 2 표현보다
업무 협업과 가독성을 위해 명확하게 컬럼을 명시하는 편이 좋다.
5. 동명 이인이 있는 이름은 무엇일까요?
✅ 쿼리 조건
- 어떤 테이블 ? trainer
- 조건 ? 같은 이름이 2개 이상(동명이인) => count(name) : 2개 이상
- 어떤 컬럼 ? 이름
- 어떻게 집계 ? 이름 count
✅ WHERE절 : 원본 데이터 FROM 절에 있는 데이터에 조건을 설정하고 싶은 경우
✔️ WHERE절 활용하고 싶을 경우, 서브 쿼리 개념을 활용하면 된다.
✅ HAVING : GROUP BY와 함께 집계 결과에 조건을 설정하고 싶은 경우
➡️ 이 경우에는 2가지 case 모두 가능하다!
(*단 having이 가독성이나 쿼리를 줄일 수 있다는 장점이 있음)
-- having 절 활용 case
SELECT
name,
COUNT(name) AS trainer_cnt
FROM basic.trainer
GROUP BY
name
-- 집계 후 조건 => HAVING, FROM 절의 테이블 조건 => WHERE
HAVING
trainer_cnt >= 2
-- 서브 쿼리 활용 case
SELECT
*
FROM (
select
name,
count(name) AS trainer_cnt
FROM basic.trainer
GROUP BY
name
)
WHERE
trainer_cnt >= 2
6. trainer 테이블에서 "Iris" 트레이너의 정보를 알 수 있는 쿼리를 작성해주세요
✅ 쿼리 조건
- 어떤 테이블 ? trainer
- 어떤 컬럼 ? 모든 정보 => 모든 컬럼
- 어떻게 집계 ? X
- 조건 ? 트레이너 이름 = Iris
SELECT
*
FROM basic.trainer
WHERE
name = "Iris"
7. trainer 테이블에서 "Iris", "Whitney", "Cynthia" 트레이너의 정보를 알 수 있는 쿼리를 작성해주세요
✅ 쿼리 조건
- 어떤 테이블 ? trainer
- 어떤 컬럼 ? 모든 정보 => 모든 컬럼 *
- 어떻게 집계 ? X
- 조건 ? 트레이너 이름 in ("Iris", "Whitney", "Cynthia")
✔️ IN 조건을 활용해 같은 컬럼 내에서 추출하고 싶은 case만 표기할 수 있다.
ex. 재구매 회차별 3, 4, 5회만 뽑고 싶다면? 이러한 방식으로 뽑으면 될 것
# 조건 나열한 쿼리 작성 case
SELECT
*
FROM basic.trainer
WHERE
(name = "Iris")
OR (name = "Cynthia")
OR (name = "Whitney")
# 조건 간결하게 사용할 경우 IN => 특정 컬럼에 있는 괄호 안의 value가 있는 raw 추출
# OR 조건으로 쓰는 거 너무 길고 귀찮음
SELECT
*
FROM basic.trainer
WHERE
name IN ("Iris", "Cynthia", "Whitney")
8. 전체 포켓몬 수는 얼마나 되나요?
✅ 쿼리 조건 -> 집계만 하면 됨
- 어떤 테이블 ? pokemon
- 어떤 컬럼 ? 없음
- 어떻게 집계 ? count
- 조건 ? 없음
SELECT
COUNT(id) AS pokemon_cnt
-- Unrecogmized name: name at [162:9] -> 컬럼 이름에 오타일 가능성 있음
-- 컬럼 이름이 kor_name 인 데, name 으로 쓸 경우 정확하게 인지하지 못해 추출하기 어려움
FROM basic.pokemon
9. 세대(generation) 별로 포켓몬 수가 얼마나 되는 지 알 수 있는 쿼리를 작성해주세요
✅ 쿼리 조건 -> 그룹별 집계
- 어떤 테이블 ? pokemon
- 어떤 컬럼 ? generation, cnt
- 어떻게 집계 ? count
- 조건 ? 없음
- 세대별 그룹핑하는 것이 point
SELECT
generation,
count(id) as cnt
FROM basic.pokemon
GROUP BY
generation
오늘 풀었던 문제들은 모두 비교적 간단한 쿼리였던 것 같고
Having절은 놓치고 있었던 부분인 데 그룹하여 조건을 걸 때 필요한 부분이라는 점을 기억해두면 좋을 것 같다.
예를 들어 재구매한 사람들의 재구매 매출액을 구한다고 하면
일단 구매건수에 따라 group by하여 그룹핑해준 뒤에
having 절에 따라 구매회차 2인 사람을 묶고 그들의 sum을 구하는 방식이면 될 듯!
having도 쿼리를 간결하게 짜는 데 도움될 수 있으니 알아두면 좋을 것 같다.
✏️ 이번 강의와 학습을 통해 느낀점
✅ 짧고 굵게 SQL 연습 문제 6개 완료! 연습 문제를 풀면서 이 케이스는 현업에서 어떤 케이스가 있을 지 확장해서 생각해보면 좋을 것 같다는 생각을 했다.
✅ 복잡해질 수록 더 직관적이고 간결하게 쿼리를 작성하는 것을 연습하면 좋을 것 같다.
💪🏻 Next to do
☑️ 집계를 통해 간단 추출하기 & 연습 문제를 통해 select절 익숙해지기 3번째 문제 풀기
☑️ 섹션 4, SQL 쿼리 작성하는 흐름과 템플릿 관련 이해하기
'Google BigQuery' 카테고리의 다른 글
| [강의 수강 7일차] SQL 쿼리 잘 작성하기, 쿼리 템플릿 (0) | 2025.05.24 |
|---|---|
| [강의 수강 6일차] SELECT절 연습 문제 풀어보기 (3) (0) | 2025.05.21 |
| [강의 수강 4일차] SELECT절 연습 문제 풀어보기 (1) (0) | 2025.05.14 |
| [강의 수강 3일차] 집계(Group by, having, sum/count) (0) | 2025.05.08 |
| [강의 수강 2일차] select 절 이해하기 (0) | 2025.05.05 |