본문 바로가기
데이터 모델과 SQL

[데이터 모델과 SQL] 17. 정보 삭제 - DELETE

by 영바이트 2023. 2. 8.

 

테이블에서 행들을 삭제할 때는 DELETE 명령을 사용한다.
문법: DELETE FROM <테이블 이름> [WHERE 검색 조건]

DELETE 명령에서 WHERE 조건절을 지정하지 않으면 테이블의 모든 행을 삭제한다. 거의 모든 경우 WHERE 조건 절이 알맞게 지정되었는지 먼저 SELECT 명령을 사용하여 살펴보는 것을 추천한다.

예) 모든 볼링 플레이어 데이터를 삭제한다.

DELETE FROM bowlers;

 

DELETE 명령으로 데이터를 삭제할 때 다른 테이블에 연결된 데이터가 존재할 경우 삭제가 이루어지지 않을 수 있다. 데이터를 삭제할 때 아래 두 가지 중 하나의 규칙이 적용된다.
· restrict deletion rule(삭제 제한, R): 만약 다른 테이블에 삭제 대상과 연결된 데이터가 존재한다면 삭제 대상 데이터를 삭제할 수 없다.
· cascade deletion rule(연관 삭제, C): 데이터를 삭제할 때는 삭제 대상 데이터와 연결된 데이터들을 모두 삭제해주어야 한다.
고아행(orphaned row)이 생기지 않도록 위 두 규칙 중 하나를 반드시 지켜야 한다.

예) OrderTotal이 0인 행들을 orders 테이블에서 삭제하라.

DELETE FROM orders WHERE orders.OrderTotal=0;

 

삭제 조건을 지정하는 WHERE 구문에 서브쿼리를 사용할 수 있다.

예) 상세 주문 데이터가 없는 행들을 orders 테이블에서 삭제하라.

 

위 예의 내용을 위한 SQL을 아래와 같이 구성해 볼 수 있다.

① orders 테이블에서 주문 ID를 출력하는 구문을 구성해본다.
SELECT orders.OrderID FROM orders

② orderdetails 테이블에서 주문 ID를 검색하기 위한 서브쿼리를 구성한다.
SELECT OrderID FROM orderdetails WHERE orders.OrderID = orderdetails.OrderID

③ orderdetails 테이블에 주문 데이터가 없는 주문을 검색한다.
SELECT orders.OrderNumber FROM orders WHERE NOT EXISTS (SELECT orderdetails.OrderNumber FROM orderdetails WHERE orders.OrderNumber=orderdetails.OrderNumber);

 

④ ③의 검색식을 이용해서 DELETE 명령을 구성한다.

DELETE FROM orders 
WHERE NOT EXIST (SELECT OrderID FROM orderdetails WHERE orders.OrderID = orderdetails.OrderID);

 


 

● DELETE 구문을 사용하는 SQL 요청식의 예


예) 주문 기록이 없는 고객들을 고객 테이블에서 삭제하라.
주문 기록이 없는 고객을 찾는 검색식을 아래와 같이 두 가지로 구성해 볼 수 있다.

 

ⓐSELECT customers.CustomerID FROM customers WHERE NOT EXISTS (SELECT CustomerID FROM orders WHERE orders.CustomerID=customers.CustomerID);

ⓑSELECT customers.CustomerID FROM customers LEFT OUTER JOIN orders ON customers.CustomerID=orders.CustomerID WHERE orders.OrderNumber IS NULL;

 

ⓐ, ⓑ 둘 중 어떤 검색식을 이용하여 DELETE 명령을 구성해도 된다.
ⓐ를 이용한 DELETE 요청식

DELETE FROM customers 
WHERE NOT EXISTS (SELECT CustomerID FROM orders WHERE orders.CustomerID=customers.CustomerID);


ⓑ를 이용한 DELETE 요청식

DELETE FROM customers 
WHERE customers.CustomerID IN (SELECT customers.CustomerID 
FROM customers LEFT OUTER JOIN orders ON customers.CustomerID=orders.CustomerID 
WHERE orders.OrderNumber IS NULL);

 

예) 한 번도 게임을 가진 적이 없는 볼링 플레이어들의 데이터를 bowlers 테이블에서 삭제하라.

먼저 한 번도 게임을 가진 적이 없는 볼링 플레이어들을 검색하는 검색식을 만들어본다.

ⓐSELECT bowlers.BowlerID FROM bowlers WHERE NOT EXISTS (SELECT bowlerscores.BowlerID FROM bowlerscores WHERE bowlerscores.BowlerID=bowlers.BowlerID);

ⓑSELECT bowlers.BowlerID FROM bowlers LEFT OUTER JOIN bowlerscores ON bowlers.BowlerID=bowlerscores.BowlerID WHERE bowlerscores.BowlerID IS NULL;

 

검색식을 참고하여 DELETE 요청식을 구성한다.
ⓐ를 이용한 DELETE 요청식

DELETE FROM bowlers 
WHERE NOT EXISTS (
SELECT bowlerscores.BowlerID 
FROM bowlerscores 
WHERE bowlerscores.BowlerID=bowlers.BowlerID);


ⓑ를 이용한 DELETE 요청식

DELETE FROM bowlers 
WHERE bowlers.BowlerID IN (
SELECT bowlers.BowlerID 
FROM bowlers LEFT OUTER JOIN bowlerscores ON bowlers.BowlerID=bowlerscores.BowlerID 
WHERE bowlerscores.BowlerID IS NULL);

 

★★ DELETE 명령을 이용하여 테이블에서 데이터를 삭제하면 복구가 불가능하다. 따라서 SELECT 구문을 사용하여 삭제 대상 데이터들을 확인한 후 삭제를 진행해야 한다.

 

댓글