도시 인구를 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는 중복 제거할 때만 — 그냥 남용하지 않기
'국비지원 - 실버마케팅(코딩) 250206~' 카테고리의 다른 글
| 🔧 SQL로 배우는 CRUD - 데이터베이스의 기본 (1) | 2025.05.15 |
|---|---|
| 🎯 SQL 문제를 푸는 ‘생각 흐름’ 정리 (3) | 2025.05.14 |
| 💻 MySQL 기본 정리 – 데이터 조회부터 집계까지 (1) | 2025.05.13 |
| MySQL Workbench에서 자료 불러오고 조건 조회하는 법 (SQL 기초 완전 정리) (2) | 2025.05.13 |
| 데이터베이스와 ERD 개념 완전 정리 (입문자를 위한 MySQL 기초) (2) | 2025.05.13 |