SQL

[SQL/프로그래머스 LV.3] 헤비 유저가 소유한 장소

jy9892 2025. 1. 16. 16:00
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/77487

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SQL에서 그룹화와 서브쿼리를 활용한 데이터 필터링: 사례 분석

1. 문제 상황: 데이터 필터링 오류

SQL에서 GROUP BY와 HAVING을 활용해 특정 조건에 맞는 데이터를 추출하려고 했으나, 작성한 쿼리가 제대로 작동하지 않았습니다. 아래는 처음 작성한 쿼리입니다:

 

SELECT *
FROM (
    SELECT *
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
)



SELECT ID, NAME, HOST_ID
FROM (
    SELECT HOST_ID, COUNT(HOST_ID) AS HOST_COUNT, NAME, ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
) AS HEAVY

 

2. 오류 원인

  1. GROUP BY와 SELECT *의 문제:
    • GROUP BY는 그룹화 기준(HOST_ID) 및 집계 함수(COUNT(HOST_ID))로 데이터를 반환합니다.
    • 하지만 SELECT * 또는 SELECT ID, NAME, HOST_ID와 같이 다른 열을 함께 선택하려면, 그룹화되지 않은 열을 반환할 수 없으므로 SQL 문법상 오류가 발생합니다.
  2. 의도와 실행의 불일치:
    • 위 쿼리는 HOST_ID를 기준으로 그룹화된 데이터에서 ID, NAME, HOST_ID를 모두 가져오고자 했지만, 그룹화되지 않은 열(ID, NAME)은 쿼리에 포함할 수 없습니다.
  3. 올바른 결과를 위한 JOIN 필요성:
    • 그룹화 결과에 해당하는 데이터를 원본 테이블에서 가져오려면, JOIN을 활용해 데이터를 연결해야 합니다.
  4. 서브쿼리 별칭 :
    • SQL에서 서브쿼리(derived table)를 사용할 때는 각 서브쿼리에 반드시 별칭(alias)을 지정해야 합니다.
    • MySQL에서는 서브쿼리에 별칭이 없으면 Every derived table must have its own alias 오류가 발생합니다.

 

3. 수정한 쿼리

SELECT P.ID, P.NAME, P.HOST_ID
FROM PLACES AS P
JOIN (
    SELECT HOST_ID
    FROM PLACES
    GROUP BY HOST_ID
    HAVING COUNT(HOST_ID) >= 2
) AS HEAVY
ON P.HOST_ID = HEAVY.HOST_ID

 

서브쿼리 (HEAVY):

  • GROUP BY와 HAVING을 사용해 HOST_ID가 2번 이상 등장하는 경우만 추출합니다.

 

JOIN 활용:

  • 원본 테이블(PLACES)과 서브쿼리 결과(HEAVY)를 HOST_ID를 기준으로 JOIN.
  • 조건에 맞는 HOST_ID를 가진 데이터의 모든 열(ID, NAME, HOST_ID)을 원본 테이블에서 가져옵니다.

최종 결과:

  • HOST_ID가 2번 이상 등장하는 행만 필터링된 결과를 반환.

 

4. 얻은 인사이트

1️⃣ GROUP BY와 SELECT 사용의 원칙

  • GROUP BY를 사용할 때는 그룹화 기준 열과 집계 함수로만 데이터를 반환할 수 있습니다.
  • 그룹화되지 않은 다른 열을 가져오려면, 집계 함수(예: MAX, MIN, ANY_VALUE) 또는 JOIN을 활용해야 합니다.

2️⃣ JOIN 활용

  • 그룹화된 결과를 원본 데이터와 매칭하려면 서브쿼리와 JOIN을 활용해야 합니다.
  • 이 방법은 조건에 맞는 데이터 필터링 후 원본 테이블의 모든 열을 반환할 때 유용합니다.

3️⃣ SQL 작성 시 단계별 설계 중요성

  • 원하는 결과를 얻기 위해 SQL 쿼리를 단계적으로 설계하고, 중간 결과를 확인하는 과정이 중요합니다.
  • 조건 설정(HAVING)과 데이터 연결(JOIN)의 역할을 명확히 이해하면 문제 해결이 수월해집니다.

 

이 사례를 통해 그룹화된 데이터를 원본 테이블과 매칭하여 필요한 모든 데이터를 가져오는 방법을 이해할 수 있었습니다. 중요한 점은 SQL의 GROUP BY, HAVING, 그리고 JOIN의 역할을 명확히 이해하고, 각각의 기능을 적절히 활용하는 것입니다. SQL로 복잡한 데이터를 다룰 때도 "문제의 원인 분석 → 설계 → 구현" 과정을 거치면 효과적으로 문제를 해결할 수 있습니다. 

 

  •  

 

반응형