SQLD 2과목 SQL 기본·활용 빈출 개념 총정리
목록으로Tips
2026. 06. 21

SQLD 2과목 SQL 기본·활용 빈출 개념 총정리

합격선을 못 넘게 하는 그 개념들

SQLD 2과목에서 40점 이상을 취득해야 합격합니다. 그런데 응시자들이 자주 틀리는 부분을 보면 공통점이 있습니다. 개념은 알았다고 생각하는데 실제 문제를 풀면 헷갈린다는 것입니다. NULL 값이 어떻게 동작하는지, 윈도우 함수의 RANK와 DENSE_RANK는 뭐가 다른지, 서브쿼리가 얼마나 다양한 형태로 나오는지—이런 것들이 명확하지 않으면 점수 차이가 납니다.

지금부터 시험장에서 헷갈리는 5가지 개념을 정확히 정리하겠습니다. 각각을 실제 문제 맥락에서 이해하면 2과목 점수가 크게 올라갑니다.

1. NULL 처리 함수: NVL, NULLIF, COALESCE

왜 틀리나: 세 함수의 쓰임새가 비슷해 보이지만 동작이 완전히 다릅니다.

NULL 값을 어떻게 처리할지는 SELECT 결과에 바로 영향을 줍니다. 한 함수를 잘못 쓰면 그 행의 답이 달라집니다.

NVL(column, replacement): NULL이면 replacement로 바꾼다.

SELECT NVL(commission, 0) FROM employees;
-- commission이 NULL이면 0으로 표시

NULLIF(expr1, expr2): expr1과 expr2가 같으면 NULL로 반환한다.

SELECT NULLIF(salary, 5000) FROM employees;
-- salary가 5000이면 NULL로 표시, 아니면 salary 값 그대로

COALESCE(expr1, expr2, expr3, ...): 왼쪽부터 NULL이 아닌 첫 번째 값을 반환한다.

SELECT COALESCE(bonus, commission, 0) FROM employees;
-- bonus가 NULL이 아니면 bonus, NULL이면 commission, 그것도 NULL이면 0

시험 문제는 보통 "NULL을 0으로 처리하세요" 같은 명확한 지시를 줍니다. NVL을 쓰면 끝입니다. 하지만 "같은 값이 나오는 행은 제외" 같은 조건이 숨어있으면 NULLIF를 써야 합니다. 문제를 읽을 때 어떤 NULL 처리를 요구하는지 정확히 파악하세요.

2. 윈도우 함수: RANK, DENSE_RANK, ROW_NUMBER의 실제 차이

왜 틀리나: 세 함수 모두 "순위"를 매기는데, 동점 처리 방식이 다릅니다.

윈도우 함수는 GROUP BY와 다릅니다. 행을 지우지 않고 각 행에 순위나 누계를 붙입니다.

RANK(): 동점이면 같은 순위를 주고, 다음 순위는 건너뜁니다.

RANK() OVER (ORDER BY salary DESC)
-- 100, 100, 90 → 순위 1, 1, 3

DENSE_RANK(): 동점이면 같은 순위를 주지만, 다음 순위는 건너뛰지 않습니다.

DENSE_RANK() OVER (ORDER BY salary DESC)
-- 100, 100, 90 → 순위 1, 1, 2

ROW_NUMBER(): 동점이 있어도 모든 행에 유일한 번호를 줍니다.

ROW_NUMBER() OVER (ORDER BY salary DESC)
-- 100, 100, 90 → 순위 1, 2, 3

시험 문제는 보통 "상위 3명의 직원을 뽑되, 급여가 같으면 모두 포함" 같은 지시를 줍니다. 이때는 DENSE_RANK로 2등까지 찾아야 3명이 나옵니다. 문제 지시를 정확히 읽고 어떤 함수를 써야 하는지 결정하세요.

3. 서브쿼리: 스칼라, 인라인뷰, 중첩의 구분

왜 틀리나: 서브쿼리가 어디에 쓰이는지에 따라 결과가 달라집니다. 문법상 작동해도 의도와 다를 수 있습니다.

스칼라 서브쿼리 (SELECT절): 각 행마다 실행되며, 정확히 1개 행 1개 열을 반환해야 합니다.

SELECT employee_id, 
       (SELECT MAX(salary) FROM employees) AS max_salary
FROM employees;

인라인뷰 (FROM절): 서브쿼리 결과가 임시 테이블이 됩니다. 여러 행, 여러 열을 반환할 수 있습니다.

SELECT * 
FROM (SELECT department_id, COUNT(*) as cnt 
      FROM employees GROUP BY department_id) sub
WHERE sub.cnt > 5;

중첩 서브쿼리 (WHERE절): 외부 쿼리의 각 행을 필터링합니다. IN, EXISTS 등을 사용합니다.

