[SQL] LeetCode 문제풀이 - SQL Basic Query Workstation (#175, #176, #181, #584, #1978)

Jinyoung Cheon·2026년 4월 13일

LeetCode

목록 보기
1/9

📋 오늘의 문제 목록

#문제난이도핵심 개념
175Combine Two TablesEasyLEFT JOIN
176Second Highest SalaryMediumDENSE_RANK, NULL 반환
181Employees Earning More Than Their ManagersEasySelf Join
584Find Customer RefereeEasyNULL 비교 연산
1978Employees Whose Manager Left the CompanyEasyNOT IN + 서브쿼리

🟢 175. Combine Two Tables

문제 요약

Person 테이블의 모든 사람에 대해 이름과 주소를 반환한다. Address 테이블에 주소가 없으면 NULL을 반환한다.

💡 핵심 개념 - JOIN의 종류

JOIN 종류결과
INNER JOIN양쪽 테이블 모두에 매칭되는 행만 반환
LEFT JOIN왼쪽 테이블은 전부 반환, 오른쪽에 없으면 NULL
RIGHT JOIN오른쪽 테이블은 전부 반환, 왼쪽에 없으면 NULL

❌ 틀렸던 이유

  • INNER JOIN을 쓰면 주소가 없는 사람이 결과에서 탈락해버림
  • 항상 "어느 테이블의 모든 행을 보존해야 하는가"를 먼저 생각할 것

✅ 최종 풀이

SELECT p.firstName, p.lastName, a.city, a.state
FROM Person p
LEFT JOIN Address a ON p.personId = a.personId

🟡 176. Second Highest Salary

문제 요약

Employee 테이블에서 두 번째로 높은 distinct salary를 반환한다. 없으면 NULL 반환.

💡 핵심 개념 - RANK() vs DENSE_RANK()

salaryRANK()DENSE_RANK()
30011
30011
20032
  • RANK() → 동점 시 다음 순위를 건너뜀 (1,1,3...)
  • DENSE_RANK() → 동점 시 순위를 연속으로 매김 (1,1,2...)

❌ 틀렸던 이유

  1. Window 함수를 같은 SELECT 절에서 바로 사용 → 서브쿼리 분리 필요
  2. RANK() 사용 → DENSE_RANK()로 변경
  3. NULL 반환 처리 누락 → MAX()로 감싸기

✅ 최종 풀이

SELECT MAX(salary) AS SecondHighestSalary
FROM (
    SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM Employee
) ranked
WHERE rnk = 2

🟡 181. Employees Earning More Than Their Managers

문제 요약

자신의 매니저보다 급여가 높은 직원의 이름을 반환한다.

💡 핵심 개념 - Self Join

같은 테이블을 두 개인 것처럼 alias를 다르게 줘서 JOIN하는 기법.

  • ON → 두 테이블을 어떻게 연결할 것인가 (관계 정의)
  • WHERE → 연결된 결과에서 어떤 행을 필터링할 것인가 (조건 적용)

✅ 최종 풀이

SELECT e.name AS Employee
FROM Employee e
JOIN Employee m ON e.managerId = m.id
WHERE e.salary > m.salary

🟢 584. Find Customer Referee

문제 요약

referee_id가 2가 아니거나, 추천인이 없는(NULL) 고객의 이름을 반환한다.

💡 핵심 개념 - NULL과의 비교 연산

NULL과의 모든 비교 연산은 TRUE/FALSE가 아닌 NULL(unknown)을 반환한다.

  • referee_id != 2 에서 NULL인 행 → 결과가 NULL → WHERE 조건 탈락!
  • 반드시 IS NULL로 명시적으로 체크해야 한다.

❌ 틀렸던 이유

  1. 불필요한 Self Join 시도
  2. NULL 처리 누락
  3. IS NOT IN → 없는 문법, NOT IN이 올바름

✅ 최종 풀이

SELECT name
FROM Customer
WHERE referee_id != 2 OR referee_id IS NULL

🟡 1978. Employees Whose Manager Left the Company

문제 요약

급여가 $30,000 미만이면서 매니저가 회사를 떠난 직원의 ID를 반환한다.

💡 핵심 개념 - NOT IN + 서브쿼리

manager_id의미
NULL처음부터 매니저 없음 (최상위 직원)
존재하지 않는 ID매니저가 퇴사함 ← 우리가 찾는 경우

❌ 틀렸던 이유

  1. IS NOT IN 문법 오류 → NOT IN으로 수정
  2. <= 30000 → strictly less than이므로 < 30000
  3. manager_id IS NOT NULL 누락

✅ 최종 풀이

SELECT employee_id
FROM Employees
WHERE salary < 30000
  AND manager_id IS NOT NULL
  AND manager_id NOT IN (SELECT employee_id FROM Employees)
ORDER BY employee_id

🔑 오늘의 핵심 정리

개념한 줄 요약
LEFT JOIN기준 테이블의 모든 행 보존, 매칭 없으면 NULL
Self Join같은 테이블을 두 번 사용해 계층 관계 비교
DENSE_RANK동점자가 있어도 순위를 연속으로 매김
NULL 비교= NULL ❌ → IS NULL ✅
NOT INIS NOT IN ❌ → NOT IN ✅, NULL 포함 시 주의
profile
데이터를 향해, 한 걸음씩 천천히.

0개의 댓글