DELETE¶
테이블에서 행을 제거합니다. WHERE 절을 사용하여 제거해야 할 행을 지정할 수 있습니다. 제거할 행을 식별하기 위해 하위 쿼리 또는 추가 테이블을 사용해야 하는 경우 USING 절에 하위 쿼리 또는 테이블을 지정하십시오.
중요
TRUNCATE TABLE 과 달리, 이 명령은 외부 파일 로딩 기록을 삭제하지 않습니다. 스테이징된 파일에서 테이블에 로딩된 행을 삭제하는 경우, 파일을 수정하고 다시 스테이징하지 않는 한 해당 파일에서 데이터를 다시 로딩할 수 없습니다.
구문¶
DELETE FROM <table_name>
            [ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
            [ WHERE <condition> ]
필수 매개 변수¶
- table_name
- 행이 제거되는 테이블을 지정합니다. 
선택적 매개 변수¶
- USING additional_table_or_query [, ... ]
- 제거할 행을 식별하는 데 도움이 되도록 WHERE 절에서 추가 테이블을 참조해야 하는 경우 USING 절에서 해당 테이블 이름을 지정하십시오. 또한, USING 절을 사용하여 제거할 행을 식별하는 하위 쿼리를 지정할 수도 있습니다. - 하위 쿼리를 지정하는 경우에는 하위 쿼리를 괄호로 묶으십시오. - 둘 이상의 테이블이나 쿼리를 지정하는 경우 쉼표를 사용하여 구분하십시오. 
- WHERE condition
- 제거할 행을 선택하는 데 사용할 조건을 지정합니다. 이 매개 변수를 생략하면 테이블의 모든 행이 제거되지만, 테이블은 그대로 남습니다. 
사용법 노트¶
- ( - USING절을 지정하여) JOIN을 기반으로 삭제할 때 대상 테이블의 행이- USING테이블의 여러 행에 대해 조인될 가능성이 있습니다. 모든 조인된 조합에 대해 DELETE 조건이 충족되는 경우 대상 행이 삭제됩니다.- 아래와 같이 열 - (k number, v number)가 있는 테이블- tab1과- tab2를 예로 들 수 있습니다.- select * from tab1; -------+-------+ k | v | -------+-------+ 0 | 10 | -------+-------+ Select * from tab2; -------+-------+ k | v | -------+-------+ 0 | 20 | 0 | 30 | -------+-------+ - 다음 쿼리를 실행하면 - tab1의 행이- tab2의 두 행 모두에 대해 조인됩니다.- DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k - 하나 이상의 조인된 쌍이 이 조건을 충족하므로 행이 삭제됩니다. 결과적으로, 문이 완료된 후 - tab1은 비게 됩니다.
예¶
자전거를 대여하는 조직에서 다음 테이블을 사용한다고 가정해보십시오.
- leased_bicycles로 명명된 테이블에는 대여된 자전거가 나열됩니다. 
- returned_bicycles로 명명된 테이블에는 최근에 반환된 자전거가 나열됩니다. 이러한 자전거는 대여 자전거 테이블에서 제거해야 합니다. 
테이블 만들기:
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 테이블에서 삭제할 자전거의 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;
(향후 불필요하거나 부적절할 수 있는 경우에 똑같은 행을 다시 제거하려는 시도를 방지하기 위해, 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_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;
삭제 후 데이터 표시하기:
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | +------------+-------------+