DELETE

테이블에서 행을 제거합니다. WHERE 절을 사용하여 제거해야 할 행을 지정할 수 있습니다. 제거할 행을 식별하기 위해 하위 쿼리 또는 추가 테이블을 사용해야 하는 경우 USING 절에 하위 쿼리 또는 테이블을 지정하십시오.

중요

TRUNCATE TABLE 과 달리, 이 명령은 외부 파일 로딩 기록을 삭제하지 않습니다. 스테이징된 파일에서 테이블에 로딩된 행을 삭제하는 경우, 파일을 수정하고 다시 스테이징하지 않는 한 해당 파일에서 데이터를 다시 로딩할 수 없습니다.

구문

DELETE FROM <table_name>
            [ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
            [ WHERE <condition> ]
Copy

필수 매개 변수

table_name

행이 제거되는 테이블을 지정합니다.

선택적 매개 변수

USING additional_table_or_query [, ... ]

제거할 행을 식별하는 데 도움이 되도록 WHERE 절에서 추가 테이블을 참조해야 하는 경우 USING 절에서 해당 테이블 이름을 지정하십시오. 또한, USING 절을 사용하여 제거할 행을 식별하는 하위 쿼리를 지정할 수도 있습니다.

하위 쿼리를 지정하는 경우에는 하위 쿼리를 괄호로 묶으십시오.

둘 이상의 테이블이나 쿼리를 지정하는 경우 쉼표를 사용하여 구분하십시오.

WHERE condition

제거할 행을 선택하는 데 사용할 조건을 지정합니다. 이 매개 변수를 생략하면 테이블의 모든 행이 제거되지만, 테이블은 그대로 남습니다.

사용법 노트

  • (USING 절을 지정하여) JOIN을 기반으로 삭제할 때 대상 테이블의 행이 USING 테이블의 여러 행에 대해 조인될 가능성이 있습니다. 모든 조인된 조합에 대해 DELETE 조건이 충족되는 경우 대상 행이 삭제됩니다.

    아래와 같이 열 (k number, v number) 가 있는 테이블 tab1tab2 를 예로 들 수 있습니다.

    select * from tab1;
    
    -------+-------+
       k   |   v   |
    -------+-------+
       0   |   10  |
    -------+-------+
    
    Select * from tab2;
    
    -------+-------+
       k   |   v   |
    -------+-------+
       0   |   20  |
       0   |   30  |
    -------+-------+
    
    Copy

    다음 쿼리를 실행하면 tab1 의 행이 tab2 의 두 행 모두에 대해 조인됩니다.

    DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k
    
    Copy

    하나 이상의 조인된 쌍이 이 조건을 충족하므로 행이 삭제됩니다. 결과적으로, 문이 완료된 후 tab1 은 비게 됩니다.

자전거를 대여하는 조직에서 다음 테이블을 사용한다고 가정해보십시오.

  • leased_bicycles로 명명된 테이블에는 대여된 자전거가 나열됩니다.

  • returned_bicycles로 명명된 테이블에는 최근에 반환된 자전거가 나열됩니다. 이러한 자전거는 대여 자전거 테이블에서 제거해야 합니다.

테이블 만들기:

CREATE TABLE leased_bicycles (bicycle_id INTEGER, customer_id INTEGER);
CREATE TABLE returned_bicycles (bicycle_id INTEGER);
Copy

데이터 로딩하기:

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);
Copy

다음은 WHERE 절을 사용하여 지정된 행을 삭제하는 방법을 보여주는 예입니다. 이 예에서는 bicycle_ID를 기준으로 삭제합니다.

DELETE FROM leased_bicycles WHERE bicycle_ID = 105;
+------------------------+
| number of rows deleted |
|------------------------|
|                      1 |
+------------------------+
Copy

삭제 후 데이터 표시하기:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
|        102 |        2222 |
|        103 |        3333 |
|        104 |        4444 |
+------------+-------------+
Copy

이 예에서는 USING 절을 사용하여 삭제할 행을 지정하는 방법을 보여줍니다. 이 USING 절은 leased_bicycles 테이블에서 삭제할 자전거의 IDs가 나열되는 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;
Copy

(향후 불필요하거나 부적절할 수 있는 경우에 똑같은 행을 다시 제거하려는 시도를 방지하기 위해, returned_bicycles 테이블은 같은 트랜잭션의 일부로 잘립니다.)

삭제 후 데이터 표시하기:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
|        103 |        3333 |
+------------+-------------+
Copy

이번에는 또 다른 자전거가 반환되었다고 가정합니다.

INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
Copy

다음 쿼리는 leased_bicycles 테이블에서 제거할 bicycle_IDs를 지정하는 (테이블이 아니라) 하위 쿼리를 포함하는 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;
Copy

삭제 후 데이터 표시하기:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
+------------+-------------+
Copy