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 |
+------------+-------------+

더 알아보기 (Learn more)