제2정규형
부분 함수 종속을 제거한 정규형이다
복합키 일부에만 종속된 컬럼을 분리해야 한다.
Card
emy
← 탐색으로 돌아가기
이 단계에서는 SQLD 시험 스타일 자체에 적응한다. 자주 나오는 함정 보기, 헷갈리는 개념 비교, 실행 결과 추론 문제를 반복적으로 훈련한다. 문제를 읽자마자 핵심 포인트를 찾는 연습과 오답 제거 능력을 함께 만든다. 실제 시험에서 시간 부족이 자주 발생하기 때문에 빠르게 해석하는 훈련도 포함된다.
무료 체험 퀴즈
제2정규형
부분 함수 종속을 제거한 정규형이다
복합키 일부에만 종속된 컬럼을 분리해야 한다.
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
전체 평균 급여보다 높은 직원만 조회한다
집계 함수 결과를 서브쿼리로 비교하는 SQLD 대표 패턴이다.
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 5
직원 수가 5명을 초과하는 부서만 조회한다
HAVING은 GROUP BY 이후 집계 결과 조건에 사용한다.
SELECT * FROM employees WHERE commission_pct IS NULL
commission_pct 값이 없는 직원만 조회한다
NULL 비교는 =이 아니라 IS NULL을 사용해야 한다.
SELECT * FROM employees WHERE commission_pct = NULL
올바르지 않은 NULL 비교 방식이다
NULL은 = 연산자로 비교할 수 없다는 함정 문제다.
아래 문항들은 이 학습지에 수록된 카드입니다. 로그인하면 이 학습지를 내 계정으로 복사해 카드를 한 장씩 넘기며 반복 학습할 수 있고, 숙달한 카드는 완료 표시하여 다음 세션에서 제외할 수 있습니다.
제2정규형
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
SELECT department_id, COUNT(*) FROM employees GROUP BY department_id HAVING COUNT(*) > 5
SELECT * FROM employees WHERE commission_pct IS NULL
SELECT * FROM employees WHERE commission_pct = NULL
SELECT * FROM employees WHERE department_id IN (10,20,30)
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 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, 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 employee_id, CASE WHEN salary >= 5000 THEN 'HIGH' ELSE 'LOW' END FROM employees
SELECT employee_id, DECODE(department_id,10,'SALES',20,'HR','ETC') 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 employees e RIGHT JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e FULL OUTER JOIN departments d ON e.department_id = d.department_id
SELECT * FROM employees e, departments d WHERE e.department_id = d.department_id
SELECT * FROM employees e CROSS JOIN departments d
SELECT * FROM employees e WHERE EXISTS (SELECT 1 FROM employees m WHERE e.manager_id = m.employee_id)
SELECT * FROM employees e WHERE salary = (SELECT MAX(salary) FROM employees WHERE department_id = e.department_id)
SELECT * FROM users u LEFT JOIN orders o ON u.user_id = o.user_id WHERE o.order_id IS NULL
SELECT COUNT(*) FROM employees
SELECT COUNT(commission_pct) FROM employees
SELECT DISTINCT department_id FROM employees
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 5000
SELECT * FROM employees ORDER BY salary DESC
SELECT * FROM employees ORDER BY salary ASC
SELECT employee_id, salary, SUM(salary) OVER(ORDER BY hiredate) FROM employees
SELECT employee_id, department_id, AVG(salary) OVER(PARTITION BY department_id) 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 employee_id, NTILE(4) OVER(ORDER BY salary DESC) FROM employees
SELECT employee_id, CUME_DIST() OVER(ORDER BY salary DESC) FROM employees
SELECT employee_id, PERCENT_RANK() OVER(ORDER BY salary DESC) 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
COMMIT
ROLLBACK
SAVEPOINT sp1
ROLLBACK TO sp1
원자성
일관성
격리성
지속성
기본키
외래키
참조 무결성
제1정규형
제3정규형
반정규화