SQL 걷기 문제 풀이

KUN·2025년 3월 18일

SQL 기본

  • 2025/03/18

1.sparta_employees 테이블에서 모든 직원의 이름(name)과 직급(position)을 선택하는 쿼리를 작성해주세요.

SELECT 
	name as employees_name, 
    position as "직급"
FROM sparta_employees

2.sparta_employees 테이블에서 중복 없이 모든 직급(position)을 선택하는 쿼리를 작성해주세요.

SELECT DISTINCT position as "직급"
FROM sparta_employees

3.sparta_employees 테이블에서 연봉(salary)이 40000과 60000 사이인 직원들을 선택하는 쿼리를 작성해주세요.

SELECT salary as employees_salary
FROM sparta_employees
WHERE 
	salary BETWEEN 40000 AND 60000

4.sparta_employees 테이블에서 입사일(hire_date)이 2023년 1월 1일 이전인 모든 직원들을 선택하는 쿼리를 작성해주세요.

SELECT hire_date as before_hire_date
FROM sparta_employees
WHERE 
	hire_date < '2023-01-01'

5.products 테이블에서 제품 이름(product_name)과 가격(price)만을 선택하는 쿼리를 작성해주세요.

SELECT product_name AS "제품명", price AS "가격"
FROM products;

6.products 테이블에서 제품 이름에 '프로'가 포함된 모든 제품을 선택하는 쿼리를 작성해주세요.

SELECT product_name AS "제품명"
FROM products
WHERE product_name LIKE '%프로%'

7.products 테이블에서 제품 이름이 '갤'로 시작하는 모든 제품을 선택하는 쿼리를 작성해주세요.

SELECT product_name AS "제품명"
FROM products
WHERE product_name LIKE '갤%'

8.products 테이블에서 모든 제품을 구매하기 위해 필요한 돈을 계산하는 쿼리를 작성해주세요.

SELECT sum(price) AS total_price
FROM products

9.orders 테이블에서 주문 수량(amount)이 2개 이상인 주문을 진행한 소비자의 ID(customer_id)만 선택하는 쿼리를 작성해주세요!

select customer_id AS "고객ID"
from oders
where amount >= 2

10.orders 테이블에서 2023년 11월 2일 이후에 주문된 주문 수량(amount)이 2개 이상인 주문을 선택하는 쿼리를 작성해주세요!

select *
from oders
where amount >= 2 and order_date > '2023-11-02'

11.orders 테이블에서 주문 수량이 3개 미만이면서 배송비(shipping_fee)가 15000원보다 비싼 주문을 선택하는 쿼리를 작성해주세요!

select *
from oders
where amount < 3 and shipping_fee > 15000

12.orders 테이블에서 배송비가 높은 금액 순으로 정렬하는 쿼리를 작성해주세요!

select *
from oders
ORDER BY shipping_fee DESC 

13.sparta_students 테이블에서 모든 학생의 이름(name)과 트랙(track)을 선택하는 쿼리를 작성해주세요!

select name, track
from sparta_students

14.sparta_students 테이블에서 Unity 트랙 소속이 아닌 학생들을 선택하는 쿼리를 작성해주세요!

select name
from sparta_students
where track <> 'Unity'

15.sparta_students 테이블에서 입학년도(enrollment_year)가 2021년인 학생과 2023년인 학생을 선택하는 쿼리를 작성해주세요!

select name
from sparta_students
where enrollment_year = 2021 or 2023
        # enrollment_year 이 int 라는 가정하에

16.sparta_students 테이블에서 Node.js 트랙 소속이고 학점이 ‘A’인 학생의 입학년도를 선택하는 쿼리를 작성해주세요!

select enrollment_year
from sparta_students
where track = 'Node.js' and grade = 'A'

17.team_projects 테이블에서 AWS 예산(aws_cost)이 40000 이상 들어간 프로젝트들의 이름을 선택하는 쿼리를 작성해주세요!

select name as "프로젝트"
from team_projects
where aws_cost >= 40000

