|
id
|
user_name
|
satisfaction_score
|
feedback_date
|
|
1
|
르탄이
|
5
|
2023-03-01
|
|
2
|
배캠이
|
4
|
2023-03-02
|
|
3
|
구구이
|
3
|
2023-03-01
|
|
4
|
이션이
|
5
|
2023-03-03
|
|
5
|
구구이
|
4
|
2023-03-04
|
위와 같은 lol_feedback 테이블이 주어졌을 때, 다음 문제들을 풀어보세요.
문제
lol_feedbacks테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!lol_feedbacks테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!lol_feedbacks테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!lol_feedbacks테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!lol_feedbacks테이블에서 평균 만족도 점수가 가장 높은 날짜를 찾는 쿼리를 작성해주세요!
문제 풀이
데이터베이스와 테이블 생성하기
CREATE DATABASE step7;
USE step7;
CREATE TABLE lol_feedbacks(
id INT PRIMARY KEY
, user_name VARCHAR(50)
, satisfaction_score INT
, feedback_date DATE
);
INSERT INTO lol_feedbacks
(id, user_name, satisfaction_score, feedback_date)
VALUES
(1, '르탄이', 5, '2023-03-01')
, (2, '배캠이', 4, '2023-03-02')
, (3, '구구이', 3, '2023-03-01')
, (4, '이션이', 5, '2023-03-03')
, (5, '구구이', 4, '2023-03-04');
1번
lol_feedbacks테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!
내림차순 정렬은 ORDER BY…DESC 구문을 사용한다.
정답 :
SELECT *
FROM lol_feedbacks
ORDER BY satisfaction_score DESC;
정답 확인 :

2번
lol_feedbacks테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!
lol_feedbacks 테이블에서 각 유저별로 최신 피드백을 찾는 쿼리
→ 일단은 최신 피드백을 찾는 쿼리를 만들자
→ 날짜가 가장 큰 데이터를 얻어야 하니까 SELECT MAX() 문법을 사용하면 될 것 같다.
→ 이렇게 구한 최댓값을 WHERE절로 불러올 수 있도록 메인 쿼리를 고민해보자.
→ 같은 user_name을 가진 행을 대상으로 MAX(feedback_date)를 가져오면 되지 않을까.
→ FROM절에서 abiguous 오류가 나니까 alias도 적당하게 지어주자.
정답 :
SELECT *
FROM lol_feedbacks AS lol_feed1
WHERE feedback_date = -- 그냥 feedback_date가 아니라 MAX(feedback_date)를 가져오고 싶다. -> 서브쿼리를 작성하자.
(
SELECT
MAX(feedback_date)
FROM lol_feedbacks AS lol_feed2
WHERE lol_feed2.user_name = lol_feed1.user_name -- 메인쿼리와 같은 user_name을 가진 행에서만 MAX()함수 실행
); -- 이 서브쿼리는 메인쿼리의 첫 번째 행부터 "독립적으로" 실행된다.
-- → 3행 '구구이’의 feedback_date는 서브쿼리로 계산한 값(2023-03-04)과 일치하지 않으므로 탈락
-- 결국, 아래 이미지처럼 마지막 ‘구구이’의 행만 남게 된다.
정답 확인 :

3번
lol_feedbacks테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!
정답 :
SELECT
COUNT(*) AS feedback_count_5
FROM lol_feedbacks
WHERE satisfaction_score = 5
정답 확인 :

4번
lol_feedbacks테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!
유저별로 GROUP BY를 한 뒤 COUNT를 이용하여 피드백 횟수를 세어준다.
→ 내림차순으로 정렬하고 LIMIT를 3으로 제한한다.
→ 고객의 이름과 피드백 횟수로 출력해본다.
정답 :
SELECT
COUNT(*) AS feedback_count
FROM lol_feedbacks
GROUP BY user_name
ORDER BY DESC
LIMIT 3;
정답 확인 :

궁금증 : 필드값이 동일한 경우에는 무슨 기준으로 정렬하는 걸까. 가나다 순인가..?
5번
lol_feedbacks테이블에서 평균 만족도 점수가 가장 높은 날짜를 찾는 쿼리를 작성해주세요!
만족도 점수를 날짜별로 평균내기(그룹화)
→ 날짜와 평균 만족도 점수로 추출하기
→ 내림차순 정렬
→ LIMIT 1
정답:
SELECT
feedback_date
, AVG(satisfaction_score) AS avg_sf_scroe
FROM lol_feedbacks
GROUP BY feedback_date
ORDER BY avg_sf_scroe DESC
LIMIT 1;
정답 확인:

'Database > SQL' 카테고리의 다른 글
| SQL 문법 다지기(9) (0) | 2024.10.14 |
|---|---|
| SQL 문법 다지기(8) (1) | 2024.10.14 |
| SQL 문법 다지기(6) (2) | 2024.10.10 |
| SQL 문법 다지기(5) (4) | 2024.10.07 |
| SQL 문법 다지기(4) (1) | 2024.10.04 |
댓글