[내일배움캠프] 데이터 트랙/사전캠프

[내일배움캠프 사전캠프] 7일 차

554083460 2025. 4. 29. 17:49

 

 

SQL 퀘스트 6, 7

 

 

문 21
lol_users 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높아야해요. (e.g. rating 1400 유저의 순위 > rating 1350 유저의 순위)

 

답안: 

SELECT id, name, region, rating, join_date,
       RANK() OVER(ORDER BY rating DESC) rank_rating
FROM lol_users;

 

1. RANK

- RANK() OVER(ORDER BY column DESC)

- 정렬 기준에 따라 각 행에 순위를 부여하는 윈도우 함수. 단순 번호 매기기가 아니라, 동점자 처리도 가능.

- 예시

SELECT RANK() OVER(ORDER BY column_name) as ranking
FROM table_name;

 

 

문 22

lol_users 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요!

 

답안:

SELECT name
FROM lol_users
ORDER BY join_date DESC LIMIT 1;

 

- 헷갈린 이유: '가장 늦게'라는 표현을 보고 MAX를 쓰려고 했다. 그런데 그렇게 하면 이름만 선택할 수 없는 문제가 있었다.

- 개선점: 구글링을 통해 원하는 수의 행만 출력하는 LIMIT 구가 있다는 것을 알았다.

 

1. LIMIT

- WHERE column LIMIT 출력할 행의 수

- ORDER BY column LIMIT 출력할 행의 수

- 모든 행을 출력하지 않고, 지정한 숫자만큼의 행을 출력한다.

- SQL 표준 문법 아님: MySQL, PostgreSQL 등에서 사용 가능

- 예시

SELECT
FROM
WHERE column_name LIMIT 3;

 

문 23

lol_users 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해주세요!

 

답안

SELECT id, name, region, rating, join_date
FROM lol_users
ORDER BY region, rating desc;

 

- 헷갈린 점: '지역별'이라는 표현만 보고 GROUP BY를 써야겠다고 생각했다.

- 개선점: GROUP BY와 ORDER BY의 용법 차이를 학습한다.

 

1. GROUP BY와 ORDER BY 비교

GROUP BY ORDER BY
데이터를 그룹화할 때 사용 단순히 데이터 순서 정렬
주로 SELECT 문의 집계 함수와 함께 사용된다: SUM, AVG, COUNT, MIN, MAX
예시) SUM: 각 그룹 내에서의 총합을 계산한다
그렇지 않다
대체적으로 집계 함수와 함께 써야 제대로 작동한다 그렇지 않다
일반적으로, GROUP BY 1개의 column ORDER BY 여러 개의 column 가능
SELECT 문에서 집계 함수 사용 후 별명 붙인다. 그 별명을 GROUP BY에서 사용하는 것은 일반적으로 어색하다. 그 별명을 ORDER BY에서 사용하는 것은 자연스럽다

 

- SELECT 문에서 정의한 별명을 GROUP BY에서 사용하는 것이 어색한 이유: SQL 작성 순서와 SQL 실행 순서가 다르기 때문

 

SQL 작성 순서

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

 

SQL 실제 실행 순서 (gpt)

1 FROM 어떤 테이블에서 데이터를 가져올지 결정
2 WHERE 가져온 데이터에서 행(row) 필터링
3 GROUP BY 필터링된 데이터를 그룹화
4 HAVING 그룹화된 결과를 다시 조건으로 필터링
5 SELECT 원하는 컬럼(또는 집계 함수)을 계산
6 ORDER BY 결과를 정렬
7 LIMIT 결과에서 일부 행만 출력

 

 

2. GROUP BY와 ORDER BY를 같이 사용하는 경우의 의미

SELECT
FROM
GROUP BY column1
ORDER BY column2

 

- column 1 값이 같은 행(row)끼리 묶는다.

만들어진 그룹을 column 2 값을 기준으로 (오름차순/내림차순으로) 정렬한다.

 

 

3. 집계 함수를 GROUP BY와 ORDER BY와 함께 사용하는 방식

- 집계 함수: SUM(), AVG(), COUNT(), MIN(), MAX()

 

1) GROUP BY

- GROUP BY로 그룹을 만든다. SELECT 문에서 그 그룹에 적용될 집계 함수 사용한다. 

- 예시

SELECT column1, SUM(column2)
FROM table
GROUP BY column1;

 

2) ORDER BY

- SELECT 문에서 집계 함수 사용 후 별명(Alias) 붙인다. ORDER BY 절에서 그 별명을 사용함

- 예시

SELECT column1, AVG(column2) AS avg_column2
FROM table
GROUP BY column1
ORDER BY avg_column2;

 

 

문 29

lol_feedbacks 테이블에서 평균 만족도 점수가 가장 높은 날짜를 찾는 쿼리를 작성해주세요!

 

답안

SELECT feedback_date
FROM lol_feedbacks
GROUP BY feedback_date
ORDER BY AVG(satisfaction_score) DESC LIMIT 1;

 

- 헷갈린 이유: 평균을 서브쿼리에 넣고, MAX 함수를 사용하려고 했다.

- 개선점: 예시 답안 쿼리를 그대로 쓰면 오류가 날 수 있는 여지가 있다고 한다. 그 이유를 구체적으로 알아둔다.

 

1. ORDER BY에 집계함수를 바로 사용했을 때의 문제점

- GROUP BY 사용해 그룹 만들고,

SELECT 문에서 집계 함수 사용해 그룹 내에서 계산하고,

그 결과를 ORDER BY에 사용하는 흐름이 있어야 한다.

- 답안을 수정하면

SELECT feedback_date, AVG(satisfaction_score) AS avg_s
FROM lol_feedbacks
GROUP BY feedback_date
ORDER BY avg_s DESC LIMIT 1;