SQL 문제풀이 해설 3회차 세션 분석

최근 SQL 세션에서 다룬 문제들은 데이터베이스의 집계 함수와 조건절, 서브쿼리의 활용에 중점을 두고 있습니다. 이번 글에서는 각 문제의 핵심 사항을 분석하고, SQL을 활용하여 문제를 해결하는 방법을 제시하겠습니다.

이러한 문제 풀이를 통해 SQL의 기초부터 심화 개념까지 폭넓게 이해할 수 있습니다.

썸네일

집계함수와 조건절의 활용

집계 함수 활용

SQL에서 집계 함수는 데이터의 요약 정보를 제공하는 데 사용됩니다. 예를 들어, 게임 캐릭터의 첫 접속일자별로 캐릭터 수를 구하는 문제는 이러한 집계 함수의 활용을 통해 해결할 수 있습니다.

문제2: 집계함수와 조건절의 활용

문제 설명

문제2에서는 group by를 사용하여 첫 접속일자별로 게임 캐릭터 수를 중복값 없이 구하고, having 절을 사용하여 그 값이 10개를 초과하는 경우의 첫 접속일자 및 게임 캐릭터 ID 개수를 추출하는 요구사항이 있었습니다.

SQL 쿼리 예시

sql
SELECT first_login_date, COUNT(DISTINCT character_id) AS character_count
FROM game_characters
GROUP BY first_login_date
HAVING COUNT(DISTINCT character_id) > 10;

위 쿼리는 game_characters 테이블에서 첫 접속일자(first_login_date)를 기준으로 그룹화하여, 각 날짜에 대해 중복되지 않는 캐릭터 ID의 수를 세어 10개를 초과하는 경우만 결과로 보여줍니다.

결과 예시

first_login_date character_count
2024-01-01 15
2024-01-02 12
2024-01-03 20

이와 같이 결과를 통해 특정 날짜에 접속한 캐릭터 수를 쉽게 확인할 수 있습니다.

집계함수와 조건절의 활용2

SQL 조건절 예시

이번 세션에서는 두 번째 문제를 통해 group by 절을 사용하여 서버별 유저 구분(기존/신규) 게임 캐릭터 ID 수를 구하는 방법을 배웠습니다.

문제3: 집계함수와 조건절의 활용2

문제 설명

문제3에서는 서버별로 기존과 신규 유저를 구분하여 게임 캐릭터 ID 수를 중복값 없이 추출하고, 서버별 평균 레벨도 함께 구하는 요구사항이 있었습니다. 기존 유저는 첫 접속일자가 2024-01-01보다 작은 경우로 정의되었습니다.

SQL 쿼리 예시

sql
SELECT server,
COUNT(DISTINCT CASE WHEN first_login_date < '2024-01-01' THEN character_id END) AS existing_users,
COUNT(DISTINCT CASE WHEN first_login_date >= '2024-01-01' THEN character_id END) AS new_users,
AVG(level) AS average_level
FROM game_characters
GROUP BY server;

이 쿼리는 각 서버에 대해 기존 유저와 신규 유저를 구분하여 캐릭터 ID 수를 세고, 평균 레벨을 계산합니다.

결과 예시

server existing_users new_users average_level
Server1 30 20 25.6
Server2 25 15 22.3

이 결과는 각 서버에서 기존 유저와 신규 유저의 분포를 명확히 보여줍니다.

다른 내용도 보러가기 #1

SubQuery의 활용

서브쿼리는 주 쿼리의 결과를 기반으로 추가적인 조건을 설정할 수 있도록 도와주는 SQL 기능입니다. 이번 문제에서는 서브쿼리를 활용하여 데이터 추출을 하는 방법을 배웠습니다.

문제4: SubQuery의 활용

문제 설명

문제4에서는 문제2의 결과를 having 절을 사용하지 않고 인라인 뷰 서브쿼리를 통해 추출하는 요구사항이 있었습니다.

SQL 쿼리 예시

sql
SELECT first_login_date, character_count
FROM (
SELECT first_login_date, COUNT(DISTINCT character_id) AS character_count
FROM game_characters
GROUP BY first_login_date
) AS subquery
WHERE character_count > 10;

이 쿼리는 서브쿼리를 통해 각 첫 접속일자별 캐릭터 수를 구한 후, 메인 쿼리에서 그 수가 10을 초과하는 경우만 필터링합니다.

결과 예시

first_login_date character_count
2024-01-01 15
2024-01-03 12

서브쿼리를 활용함으로써 having 절을 사용하지 않고도 동일한 결과를 도출할 수 있습니다.

SubQuery의 응용

이번 세션에서는 서브쿼리를 더 깊이 있게 활용하여 캐릭터 수와 게임 계정 개수를 구하는 방법을 살펴보았습니다.

문제5: SubQuery의 응용

문제 설명

문제5에서는 레벨이 30 이상인 캐릭터를 기준으로 게임 계정별 캐릭터 수를 중복값 없이 추출하고, 그 수가 2 이상인 게임 계정만을 필터링하며, 마지막으로 인라인 뷰 서브쿼리를 활용하여 캐릭터 수별 게임 계정 개수를 구하는 요구사항이 있었습니다.

SQL 쿼리 예시

sql
SELECT character_count, COUNT(DISTINCT account_id) AS account_count
FROM (
SELECT account_id, COUNT(DISTINCT character_id) AS character_count
FROM game_characters
WHERE level >= 30
GROUP BY account_id
HAVING COUNT(DISTINCT character_id) >= 2
) AS subquery
GROUP BY character_count;

이 쿼리는 레벨이 30 이상인 캐릭터를 가진 게임 계정 중, 캐릭터 수가 2 이상인 계정만을 추출하여 최종적으로 그 캐릭터 수에 따른 게임 계정 개수를 세는 과정입니다.

결과 예시

character_count account_count
2 10
3 5
4 3

이 결과는 레벨이 높은 캐릭터를 가진 계정의 분포를 확인하는 데 유용합니다.

마무리

이번 SQL 문제풀이 해설을 통해 집계 함수, 조건절, 서브쿼리의 활용 방법을 깊이 있게 배울 수 있었습니다. 데이터베이스에서의 쿼리 작성 능력은 데이터 분석과 관리에 있어 핵심적인 스킬입니다.

지속적인 학습과 실습을 통해 이러한 쿼리 작성 능력을 더욱 향상시킬 수 있기를 바랍니다. SQL은 단순히 데이터를 조회하는 것을 넘어, 데이터의 의미를 알아보고 분석하는 데 필수적인 도구임을 잊지 말아야 합니다.

관련 영상

같이 보면 좋은 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다