내코가석자

[SQL] LeetCode Quest - Database(SQL Basic Query Workstation)

gani00 2026. 6. 18. 14:40

Database - SQL Basic Query Workstation

 

준비됬나요~


Q1. Combine Two Tables

문제

두 개의 테이블 Person, Address가 있을 때
Person의 모든 사람 정보를 유지하면서 주소 정보를 결합한다.

풀이

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

핵심 개념: LEFT JOIN

LEFT JOIN은 왼쪽 테이블의 모든 데이터를 유지하고, 오른쪽 테이블과 매칭되는 데이터만 가져온다.

구조:

SELECT *
FROM A
LEFT JOIN B
ON A.key = B.key;
 

예:

Person

personId name
1 Kim
2 Lee

Address

personId city
1 Seoul

결과:

name city
Kim Seoul
Lee NULL

주소가 없어도 Person 데이터는 유지된다.


Q2. Employees Earning More Than Their Managers

문제

자신의 매니저보다 급여가 높은 직원 찾기

풀이

SELECT e1.name AS Employee
FROM Employee e1
JOIN Employee e2
    ON e1.managerId = e2.id
WHERE e1.salary > e2.salary;
 

핵심 개념: SELF JOIN

같은 테이블을 두 번 사용해서 비교.

구조:

FROM Employee e1
JOIN Employee e2
ON e1.managerId = e2.id
 

의미:

  • e1 → 직원
  • e2 → 매니저

비교:

e1.salary > e2.salary
 

직원 급여 > 매니저 급여


Q3. Not Boring Movies

문제

다음 조건 만족하는 영화 조회

조건:

  • id가 홀수
  • description이 boring이 아님
  • rating 기준 내림차순 정렬

풀이

SELECT *
FROM Cinema
WHERE id % 2 = 1
AND description != 'boring'
ORDER BY rating DESC;
 

핵심 개념

1. 홀수 체크

id % 2 = 1
 

예:

1 % 2 = 1  → 홀수
2 % 2 = 0  → 짝수
 

2. 특정 값 제외

description != 'boring'
 

또는:

description <> 'boring'
 

3. 컬럼 값 확인

description에 어떤 값이 존재하는지 확인:

SELECT DISTINCT description
FROM Cinema;
 

Python:

df["description"].unique()
 

와 같은 역할.

결과:

funny
boring
interesting
 

Q4. Find Customer Referee

문제

referee_id가 2가 아닌 고객 조회
단, referee 정보가 없는(NULL) 고객 포함

풀이

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

핵심 개념: NULL 처리

NULL은 비교 연산 불가능.

잘못된 방법:

referee_id = NULL
 

사용:

referee_id IS NULL
 

NULL 제외:

referee_id IS NOT NULL
 

Review Quiz

Q1. Employees Whose Manager Left the Company

문제

  • 급여가 30000 미만
  • 매니저가 퇴사한 직원 조회

조건:

manager_id가 존재하지만
해당 manager_id가 Employee 테이블에 없음
 

방법 1. Subquery

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

동작 방식

서브쿼리:

SELECT employee_id
FROM Employees
 

현재 존재하는 직원 목록 조회

예:

1
2
3
4
 

비교:

manager_id NOT IN (1,2,3,4)
 

없는 매니저 = 퇴사


방법 2. LEFT JOIN

SELECT e1.employee_id
FROM Employees e1
LEFT JOIN Employees e2
    ON e2.employee_id = e1.manager_id
WHERE e1.salary < 30000
AND e1.manager_id IS NOT NULL
AND e2.employee_id IS NULL
ORDER BY e1.employee_id;
 

핵심 개념: 존재하지 않는 데이터 찾기

패턴:

LEFT JOIN
+
IS NULL
 

의미:

왼쪽 데이터는 있는데
오른쪽 매칭 데이터가 없음
 

즉:

직원 → 존재
매니저 → 없음
 

= 매니저 퇴사

 


기억할 SQL 실행 순서

실제로 SQL은 작성 순서와 실행 순서가 다름.

실행 순서:

FROM
 ↓
WHERE
 ↓
GROUP BY
 ↓
HAVING
 ↓
SELECT
 ↓
ORDER BY
 ↓
LIMIT

 

SQL 문제 풀 때는 항상:

  1. 어떤 테이블에서 가져오는지 (FROM)
  2. 어떤 조건인지 (WHERE)
  3. 어떻게 정렬할지 (ORDER BY)

두번째 단계로 돌아오겠다. 아비백~