DELETE
DELETE
DELETE 명령은 테이블에서 행을 제거하는 DML 명령이에요. WHERE 절로 제거할 행을 지정할 수 있습니다.
출처: DELETE
본문
테이블에서 행을 제거하는 명령입니다. WHERE 절로 어떤 행을 제거할지 지정할 수 있어요. 제거할 행을 식별하기 위해 서브쿼리나 추가 테이블을 사용해야 한다면 USING 절에 그 서브쿼리나 테이블을 지정합니다.
중요
TRUNCATE TABLE과 달리 이 명령은 외부 파일 로드 기록을 삭제하지 않아요. 스테이징된 파일에서 테이블로 로드한 행을 삭제하면, 파일을 수정하고 다시 스테이징하지 않는 한 그 파일에서 다시 데이터를 로드할 수 없습니다.
Syntax
DELETE FROM <table_name>
[ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
[ WHERE <condition> ]
Required parameters (필수 파라미터)
table_name— 행이 제거되는 테이블을 지정해요.
Optional parameters (선택 파라미터)
USING <additional_table_or_query> [, ...]— 제거할 행을 식별하는 데 도움이 되도록WHERE절에서 추가 테이블을 참조해야 한다면 그 테이블 이름을USING절에 지정해요.USING절로 제거할 행을 식별하는 서브쿼리를 지정할 수도 있습니다. 서브쿼리를 지정하면 괄호로 감쌉니다. 테이블이나 쿼리를 두 개 이상 지정하면 쉼표로 구분해요.WHERE <condition>— 제거할 행을 선택하는 데 사용할 조건을 지정해요. 이 파라미터를 생략하면 테이블의 모든 행이 제거되지만 테이블은 남아 있어요.
Usage notes (사용 참고 사항)
DELETE는 행 데이터를 제거하되 테이블 객체 자체는 유지해요. 모든 행을 제거하려면 WHERE 절을 생략하거나 TRUNCATE TABLE을 사용할 수 있습니다.
Examples (예제)
자전거를 임대하는 조직이 다음 테이블을 사용한다고 가정해요.
테이블을 만들어 봅시다.
CREATE TABLE leased_bicycles (bicycle_id INTEGER, customer_id INTEGER);
CREATE TABLE returned_bicycles (bicycle_id INTEGER);
데이터를 로드해 봅시다.
INSERT INTO leased_bicycles (bicycle_ID, customer_ID) VALUES
(101, 1111),
(102, 2222),
(103, 3333),
(104, 4444),
(105, 5555);
INSERT INTO returned_bicycles (bicycle_ID) VALUES
(102),
(104);
이 예제는 WHERE 절을 사용해 지정된 행을 삭제하는 방법을 보여줘요. 이 예제는 bicycle_ID로 삭제합니다.
DELETE FROM leased_bicycles WHERE bicycle_ID = 105;
+------------------------+
| number of rows deleted |
|------------------------|
| 1 |
+------------------------+
삭제 후의 데이터를 보여줍니다.
SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
| 101 | 1111 |
| 102 | 2222 |
| 103 | 3333 |
| 104 | 4444 |
+------------+-------------+
이 예제는 USING 절로 삭제할 행을 지정하는 방법을 보여줘요. 이 USING 절은 leased_bicycles 테이블에서 삭제할 자전거의 ID를 나열하는 returned_bicycles 테이블을 지정합니다. WHERE 절은 leased_bicycles 테이블을 returned_bicycles 테이블에 조인하며, leased_bicycles의 행 중 returned_bicycles의 해당 행과 같은 bicycle_ID를 가진 행이 삭제됩니다.
BEGIN WORK;
DELETE FROM leased_bicycles
USING returned_bicycles
WHERE leased_bicycles.bicycle_ID = returned_bicycles.bicycle_ID;
TRUNCATE TABLE returned_bicycles;
COMMIT WORK;
(미래에 같은 행을 불필요하거나 부적절하게 다시 제거하려는 시도를 피하기 위해, returned_bicycles 테이블은 같은 트랜잭션의 일부로 비워집니다.)
삭제 후의 데이터를 보여줍니다.
SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
| 101 | 1111 |
| 103 | 3333 |
+------------+-------------+
이제 다른 자전거가 반납됐다고 가정해요.
INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
다음 쿼리는 leased_bicycles 테이블에서 제거할 bicycle_ID를 지정하기 위해 테이블(아닌) 서브쿼리를 포함하는 USING 절을 보여줘요.
BEGIN WORK;
DELETE FROM leased_bicycles
USING (SELECT bicycle_ID AS bicycle_ID FROM returned_bicycles) AS returned
WHERE leased_bicycles.bicycle_ID = returned.bicycle_ID;
TRUNCATE TABLE returned_bicycles;
COMMIT WORK;
삭제 후의 데이터를 보여줍니다.
SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
| 101 | 1111 |
+------------+-------------+