MySQL 複数テーブルを JOIN してデータを削除 (DELETE)

ここでは MySQL で複数のテーブルを JOIN してデータを削除 (DELETE) する方法をご説明します。

サンプルデータベースのテーブルを使いますので、実際にスクリプトを実行してみたい方は、こちら のスクリプトを実行して school_db データベースを作成しておいてください。

MySQL の DELETE ... JOIN 文の使い方

MySQL でテーブルのデータを削除するには DELETEJOIN を使います。

基本の DELETE の構文は以下の通りでした。

DELETE
FROM    テーブル名
WHERE   条件文;

複数のテーブルを使って削除したい時、MySQL ではテーブルの結合は、普通の SELECT 文のように FROM 句で JOIN します。

そして、DELETE と FROM の間に削除したいデータがあるテーブルを指定します。

例えば、テーブル1 と テーブル2 を id というカラムで INNER JOIN して、テーブル1 のデータを削除したいのであれば次のようにできます。

DELETE	t1
FROM 	テーブル1 AS t1
			INNER JOIN テーブル2 AS t2
				ON t1.id = t2.id
WHERE   条件文;

テーブルのエイリアスは必須ではありませんが、クエリーが読みやすくなるのでつけています。


DELETE 文で複数のテーブルを JOIN してデータを削除する

それでは、実際にサンプルデータを使ってテーブルを結合して値を削除してみましょう。

次のような、students, exam_results テーブがあり、データは以下のような状態です。

MySQL 複数テーブルを JOIN して削除 (DELETE) 1

MySQL 複数テーブルを JOIN して削除 (DELETE) 2


ここで、現時点で exam_results にレコードがない students のレコードを削除したいとします。

DELETE 文を書く前に、間違いがないようにおすすめなのは、まず削除の対象となるデータの SELECT 文を書いてみることです。

exam_results にレコードがない students のレコードは、students テーブルと exam_results テーブルを student_id で LEFT JOIN して、exam_results テーブルの student_id が NULL のレコードを SELECT することで取得できます。

SELECT 	*
FROM	students AS s
			LEFT JOIN exam_results AS er
				ON s.student_id = er.student_id
WHERE 	er.student_id IS NULL;

クエリーを実行して、削除したい対象のデータが取得できているか確認します。

MySQL 複数テーブルを JOIN して削除 (DELETE) 3

student_id = 6 の学生が exam_results テーブルに存在していません。


削除したい対象のデータが取得できていれば、この SELECT 文を元に DELETE 文を作ります。

SELECT * 部分を DELETE に変更します。

DELETE 	s
FROM	students AS s
			LEFT JOIN exam_results AS er
				ON s.student_id = er.student_id
WHERE 	er.student_id IS NULL;

WHERE 句の条件文に students テーブルのキーカラムが使われていないので、Safe Updates モードが有効化されている場合はエラーになります。

その場合は、次のクエリーでSafe Updates モードを無効化してから DELETE 文を実行します。

SET sql_safe_updates = 0;

MySQL の Safe Updates モードとは何かと、Safe Updates モードを無効化する方法が知りたい方はこちらをご覧ください。

MySQL の Safe Updates モードを無効化する方法


Safe Updates モードを無効化して DELETE 文を実行し、students テーブルの中身を確認します。

MySQL 複数テーブルを JOIN して削除 (DELETE) 4

student_id = 6 の学生のレコードが students テーブルから削除されていますね。


以上、MySQL で複数のテーブルを JOIN してデータを削除 (DELETE) する方法をご説明しました。

© 2024 MySQL 入門