Google BigQuery

[강의 수강 5일차] SELECT절 연습 문제 풀어보기 (2)

쭈경잉 2025. 5. 18. 13:53

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 쿼리 작성하는 흐름과 템플릿 관련 이해하기