MySQL で Join を使用して削除

Raymond Peter 2023年1月30日
  1. MySQL で DELETE FROM ステートメントを使用する際の制限
  2. MySQL で INNER JOIN メソッドを使用する
  3. MySQL で JOIN を使って削除する場合の最終的な結果
MySQL で Join を使用して削除

このチュートリアル記事では、MySQL の JOIN メソッドを使用して複数のテーブルのデータを削除する方法を説明します。これは、あるテーブルの特定のレコードに関連する別のテーブルのレコードを同時に削除する場合に便利です。

MySQL で DELETE FROM ステートメントを使用する際の制限

DELETE FROM ステートメントは、テーブルの行を削除するために使用されます。WHERE を適用して、削除時に満たす行と条件を指定できます。

次のコードには 2つのテーブルが含まれています。1つ目はサプライヤーの商品とその場所を記録し、2つ目はこれらの商品を販売する店の所有者のリストです。

Create Table supplier (
    suppId INTEGER PRIMARY KEY,
    category TEXT NOT NULL,
    location TEXT NOT NULL
);
Create Table shops (
    owner TEXT NOT NULL,
    shptype TEXT NOT NULL,
    area TEXT NOT NULL
);

INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');

INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');

テーブル内のすべてのショップはダウンタウンに拠点を置いているため、この場合、アップタウンエリアのサプライヤーの記録を維持する意味はありません。

DELETE の使用は、一度に 1つのテーブルに対してのみ機能します。shops テーブルからデータを取得し、基準を指定して、すべての条件に一致する supplier テーブルのすべてのレコードを削除できます。

この場合、JOIN を使用して supplier テーブルから Uptown のすべてのレコードを削除します。

MySQL で INNER JOIN メソッドを使用する

INNER JOIN メソッドを使用すると、2つ以上のテーブルをマージし、一度に複数の行を削除できます。

サブクエリを使用するなどの代替オプションがありますが、これはジョブを実行するためのより実用的な方法です。上記のテーブルの例を使用すると、Uptown 値を持つ両方のテーブルのすべての行を削除できます。

次のコードは、ショップの場所を検索し、Downtown として登録されているサプライヤーを削除しながら、サプライヤーを Uptown エリアに保持します。

DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;

テーブルの結合は、同様のデータを共有するフィールドに基づいていました。カテゴリフィールドには、この場合、サプライヤが提供したものと販売したショップが表示されました。

2つのテーブルをマージすると、削除の条件を 1つだけ定義できます。この場合、サプライヤの場所によって、削除する行が決まります。

DELETE の後にテーブルの名前を追加するだけで、両方のテーブルを同時に削除することもできます。これは、複数のテーブルに複数のレコードがある場合に機能します。

DELETE supplier, shops FROM supplier
...

MySQL で JOIN を使って削除する場合の最終的な結果

その結果、テーブルはそのまま残り、同時に上記の基準を満たさないサプライヤのすべてのレコードが削除されます。

Create Table supplier (
    suppId INTEGER PRIMARY KEY,
    category TEXT NOT NULL,
    location TEXT NOT NULL
);
Create Table shops (
    owner TEXT NOT NULL,
    shptype TEXT NOT NULL,
    location TEXT NOT NULL
);

INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');

INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');
-- delete function 
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;

上記は、場所(この場合は Downtown)によってすべてのサプライヤーをショップに一致させ、基準に一致しないすべての行をサプライヤーテーブルから削除します。

次の SELECT トライアルから、supplier テーブルには Downtown としてリストされているサプライヤーのみが含まれていることがわかります。

SELECT * FROM supplier

結果:

mysql で join を使用して削除します

関連記事 - MySQL Join