18.team_projects 테이블에서 2022년에 시작된 프로젝트를 선택하는 쿼리를 작성해주세요! 단, start_date < ‘2023-01-01’ 조건을 사용하지 말고 쿼리를 작성해주세요!

select name as "프로젝트"
from team_projects
where start_date >= '2022-01-01' and start_date <= '2022-12-31'

19.team_projects 테이블에서 현재 진행중인 프로젝트를 선택하는 쿼리를 작성해주세요. 단, 지금 시점의 날짜를 하드코딩해서 쿼리하지 말아주세요!

select name as "프로젝트"
from team_projects
where start_date <= CURDATE() and end_date >= CURDATE()

20.team_projects 테이블에서 각 프로젝트의 지속 기간을 일 수로 계산하는 쿼리를 작성해주세요!

select TIMESTAMPDIFF(DAY, start_date,end_date) as "일"
from checkins c 

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

select 
	id,
	name,
    rating
    RANK() OVER(PARTITION BY region ORDER BY rating DESC) "st"
from lol_users

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

SELECT *
FROM lol_users
ORDER BY join_date DESC
LIMIT 1

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

select 
	id,
	name,
    rating
    RANK() OVER(PARTITION BY region ORDER BY rating DESC) "st"
from lol_users
ORDER BY name

24.lol_users 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해주세요!

SELECT 
	region, 
    AVG(rating) AS avg_rating
FROM lol_users
GROUP BY region;

25.lol_feedbacks 테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!

SELECT *
FROM lol_feedbacks 
ORDER BY satisfaction_score DESC

26.lol_feedbacks 테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!

SELECT 
	*, 
	MAX(feedback_date) as "최신 피드백"
FROM lol_feedbacks 

27.lol_feedbacks 테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!

SELECT 
	satisfaction_score, 
	count(satisfaction_score) as count_score
FROM lol_feedbacks 
WHERE satisfaction_score = 5

28.lol_feedbacks 테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!

SELECT 
	user_name, 
    COUNT(*) AS feedback_count
FROM lol_feedbacks
GROUP BY user_name
ORDER BY feedback_count DESC
LIMIT 3;

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

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

30.doctors 테이블에서 전공(major)가 성형외과인 의사의 이름을 알아내는 쿼리를 작성해주세요!

SELECT *
FROM doctors
WHERE major = '성형외과'

31.doctors 테이블에서 각 전공 별 의사 수를 계산하는 쿼리를 작성해주세요!

SELECT count(major) "전공별 의사 수"
FROM doctors
GROUP BY major

32.doctors 테이블에서 현재 날짜 기준으로 5년 이상 근무(hire_date)한 의사 수를 계산하는 쿼리를 작성해주세요!

SELECT 
    major,
    COUNT(*) AS five_years_hire_date
FROM doctors
WHERE TIMESTAMPDIFF(MONTH, hire_date, CURDATE()) >= 60
GROUP BY major;

33.doctors 테이블에서 각 의사의 근무 기간을 계산하는 쿼리를 작성해주세요!

SELECT 
	name AS "이름",
    DATEDIFF(CURDATE(), hire_date) "근무일"
FROM doctors

34.patients 테이블에서 각 성별(gender)에 따른 환자 수를 계산하는 쿼리를 작성해주세요!

SELECT 
	gender AS "성별"
	COUNT(gender)
FROM patients 
GROUP BY gender

35.patients 테이블에서 현재 나이가 40세 이상인 환자들의 수를 계산하는 쿼리를 작성해주세요!

SELECT 
	birth_date AS "생년일일"
    count(birth_date)
FROM patients 
WHERE TIMESTAMPDIFF(YEAR, CURDATE(), birth_date) >= 40
GROUP BY 1

36.patients 테이블에서 마지막 방문 날짜(last_visit_date)가 1년 이상 된 환자들을 선택하는 쿼리를 작성해주세요!

SELECT *
FROM patients 
WHERE TIMESTAMPDIFF(YEAR, last_visit_date, birth_date) >= 1

37.patients 테이블에서 생년월일이 1980년대인 환자들의 수를 계산하는 쿼리를 작성해주세요!

