ROLLBACK
현재 트랜잭션 작업 내용을 취소한다
마지막 COMMIT 이전 상태로 되돌린다.
Card
emy
← 탐색으로 돌아가기
실전 시험 흐름으로 전체 내용을 통합한다. 시간 제한 안에서 문제를 푸는 훈련을 하며, 자주 틀리는 개념을 다시 정리한다. 특히 JOIN, 모델링, 윈도우 함수처럼 고득점 핵심 파트를 집중 보완한다. 시험 직전 최종 정리까지 가능하도록 구성된 실전 마무리 단계다.
무료 체험 퀴즈
ROLLBACK
현재 트랜잭션 작업 내용을 취소한다
마지막 COMMIT 이전 상태로 되돌린다.
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
전체 평균 급여보다 높은 직원만 조회한다
집계 함수와 단일행 서브쿼리를 함께 사용하는 SQLD 대표 실전 문제다.
SELECT * FROM employees e WHERE salary = (SELECT MAX(salary) FROM employees WHERE department_id = e.department_id)
각 부서에서 가장 높은 급여를 받는 직원만 조회한다
상관 서브쿼리 핵심 패턴이며 SQLD 빈출 문제다.
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 5
직원이 5명을 초과하는 부서만 조회한다
GROUP BY 이후 HAVING 조건 적용 순서를 자주 물어본다.
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 5000
평균 급여가 5000 초과인 부서만 조회한다
집계 함수 조건은 WHERE가 아니라 HAVING에 작성해야 한다.
아래 문항들은 이 학습지에 수록된 카드입니다. 로그인하면 이 학습지를 내 계정으로 복사해 카드를 한 장씩 넘기며 반복 학습할 수 있고, 숙달한 카드는 완료 표시하여 다음 세션에서 제외할 수 있습니다.
ROLLBACK
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
SELECT * FROM employees e WHERE salary = (SELECT MAX(salary) FROM employees WHERE department_id = e.department_id)
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 5
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 5000
SELECT * FROM employees WHERE commission_pct IS NULL
SELECT * FROM employees WHERE commission_pct = NULL
SELECT * FROM employees WHERE department_id NOT IN (10,20,NULL)
SELECT * FROM employees WHERE EXISTS (SELECT 1 FROM departments d WHERE employees.department_id = d.department_id)
SELECT * FROM employees WHERE salary > ALL (SELECT salary FROM employees WHERE department_id = 10)
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department_id = 10)
SELECT employee_id, RANK() OVER(ORDER BY salary DESC) FROM employees
SELECT employee_id, DENSE_RANK() OVER(ORDER BY salary DESC) FROM employees
SELECT employee_id, ROW_NUMBER() OVER(ORDER BY salary DESC) FROM employees
SELECT employee_id, department_id, AVG(salary) OVER(PARTITION BY department_id) FROM employees
SELECT employee_id, salary, SUM(salary) OVER(ORDER BY hiredate) FROM employees
SELECT employee_id, LAG(salary) OVER(ORDER BY hiredate) FROM employees
SELECT employee_id, LEAD(salary) OVER(ORDER BY hiredate) FROM employees
SELECT department_id, SUM(salary) FROM employees GROUP BY ROLLUP(department_id)
SELECT department_id, SUM(salary) FROM employees GROUP BY CUBE(department_id)
SELECT department_id, SUM(salary) FROM employees GROUP BY GROUPING SETS(department_id,())
SELECT employee_id, CASE WHEN salary >= 10000 THEN 'A' WHEN salary >= 5000 THEN 'B' ELSE 'C' END FROM employees
SELECT employee_id, DECODE(department_id,10,'SALES',20,'HR','ETC') FROM employees
SELECT employee_id, NVL(commission_pct,0) FROM employees
SELECT employee_id, COALESCE(commission_pct,bonus_pct,0) FROM employees
SELECT employee_id, NULLIF(salary,0) FROM employees
SELECT * FROM employees WHERE first_name LIKE 'K%'
SELECT * FROM employees WHERE first_name LIKE '%K'
SELECT * FROM employees WHERE UPPER(first_name) = 'KIM'
SELECT * FROM employees WHERE hiredate >= TO_DATE('20250101','YYYYMMDD') AND hiredate < TO_DATE('20260101','YYYYMMDD')
SELECT * FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id
SELECT * FROM users u LEFT JOIN orders o ON u.user_id = o.user_id WHERE o.order_id IS NULL
SELECT * FROM employees e, departments d WHERE e.department_id = d.department_id
SELECT * FROM employees e CROSS JOIN departments d
SELECT COUNT(*) FROM employees
SELECT COUNT(commission_pct) FROM employees
SELECT DISTINCT department_id FROM employees
SELECT * FROM employees ORDER BY salary DESC
SELECT * FROM employees ORDER BY salary ASC
SELECT * FROM employees WHERE department_id IN (10,20,30)
SELECT * FROM employees WHERE department_id BETWEEN 10 AND 30
SELECT * FROM employees WHERE department_id NOT BETWEEN 10 AND 30
SELECT * FROM employees WHERE first_name LIKE '_A%'
SELECT employee_id, TO_CHAR(hiredate,'YYYYMMDD') FROM employees
SELECT employee_id, TO_DATE('20250515','YYYYMMDD') FROM employees
SELECT employee_id, ROUND(salary,-2) FROM employees
SELECT employee_id, TRUNC(salary,-2) FROM employees
SELECT employee_id, MOD(salary,1000) FROM employees
SELECT employee_id, department_id FROM employees WHERE department_id = 10
TABLE ACCESS FULL
INDEX RANGE SCAN
INDEX UNIQUE SCAN
TABLE ACCESS BY INDEX ROWID
HASH JOIN
NL JOIN
SORT MERGE JOIN
SELECT /*+ INDEX(employees idx_emp_dept) */ * FROM employees WHERE department_id = 10
SELECT /*+ FULL(employees) */ * FROM employees
SELECT /*+ USE_HASH(d) */ * FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT /*+ USE_NL(d) */ * FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT /*+ LEADING(e d) */ * FROM employees e JOIN departments d ON e.department_id = d.department_id
COMMIT
SAVEPOINT sp1
ROLLBACK TO sp1
원자성
일관성
격리성
지속성
기본키
외래키
참조 무결성
제1정규형
제2정규형
제3정규형
반정규화