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;
/
/