🎯 SQL 문제를 푸는 ‘생각 흐름’ 정리

 

💡 1단계: 요구 조건을 말로 잘게 쪼개기

먼저 문제를 "프로그래밍 언어"가 아니라 사람의 언어로 잘게 나눠서 이해해야 해요.
예:

“공용어가 영어 또는 프랑스어인 나라의 수를 언어별로 조회”

 

→ 이걸 아래처럼 나눠서 생각해요:

  1. 대상 테이블은 어디? → countrylanguage
  2. 조건: 언어가 영어 또는 프랑스어 (language IN (...))
  3. 조건: 공용어여야 함 (IsOfficial = 'T')
  4. 세야 할 것: 나라 수 (COUNT(DISTINCT CountryCode))
  5. 그룹 기준: 언어별 (GROUP BY Language)

 

🧠 2단계: 필터링 조건과 그룹화 대상 구분하기

  • WHERE절은 "먼저 데이터에서 걸러내는 조건"
  • GROUP BY는 "걸러낸 데이터를 어떤 기준으로 묶을지"
  • SELECT는 "묶인 그룹에서 뭘 보여줄지"

이 순서를 기억하세요:
👉 WHERE → GROUP BY → SELECT

 

🧩 3단계: 각 요소를 SQL 구문으로 치환하기

위의 말들을 바로 SQL로 바꿔봅니다:

✅ 최종 SQL:

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

 

🪄 팁: 문제 읽을 때 이렇게 떠올려보세요

"무엇을 보여주려고 하지?"
→ 보여줄 컬럼이 SELECT에 들어가요
"어떤 조건으로 걸러야 하지?"
→ WHERE 절에 들어가요
"어떤 기준으로 묶어야 하지?"
→ GROUP BY 절에 들어가요
"묶은 결과에서 무엇을 계산해야 하지?"
→ SELECT 안의 COUNT, SUM 등 집계함수

 

📌 연습용 사고 흐름 예제

"2000년 이후 독립한 나라들 중 정부 형태가 공화국인 나라 수"

  • 테이블? → country
  • 조건? → IndepYear > 2000 AND GovernmentForm LIKE '%Republic%'
  • 세야 할 것? → 나라 수 → COUNT(*)
SELECT COUNT(*) 
FROM country
WHERE IndepYear > 2000
  AND GovernmentForm LIKE '%Republic%';

 

🏁 요약: SQL 잘 하려면?

 

그럼 위에서 설명한 생각 흐름 훈련법을 기반으로, 점점 난이도가 올라가는 실전 연습문제 5개를 준비했어요.

 

🧩 연습 문제 1: 기본적인 그룹화

문제 1.
도시(city) 테이블에서 도시들의 인구를 500만 단위로 나누어(FLOOR) 그룹화하고, 각 그룹에 해당하는 도시 수를 구하세요.
결과 컬럼은 pop_group, city_count로 출력하세요.

👉 힌트: Population을 500만으로 나눔, GROUP BY는 나눈 값

 

🧩 연습 문제 2: 조건 있는 그룹화

문제 2.
country 테이블에서 인구(Population)가 1,000만 명 이상인 나라들만 대상으로 대륙(Continent)별 나라 수를 구하세요.
결과 컬럼은 Continent, country_count로 출력하세요.

👉 힌트: WHERE에서 인구 조건 먼저 걸고 GROUP BY Continent

 

🧩 연습 문제 3: 집계함수와 DISTINCT

문제 3.
countrylanguage 테이블에서 공용어(IsOfficial = 'T')로 등록된 언어 중, 언어별로 몇 개의 서로 다른 나라(CountryCode)에서 사용되는지 구하세요.
결과 컬럼은 Language, country_count로 출력하세요.

👉 힌트: COUNT(DISTINCT CountryCode), GROUP BY Language

 

🧩 연습 문제 4: 그룹 후 조건 필터(HAVING)

문제 4.
city 테이블에서 나라별(CountryCode)로 도시 수를 구하되, 도시가 50개 이상인 나라만 결과에 포함시키세요.
결과 컬럼은 CountryCode, city_count로 출력하세요.