SELECT 
	brith_date AS "생년월일"
	count(brith_date) AS "1980년대"
FROM patients
WHERE DATE_FORMAT(brith_date, '%Y') BETWEEN '1980' AND '1990';

38.현재 존재하고 있는 총 부서의 수를 구하는 쿼리를 작성해주세요!

SELECT 
	COUNT(name) count_dep
FROM departments

39.모든 직원과 그들이 속한 부서의 이름을 나열하는 쿼리를 작성해주세요!

SELECT *
FROM employees e INNER JOIN departments d ON e.department_id = d.id

40.'기술팀' 부서에 속한 직원들의 이름을 나열하는 쿼리를 작성해주세요!

SELECT *
FROM employees e INNER JOIN departments d ON e.department_id = d.id
WHERE d.name = '기술팀'

41.부서별로 직원 수를 계산하는 쿼리를 작성해주세요!

SELECT 
	d.name AS department_name,
	COUNT(e.id) count_user
FROM employees e INNER JOIN departments d ON e.department_id = d.id
GROUP BY d.name

42.직원이 없는 부서의 이름을 찾는 쿼리를 작성해주세요!

SELECT a.department_name AS non_user
FROM (
    SELECT 
        d.name AS department_name,
        COUNT(e.id) AS count_user
    FROM departments d LEFT JOIN employees e ON d.id = e.department_id
    GROUP BY d.name
) a
WHERE a.count_user = 0;

43.'마케팅팀' 부서에만 속한 직원들의 이름을 나열하는 쿼리를 작성해주세요!

SELECT e.name
FROM employees e INNER JOIN departments d ON e.department_id = d.id
WHERE d.name = '마케팅팀';

44.모든 주문의 주문 ID와 주문된 상품의 이름을 나열하는 쿼리를 작성해주세요!

SELECT 
	o.id order_id,
    p.name product_name
FROM orders o INNER JOIN products p ON o.product_id = p.id

45.총 매출(price * quantity의 합)이 가장 높은 상품의 ID와 해당 상품의 총 매출을 가져오는 쿼리를 작성해주세요!

SELECT
	a.order_id id,
   	a.total_price price
FROM(
	SELECT 
		o.id order_id,
    	p.name product_name,
    	p.price * o.quantity AS total_price
	FROM orders o INNER JOIN products p ON o.product_id = p.id
    ) a
ORDER BY a.total_price DESC
LIMIT 1

46.각 상품 ID별로 판매된 총 수량(quantity)을 계산하는 쿼리를 작성해주세요!

SELECT 
	p.id product_id,
    o.quantity quantity
FROM orders o INNER JOIN products p ON o.product_id = p.id

47.2023년 3월 3일 이후에 주문된 모든 상품의 이름을 나열하는 쿼리를 작성해주세요!

SELECT 
	p.name product_name,
    o.quantity quantity
FROM orders o INNER JOIN products p ON o.product_id = p.id
WHERE o.order_date > '2023-03-03'

48.가장 많이 판매된 상품의 이름을 찾는 쿼리를 작성해주세요!

SELECT 
    p.name AS product_name
FROM orders o INNER JOIN products p ON o.product_id = p.id
WHERE o.quantity = 
	(SELECT MAX(quantity) FROM orders);

49.각 상품 ID별로 평균 주문 수량을 계산하는 쿼리를 작성해주세요!

SELECT 
	a.product_id,
	AVG(a.quantity) avg_quantity
FROM(
	SELECT 
    	p.product_id,
        o.quantity
	FROM orders o INNER JOIN products p ON o.product_id = p.id
	) a
GROUP BY a.product_id

50.판매되지 않은 상품의 ID와 이름을 찾는 쿼리를 작성해주세요!

SELECT 
	a.product_id,
    a.quantity
FROM(
	SELECT 
    	p.product_id,
        o.quantity
	FROM orders o INNER JOIN products p ON o.product_id = p.id
	) a
WHERE a.quantity > 0
GROUP BY a.product_id
profile
배우노라, 실험하노라, 기록하노라

0개의 댓글