SELECT * FROM employees
WHERE department_id IN (SELECT department_id 
                        FROM departments 
                        WHERE location = 'New York');

성능과 가독성 차이도 있습니다. 스칼라 서브쿼리는 각 행마다 실행되므로 느릴 수 있고, 인라인뷰는 먼저 계산되므로 보통 더 효율적입니다. 시험에서는 문법만 맞으면 되지만, 어떤 서브쿼리를 써야 하는지 구분할 수 있어야 합니다.

4. CASE WHEN으로 조건부 계산

왜 틀리나: CASE WHEN을 쓸 때 조건 순서와 ELSE 처리를 실수하기 쉽습니다.

CASE WHEN은 위에서 아래로 순차 실행됩니다. 먼저 참이 되는 WHEN을 실행하고 나머지는 무시합니다.

SELECT employee_id,
       CASE WHEN salary >= 5000 THEN 'High'
            WHEN salary >= 3000 THEN 'Medium'
            ELSE 'Low'
       END AS salary_grade
FROM employees;

주의할 점: ELSE를 빠뜨리면 조건에 맞지 않는 행은 NULL이 됩니다. 시험 문제에서 "모든 직원을 분류하세요"라고 했는데 ELSE가 없으면 일부 행이 빈다는 뜻이므로 오답입니다.

또한 조건의 순서가 중요합니다. salary >= 5000을 먼저 체크하고 나서 >= 3000을 체크해야 올바른 결과가 나옵니다. 반대로 하면 모든 사람이 Medium 이상으로 분류될 것입니다.

5. JOIN의 종류와 NULL 처리

왜 틀리나: INNER와 OUTER의 차이를 알지만, 실제 문제에서 어떤 JOIN을 써야 하는지 판단을 못 합니다.

JOIN 종류 특징
INNER JOIN양쪽 테이블에 모두 존재하는 행만
LEFT OUTER JOIN왼쪽 테이블의 모든 행 + 오른쪽에 매칭되는 행
RIGHT OUTER JOIN오른쪽 테이블의 모든 행 + 왼쪽에 매칭되는 행
FULL OUTER JOIN양쪽 테이블의 모든 행

중요한 것은 JOIN 후 NULL이 생긴다는 점입니다. LEFT OUTER JOIN을 하면 오른쪽 테이블 칼럼이 NULL로 나타날 수 있습니다. 문제에서 "모든 직원을 포함하되, 부서 정보가 없으면 표시" 같은 지시가 있으면 LEFT OUTER JOIN이고, 추가로 "부서 정보가 없는 행은 제외" 같은 조건이 있으면 WHERE절에서 NULL을 필터링해야 합니다.

실제 시험 문제는 "직원 수가 5명 이상인 부서의 직원 목록"처럼 복합 조건을 줍니다. 이때는 부서 테이블과 직원 테이블을 JOIN한 후 GROUP BY로 부서별 인원을 세고, HAVING으로 5명 이상만 필터링합니다. 차근차근 풀어야 합니다.

GROUP BY와 집계 함수의 함정

한 가지 더 짚고 넘어갈 부분이 있습니다. GROUP BY를 쓰면 SELECT절에는 GROUP BY 칼럼이나 집계 함수(SUM, COUNT, MAX 등)만 올 수 있습니다. 다른 칼럼을 마음대로 SELECT하면 에러가 나거나 예상 외 결과가 나옵니다.

-- 잘못된 쿼리
SELECT department_id, employee_name, SUM(salary)
FROM employees
GROUP BY department_id;
-- 에러: employee_name이 GROUP BY에 없음

-- 올바른 쿼리
SELECT department_id, COUNT(*) as cnt, SUM(salary) as total_salary
FROM employees
GROUP BY department_id;

GROUP BY를 제대로 이해하면 윈도우 함수와의 차이도 명확해집니다. 윈도우 함수는 행을 지우지 않고 각 행에 값을 붙이고, GROUP BY는 행을 줄입니다.

지금 시작하는 가장 빠른 방법

위의 5가지 개념은 SQLD 2과목 40문제 중 70% 이상을 차지합니다. 이 개념들을 확실히 이해하고 비슷한 문제를 반복해서 풀면 합격선을 넘을 수 있습니다.

알고런의 SQLD 올인원 강의는 2과목 빈출 개념을 실제 기출 문제와 함께 설명합니다. 각 개념별로 3~5개의 변형 문제를 풀어보니 시험장에서 헷갈리지 않게 됩니다. 62회(8월 22일) 시험을 준비한다면 지금이 시작할 때입니다.

SQLD 올인원 보러가기 →

AlgoLearn Team

IT 교육 콘텐츠 에디터

SQLD 2과목 SQL 기본·활용 빈출 개념 총정리 | AlgoLearn 기술 블로그 | AlgoLearn