오늘은 SQL의 WHERE ROWNUM <= 3 vs TOP(3), DDL(데이터 정의어) 롤백 가능 여부, FK(외래키) 관계 및 릴레이션 생성, DELETE vs TRUNCATE vs DROP 등에 대해 학습했다.
이론뿐만 아니라 SQL Server와 Oracle의 차이점, DENSE_RANK()를 이용한 동일 순위 조회 방법, 그리고 트랜잭션과 데이터베이스 객체(뷰, 프로시저, 트리거)의 개념적 차이도 비교하면서 학습했다.
WHERE ROWNUM <= 3 vs SELECT TOP(3) 차이💡 문제: Oracle과 SQL Server에서 상위 N개 데이터를 가져오는 방법이 다를까?
💡 비교:
ROWNUM은 실행 순서에 따라 번호가 매겨지므로, ORDER BY와 함께 사용하려면 서브쿼리가 필요함
SELECT TOP(3)은 ORDER BY와 함께 바로 사용 가능하여 원하는 순위 데이터를 쉽게 가져올 수 있음
-- Oracle에서 상위 3개를 올바르게 가져오는 방법
SELECT * FROM (
SELECT * FROM employees ORDER BY salary DESC
) WHERE ROWNUM <= 3;
-- SQL Server에서 상위 3개를 가져오는 방법
SELECT TOP(3) * FROM employees ORDER BY salary DESC;
🔹 결론:
ROWNUM을 적용해야 정렬된 상위 N개를 정확히 조회할 수 있다.SELECT TOP(N)을 ORDER BY와 함께 사용하면 된다.WITH TIES vs DENSE_RANK())💡 문제: 동일한 3위까지 포함하여 조회하려면 어떻게 해야 할까?
💡 비교:
SQL Server에서는 WITH TIES를 사용하여 같은 순위의 데이터를 포함 가능
Oracle에서는 DENSE_RANK()를 활용하여 동일 순위를 보장해야 함
-- SQL Server: 동일한 3위 포함
SELECT TOP(3) WITH TIES * FROM employees ORDER BY salary DESC;
-- Oracle: 동일한 3위 포함
SELECT * FROM (
SELECT emp_id, emp_name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees
) WHERE rank <= 3;
🔹 결론:
SQL Server에서는 WITH TIES를 사용하면 쉽게 동일 순위까지 조회 가능.
Oracle에서는 DENSE_RANK()를 활용해야 동일한 3위를 포함할 수 있음.
💡 문제: CREATE, ALTER, DROP, TRUNCATE 같은 DDL 명령어는 ROLLBACK이 가능할까?
💡 비교:
DDL 명령어(CREATE, ALTER, DROP, TRUNCATE, RENAME)는 자동 COMMIT이 발생하므로 ROLLBACK 불가능
DROP TABLE 이후 FLASHBACK TABLE을 사용하면 복구 가능
DROP TABLE employees;
FLASHBACK TABLE employees TO BEFORE DROP; -- ✅ DROP 후 복구 가능
🔹 결론:
FLASHBACK TABLE을 사용하면 복구 가능하지만, PURGE를 사용하면 복구 불가. DELETE vs TRUNCATE vs DROP 차이💡 문제: 데이터를 삭제할 때 DELETE, TRUNCATE, DROP의 차이점은?
💡 비교:
| 명령어 | 작업 대상 | WHERE 사용 | ROLLBACK 가능 여부 | 속도 |
|---|---|---|---|---|
| DELETE | 특정 행 삭제 | ✅ 가능 | ✅ 가능 | 느림 |
| TRUNCATE | 모든 행 삭제 | ❌ 불가능 | ❌ 불가능 | 빠름 |
| DROP | 테이블 전체 삭제 | ❌ 불가능 | ❌ 불가능 | 가장 빠름 |
DELETE FROM employees WHERE department = 'IT'; -- ✅ 특정 행만 삭제 가능
TRUNCATE TABLE employees; -- ❌ 모든 데이터 삭제 (ROLLBACK 불가)
DROP TABLE employees; -- ❌ 테이블 구조까지 삭제됨
🔹 결론:
특정 행만 삭제하려면 DELETE 사용 (ROLLBACK 가능)
테이블 전체 데이터를 빠르게 삭제하려면 TRUNCATE 사용 (ROLLBACK 불가)
테이블 자체를 삭제하려면 DROP 사용 (ROLLBACK 불가)
Oracle에서 WHERE ROWNUM <= 3은 ORDER BY가 적용되기 전에 실행되므로 서브쿼리를 사용해야 정확한 결과를 얻을 수 있다.
SQL Server에서 WITH TIES, Oracle에서 DENSE_RANK()를 사용하면 동일한 3위까지 조회 가능하다.
DDL(CREATE, ALTER, DROP)은 ROLLBACK 불가능하며, 자동 COMMIT이 발생한다.
DELETE는 ROLLBACK 가능하지만, TRUNCATE와 DROP은 불가능하다.