[TIL] SQLD 관리구문 공부하면서 (2025-02-18)

김대진·2025년 2월 18일

[TIL]

목록 보기
8/8
post-thumbnail

✅ 오늘 공부한 거

오늘은 SQL의 WHERE ROWNUM <= 3 vs TOP(3), DDL(데이터 정의어) 롤백 가능 여부, FK(외래키) 관계 및 릴레이션 생성, DELETE vs TRUNCATE vs DROP 등에 대해 학습했다.
이론뿐만 아니라 SQL Server와 Oracle의 차이점, DENSE_RANK()를 이용한 동일 순위 조회 방법, 그리고 트랜잭션과 데이터베이스 객체(뷰, 프로시저, 트리거)의 개념적 차이도 비교하면서 학습했다.


📌 1. 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;

🔹 결론:

  • Oracle에서는 서브쿼리를 활용하여 ROWNUM을 적용해야 정렬된 상위 N개를 정확히 조회할 수 있다.
  • SQL Server에서는 SELECT TOP(N)ORDER BY와 함께 사용하면 된다.

📌 2. 동일한 3위를 포함하여 조회 (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위를 포함할 수 있음.


📌 3. DDL(데이터 정의어)과 ROLLBACK 가능 여부

  • 💡 문제: 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 후 복구 가능

🔹 결론:

  • DDL 명령어는 실행 즉시 COMMIT되므로 ROLLBACK 불가능.
  • DROP TABLE 후 FLASHBACK TABLE을 사용하면 복구 가능하지만, PURGE를 사용하면 복구 불가.

📌 4. 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 불가)


✅ 오늘의 배운 점 정리

  1. Oracle에서 WHERE ROWNUM <= 3ORDER BY적용되기 전에 실행되므로 서브쿼리를 사용해야 정확한 결과를 얻을 수 있다.

  2. SQL Server에서 WITH TIES, Oracle에서 DENSE_RANK()를 사용하면 동일한 3위까지 조회 가능하다.

  3. DDL(CREATE, ALTER, DROP)은 ROLLBACK 불가능하며, 자동 COMMIT이 발생한다.

  4. DELETEROLLBACK 가능하지만, TRUNCATEDROP불가능하다.

0개의 댓글