본문 바로가기
SQL

실전 문제 풀이 (2)

by 바른곰의 SQL천국 2025. 8. 11.

✅ 문제 1. 가장 많이 주문한 사용자 조회

CREATE TABLE orders (
  user_id INT,
  order_id INT,
  amount INT
);

INSERT INTO orders VALUES
(1, 101, 500),
(1, 102, 300),
(2, 201, 900),
(3, 301, 200),
(3, 302, 400);

 

설명: 총 주문 금액이 가장 높은 사용자를 조회한다.

 

테이블 구조:

  • orders(user_id, order_id, amount)

요구사항:

  • 유저별 총 주문금액 계산
  • 총 주문금액이 가장 높은 1명만 출력
  • user_id, total_amount 출력
 
SELECT
	user_id,
    SUM(amount) AS total_amount
FROM orders
GROUP BY user_id
ORDER BY total_amount DESC
LIMIT 1

 

 

✅ 문제 2. 친구 관계에서 상호 친구가 아닌 경우만 조회

CREATE TABLE friend (
  user_id INT,
  friend_id INT
);

INSERT INTO friend VALUES
(1, 2),
(2, 1),
(1, 3),
(4, 1),
(3, 1); -- 3→1, 1→3 둘 다 있으므로 상호 친구

 

설명: friend 테이블에서 일방적인 친구만 조회 (ex. A가 B를 친구로 추가했지만, B는 A를 친구로 추가하지 않음)

 

테이블 구조:

  • friend(user_id, friend_id)

요구사항:

  • 상호 친구가 아닌 경우만 조회
  • user_id, friend_id 출력
SELECT
	f1.user_id,
    f1.friend_id
FROM friend f1
JOIN friend f2
ON f1.friend_id = f2.user_id
 AND f2.friend_id = f1.user_id

 

✅ 문제 3. 각 사용자의 첫 주문일과 마지막 주문일 조회

CREATE TABLE orders (
  user_id INT,
  order_date DATE
);

INSERT INTO orders VALUES
(1, '2024-07-01'),
(1, '2024-07-05'),
(2, '2024-07-02'),
(2, '2024-07-08'),
(3, '2024-07-03');

 

설명: 각 user의 첫 주문일과 마지막 주문일을 출력

 

테이블 구조:

  • orders(user_id, order_date)

요구사항:

  • user_id, first_order, last_order 출력
SELECT
	user_id,
    MIN(order_date) AS first_order,
    MAX(order_date) As last_order
FROM orders
GROUP BY user_id

 

 
✅ 문제 4. 팀장 기준으로 모든 부하직원 출력
CREATE TABLE employee (
  emp_id INT,
  name VARCHAR(50),
  manager_id INT
);

INSERT INTO employee VALUES
(1, 'Alice', 2),
(2, 'Bob', 4),
(3, 'Charlie', 2),
(4, 'Diana', NULL),
(5, 'Eve', 1),
(6, 'Frank', 1);

 

설명: 특정 사람(예: 'Diana') 기준으로 하위 직원까지 모두 출력

 

테이블 구조:

  • employee(emp_id, name, manager_id)

요구사항:

  • Diana의 부하직원 전체 출력
  • 컬럼: emp_id, name, manager_id, level (Diana가 level 1)
WITH RECURSIVE tree AS (
  SELECT
  	emp_id,
    name,
    manager_id,
    1 AS level
  FROM employee
  WHERE name = 'Diana'
  
  UNION ALL
  
  SELECT
    e.emp_id,
    e.name,
    e.manager_id,
    t.level + 1
  FROM employee e
  JOIN tree t
    ON e.manager_id = t.emp_id
)

SELECT * FROM tree

 

 

✅ 문제 5. 사용자별로 최근 2건의 주문 출력

CREATE TABLE orders (
  user_id INT,
  order_id INT,
  order_date DATE
);

INSERT INTO orders VALUES
(1, 101, '2024-07-01'),
(1, 102, '2024-07-05'),
(1, 103, '2024-07-10'),
(2, 201, '2024-07-02'),
(2, 202, '2024-07-07'),
(3, 301, '2024-07-03');

 

설명: 각 user의 최근 주문 2건만 출력

 

테이블 구조:

  • orders(user_id, order_id, order_date)

요구사항:

  • user_id, order_id, order_date 출력
WITH ord AS (
  SELECT
    user_id,
    order_id,
    order_date,
    ROW_NUMBER() OVER (
      PARTITION BY user_id
      ORDER BY order_date DESC
      ) AS rn
  FROM orders
 )
 
SELECT
  user_id,
  order_id,
  order_date
FROM ord
WHERE rn <= 2

 

 

 

 

2번 문제를 반대로 생각했다. 상호 친구가 아닌 경우를 조회해야 하는데 상호 친구인 경우를 조회했다. 따라서 LEFT JOIN 과 IS NULL을 이용해서 상호 친구가 아닌 경우를 조회했다.

SELECT
FROM friend f1
LEFT JOIN friend f2
  ON f1.friend_id = f2.user_id
    AND f1.user_id = f2.friend_id
WHERE f2.user_id IS NULL

'SQL' 카테고리의 다른 글

실전 문제 풀이 (4)  (3) 2025.08.15
실전 문제 풀이 (3)  (2) 2025.08.13
실전 문제 풀이 (1)  (3) 2025.08.09
조건 처리 함수 - MySQL  (0) 2025.08.07
날짜 함수 - MySQL  (2) 2025.08.05