Database/SQL

SQL 문법 다지기(7)

프린스 알리 2024. 10. 10.
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 테이블이 주어졌을 때, 다음 문제들을 풀어보세요.

문제

  1. lol_feedbacks 테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!
  2. lol_feedbacks 테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!
  3. lol_feedbacks 테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!
  4. lol_feedbacks 테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!
  5. 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

댓글