도시 인구를 100만 단위로 나누어 그룹화하고, 각 그룹의 도시 수를 구하세요.

SELECT floor(population / 1000000) AS MILLION_CITY, COUNT(name) as count_city FROM city
group by million_city
order by million_city;

 

공용어가 영어 또는 불어인 나라의 수를 언어별로 구하세요.

SELECT Language, count(countrycode) from countrylanguage
WHERE Language IN ("English", "French")
AND IsOfficial = "T"
group by Language;

 

📍당신이 공통적으로 약한 부분 2가지

1. 그룹화 기준(GROUP BY)을 결정하는 사고 흐름이 불안정함

  • ✅ 그룹화는 “어떤 기준으로 묶을 것인가?”에 대한 결정이에요.
  • ❌ 그런데 두 문제에서 "무엇을 기준으로 묶어야 하는지" 정확히 잡지 못하고,
  • SELECT에 너무 많은 걸 넣거나 헷갈린 부분이 있어요.

예시 1: 도시 인구 문제

  • “인구를 100만 단위로 묶는다” → → → FLOOR(Population / 1000000)
  • 그럼 그룹 기준은? 이 FLOOR값이죠.
  • 그런데 당신은 GROUP BY name으로 잘못 묶었어요. (name은 도시 이름이니까 전부 다 다름)

 

예시 2: 언어 문제

  • “언어별로 나라 수” → 그룹화 기준은 Language 하나뿐인데,
  • SELECT에 CountryCode, IsOfficial 등 여러 값을 같이 넣어서 혼란이 생겼고, 중복 쉼표 등의 실수도 생겼어요.

 

2. 집계 함수(COUNT, SUM, 등)의 정확한 역할을 헷갈림

  • ❌ COUNT를 여러 컬럼에 쓰려고 하거나 (COUNT("English", "French"))
  • ❌ DISTINCT가 왜 필요한지 불명확하거나
  • ❌ GROUP BY에 안 묶인 컬럼을 SELECT에 넣으려다 에러가 나기도 했어요

👉 이는 집계 함수와 그룹화 개념이 따로따로가 아니라 '세트'로 작동한다는 감각이 아직 몸에 안 붙었기 때문이에요.

 

🔍 핵심 사고 훈련 방법

 

 

두 문제의 정답 흐름 다시 정리

1. 도시 인구를 100만 단위로 나누어 도시 수 구하기

SELECT 
  FLOOR(Population / 1000000) AS pop_group,
  COUNT(*) AS city_count
FROM city
GROUP BY pop_group;

 

→ 핵심 사고: 인구를 100만 단위로 나누고, 그 값으로 그룹핑한 다음, 각 그룹의 도시 수 세기

→ FLOOR(Population / 1000000)를 쓴 이유는 인구수를 100만 단위로 '버림하여' 그룹화하기 위해서입니다.

 

✅ FLOOR(Population / 1000000)의 의미

예시로 이해해보자:

📌 왜 FLOOR를 쓰는가?

  • FLOOR()는 소수점 이하를 버리는 함수예요.
  • 우리가 원하는 건 100만 단위 그룹화니까,
    → 그냥 나누기만 하면 2.345, 8.9 같은 소수점이 남아서 GROUP BY로 정확하게 묶을 수가 없어요.
  • FLOOR를 씌우면
    → 0, 1, 2, 3, ... 같은 정수 단위 그룹핑이 가능해집니다.

📌 만약 FLOOR를 안 쓰면?

SELECT 
  (Population / 1000000) AS pop_group, 
  COUNT(*) 
FROM city
GROUP BY (Population / 1000000);

→ 결과가 너무 세분화돼서 거의 모든 도시가 다른 그룹으로 묶일 거예요.
예: 2.345678, 2.789321, 2.99999는 서로 다름.

 

결론

FLOOR(Population / 1000000)는 비슷한 인구 범위를 가진 도시들을 하나의 그룹으로 묶기 위해서 사용하는 필수적인 수단이에요.

 

 

2. 영어/불어 공용어 나라 수 언어별로 구하기

SELECT 
  Language, 
  COUNT(DISTINCT CountryCode) AS country_count
FROM countrylanguage
WHERE Language IN ('English', 'French') 
  AND IsOfficial = 'T'
GROUP BY Language;

→ 핵심 사고: 언어가 영어/불어이고 공용어인 행들만 필터링언어별로 그룹핑중복 없는 나라 수 세기

 

🎯 추천 훈련법

 

  • “어떤 그룹으로 묶고, 뭘 셀까?” 문장으로 먼저 써보고 SQL로 바꾸기
  • SELECT문은 최소한으로 시작해서, 헷갈리면 SELECT 그룹 기준, COUNT(*)처럼 단순하게 짜기
  • GROUP BY에 없는 컬럼은 SELECT에 넣지 않는다 (집계함수로 감싸지 않으면 에러)
  • DISTINCT는 중복 제거할 때만 — 그냥 남용하지 않기

 

 

+ Recent posts