カテゴリ:

DML コマンド - 一般

DELETE

テーブルから行を削除します。WHERE 句を使用して、削除する行を指定できます。サブクエリまたは追加のテーブルを使用して削除する行を識別する必要がある場合は、 USING 句でサブクエリまたはテーブルを指定します。

重要

TRUNCATE TABLE とは異なり、このコマンドは外部ファイルのロード履歴を削除 しません。ステージングされたファイルからテーブルにロードされた行を削除する場合、ファイルを変更して再度ステージングしない限り、そのファイルからデータを再度ロードすることはできません。

構文

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

必須パラメーター

テーブル名

行が削除されるテーブルを指定します。

オプションのパラメーター

USING 追加のテーブルまたはクエリ [, ... ]

削除する行を特定するために WHERE 句で追加のテーブルを参照する必要がある場合は、 USING 句でそれらのテーブル名を指定します。USING 句を使用して、削除する行を識別するサブクエリを指定することもできます。

サブクエリを指定する場合は、サブクエリを括弧で囲みます。

複数のテーブルまたはクエリを指定する場合は、コンマを使用してそれらを区切ります。

WHERE 条件

削除する行を選択するために使用する条件を指定します。このパラメーターを省略すると、テーブル内のすべての行が削除されますが、テーブルは残ります。

使用上の注意

  • 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
    

    少なくとも1つの結合ペアが条件を満たすため、行は削除されます。その結果、ステートメントの完了後、 tab1 は空になります。

自転車をリースしている組織が次のテーブルを使用しているとします。

  • leased_bicyclesという名前のテーブルには、リースされた自転車がリストされます。

  • returns_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 句はreturned_bicyclesテーブルを指定します。このテーブルには、leased_bicyclesテーブルから削除される自転車の IDs がリストされています。 WHERE 句はleased_bicyclesテーブルをreturned_bicyclesテーブルに結合し、returned_bicyclesの対応する行と同じbicycle_ID を持つleased_bicyclesの行が削除されます。

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