👉 힌트: GROUP BY CountryCode → HAVING COUNT() >= 50*

 

🧩 연습 문제 5: 실전형 조합

문제 5.
countrylanguage 테이블에서 영어 또는 프랑스어가 공용어로 지정된 나라 수를 언어별로 구하세요.
결과 컬럼은 Language, country_count로 출력하세요.

👉 힌트: WHERE Language IN (...) AND IsOfficial = 'T', COUNT(DISTINCT CountryCode)

 

📝 이렇게 푸는 연습 해봐요

모든 문제에 대해 먼저:

  • 📌 "어떤 기준으로 묶고"
  • 📌 "무엇을 세고"
  • 📌 "필터는 언제 하고"
    이런 흐름을 종이에 적어본 뒤 SQL로 바꿔보는 걸 추천해요.

여러분도 각자 풀어보세요. 이후 답도 나와있습니다.

 

내가 푼 답을 기준으로 피드백된 부분을 적어놓겠습니다.

✅ 문제 1

SELECT FLOOR(Population / 5000000) AS POP, COUNT(*) FROM CITY
GROUP BY POP;

✔️ 완벽합니다! FLOOR로 500만 단위 그룹화했고, GROUP BY도 잘 썼어요.
💡 팁: AS POP보다는 AS pop_group처럼 좀 더 의미 있는 별칭 쓰면 가독성이 좋아져요.

 

✅ 문제 2

SELECT continent, count(country) as countcon FROM COUNTRY
WHERE Population >= 10000000
GROUP BY continent;

⚠️ 거의 맞지만, COUNT(country)는 country 컬럼에 중복이 없을 경우만 정확해요.
→ 보통은 COUNT(*) 또는 COUNT(Code)를 써요. (이 테이블에서 나라 식별자는 Code)

 

✅ 수정 추천:

SELECT Continent, COUNT(*) AS country_count 
FROM Country 
WHERE Population >= 10000000 
GROUP BY Continent;

 

✅ 문제 3
SELECT Language, count(countrycode) as countcon FROM countrylanguage
WHERE IsOfficial = "T"
GROUP BY Language;

⚠️ 거의 맞지만, count(countrycode)는 중복된 나라가 포함될 수 있어요.
→ 예: 어떤 언어가 같은 나라 코드에 2번 있으면 2로 세어짐.

✅ 요구 조건은 **‘서로 다른 나라 수’**니까:

SELECT Language, COUNT(DISTINCT CountryCode) AS country_count 
FROM CountryLanguage 
WHERE IsOfficial = 'T' 
GROUP BY Language;

 

✅ 문제 4
SELECT CountryCode, count(countrycode) as countcon FROM city
GROUP BY CountryCode
HAVING countcon >= 50;

⚠️ 쿼리는 거의 맞았어요!
다만 HAVING countcon >= 50에서 **별칭(countcon)**은 HAVING 절에서는 일부 DBMS에서 작동 안 함.

✅ 안전한 방식 (가장 호환성 좋음):

SELECT CountryCode, COUNT(*) AS city_count 
FROM City 
GROUP BY CountryCode 
HAVING COUNT(*) >= 50;

 

✅ 문제 5

SELECT Language, count(DISTINCT CountryCode) FROM countrylanguage
WHERE IsOfficial = "T"
AND Language IN ("English", "French")
GROUP BY Language
ORDER BY Language;

 

👏 정확하게 정답입니다!

  • 조건도 정확히 맞췄고,
  • DISTINCT CountryCode도 잘 썼고,
  • 정렬까지 완벽합니다.

🔍 전체 총평

 

🎯 다음 단계 추천

  • GROUP BY 안 헷갈리게 하려면 항상 "무엇을 기준으로 묶고", "무엇을 세는가" 를 말로 먼저 정리해보세요.
  • DISTINCT, HAVING, FLOOR 같은 키워드는 따로 써서 작은 실습도 해보는 게 좋아요

+ Recent posts