lol_users 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높음.SELECT
name
, region
, rating
, RANK() OVER (ORDER BY rating DESC) ranking
FROM lol_users;
lol_users 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요!# 스스로 풀이
SELECT
name
, join_date
, ranking
FROM
( # ranking 구하는 서브쿼리
SELECT
name
, join_date
, RANK() OVER (ORDER BY join_date DESC) ranking
FROM lol_users
) ranking_date
WHERE ranking = 1;
# LIMIT 사용
SELECT name
FROM lol_users
ORDER BY join_date DESC LIMIT 1;
lol_users 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해주세요!SELECT
*
FROM
lol_users
ORDER BY
region,
rating;
lol_users 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해주세요!SELECT
region
, AVG(rating) avg_rating
FROM lol_users
GROUP BY region;
SELECT 열이름1, 열이름2, ... FROM 테이블이름 -- 보통 ORDER BY 뒤에 사용됨 LIMIT 제한된_행_수, OFFSET 특정 위치 지정; -- OFFSET은 0부터 시작 -- OFFSET 은 쉼표로 생략 가능
SELECT *
FROM lol_feedbacks
ORDER BY satisfaction_score DESC;
SELECT
user_name
# MAX 함수 사용, 가장 큰 날짜 -> 가장 최근!
, MAX(feedback_date) recent_feedback_date
FROM lol_feedbacks
GROUP BY user_name;
# 내 풀이 COUNT(IF)로 조건 부여
SELECT
COUNT(IF(satisfaction_score = 5, id, NULL)) score_five
FROM lol_feedbacks;
# 답지 전부 센 후 WHERE 조건 부여
SELECT COUNT(*)
FROM lol_feedbacks
WHERE satisfaction_score = 5;
SELECT
user_name
, COUNT(*) count_feedbacks
FROM lol_feedbacks
GROUP BY user_name
ORDER BY 2 DESC LIMIT 3;
동률인데 문제에선 딱히 언급이 없다..!
SELECT
feedback_date
, AVG(satisfaction_score) avg_score
FROM lol_feedbacks
GROUP BY feedback_date
ORDER BY 2 DESC LIMIT 1;
SELECT name
FROM doctors
WHERE major = '성형외과';
SELECT
major ,
COUNT(*) doctor_number
From doctors
GROUP BY major;
SELECT COUNT(*) num_of_doctors
FROM doctors
# 고용 날짜가 현재시간에서 5년 뺀 것보다 작다 => 5년 이상 근무했다
WHERE hire_date <= DATE_SUB(CURDATE(), INTERVAL 5 YEAR);
# 고용날짜 년도 빼기 현재 년도, 대략적으로 년도만 계산함
WHERE TIMESTAMPDIFF(YEAR, hire_date, curdate()) >=5;
# TIMESTAMPDIFF 사용
SELECT
name
-- 뒤에꺼 빼기 앞에꺼!!!
, TIMESTAMPDIFF(DAY, hire_date, CURDATE())
FROM doctors
# DATEDIFF 사용
SELECT
name
-- 앞에꺼 빼기 뒤에꺼!!!
, DATEDIFF(Curdate(), hire_date)
FROM doctors
TIMESTAMPDIFF 두 날짜를 직접적으로 뺌
# 뒤에꺼 빼기 앞에꺼! TIMESTAMPDIFF(단위, 시작날짜, 끝날짜)DATEDIFF 날짜 차이만 계산
DATEDIFF(시작날짜, 끝날짜) = TIMESTAMPDIFF(day, 시작날짜, 끝날짜) # 하지만 DATEDIFF는 앞에꺼 빼기 뒤에꺼!!!DATE_SUB 날짜를 기준으로 특정 기간(연도, 월, 일 등)을 뺌
DATE_SUB(기준날짜, INTERVAL n 단위)
단위 모음 YEAR 연도 단위의 차이 QUARTER 분기(3개월) 단위의 차이 MONTH 월 단위의 차이 WEEK 주 단위의 차이 DAY 일 단위의 차이 HOUR 시간 단위의 차이 MINUTE 분 단위의 차이 SECOND 초 단위의 차이
SELECT
gender,
COUNT(*) patients_num
FROM patients
GROUP BY gender;
SELECT
COUNT(*) over_40
FROM patients
WHERE birth_date <= DATE_SUB(CURDATE(), INTERVAL 40 YEAR);
SELECT *
FROM patients
WHERE last_visit_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
SELECT
COUNT(*) 80s
FROM patients
WHERE YEAR(birth_date) LIKE '198%';
4번문제 답지에 있는 답 돌려봤는데 에러 뜸.. 뭐냐
SELECT COUNT(name) `총 부서 수`
FROM departments;
SELECT
e.name
, d.name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id;
SELECT
e.name
, d.name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id
WHERE d.name = '기술팀';
SELECT
d.name
, COUNT(e.name) count_enplyees
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id
GROUP BY d.name;
SELECT d.name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id
WHERE e.id IS NULL
SELECT
e.name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.id
WHERE d.name = '마케팅팀';
수업에서 연습하던 테이블 JOIN보다 훨씬 쉬워서 바로바로 풀었다.
마지막 연습 문제는 시간 관계상 간단히 생각하고 답 맞춰보면서 풀어서 풀이를 쓰지 않겠다. SQL 걷기반 문제 풀이 종료!
SQL 문제 풀이까지 마무리했다. 다음주에 아티클 스터디 + 파이썬 정리하고 문제풀이까지 한 다음, 그 다음주에는 데이터 문해력 책 스터디하고 직접 타이타닉, 보스턴집값 데이터 분석을 해볼 수 있으면 좋겠다!