mysql delete statement delete command syntax
このチュートリアルでは、MySQL DELETEステートメントを使用してテーブルからデータを削除する方法またはテーブル全体を削除する方法と、切り捨てコマンドと削除コマンドの違いについて説明します。
MySQLでは、DELETEはデータ操作言語またはDMLです。
名前自体が示すように、このコマンドはテーブルから行を削除するために使用されます。このコマンドを使用すると、1つのトランザクションで1つ以上の不要な行を削除できます。 DELETEコマンドを使用してテーブルからレコードを削除する方法は複数あります。
経験豊富な候補者のためのソフトウェアテスト面接の質問
このチュートリアルでは、簡単な例とともに、これらすべてについて詳しく説明します。
学習内容:
MySQLDELETEコマンド
先に進む前に覚えておくべき重要な要素があります。 DELETEコマンドを使用して削除した1つまたは複数の行は、取得できません。
したがって、行が誤って削除されるシナリオを回避するために、DELETEステートメントを実行する前にテーブルのバックアップを取ることをお勧めします。後でこのバックアップを使用して、間違いが発生した場合にテーブルを復元できます。
注意: MySQLバージョン8.0を使用しています。あなたはそれをからダウンロードすることができます ここに 。
MySQLの削除構文:
DELETE (LOW_PRIORITY) (QUICK) (IGNORE) FROM tablename(.*) (, tablename(.*)) (WHERE condition) (ORDER BY) (LIMIT row_count) ;
構文の説明:
- 構文はキーワード「DELETEFROM」で始まり、それによって実行されるアクティビティのタイプについてMySQLサーバーに通知します。これは必須のキーワードであり、省略できません。
- 次に、DELETE操作を実行する必要があるテーブルの名前を示します。これも必須であり、省略できません。ここでは、1つまたは複数のテーブル名について言及できます。
- 次に、削除する行の適格性を制御する条件について説明します。これはオプションの句です。ここでのキーワードはWHEREです。
- WHERE句の後にはORDERBY句が続きます。これは、列の行を特定の順序(昇順または降順)で削除するように強制します。これはオプションの句です。
- LIMIT句はORDERBY句の後に続きます。 DELETEステートメントがテーブルから削除できる行数に制限があります。
DELETEステートメントの修飾子
#1)LOW_PRIORITY:
この修飾子は、DELETEしようとしているテーブルから読み取っている接続がなくなるまで、DELETEステートメントの実行を遅らせるようにMySQLエンジンに通知します。
これは、そのテーブルで実行される他のすべての操作全体で一貫性を実現するのに役立ちます。これは、テーブルロックの問題を回避するのにも役立ちます。
#2)クイック:
行を削除するたびに、対応するインデックスも削除されます。 DELETEステートメントの実行時にスペースを再利用すると、プロセッサー時間が消費されます。 QUICKキーワードを使用すると、対応するインデックススペースは使用されないままになり、以前に削除されたインデックス範囲に一致する新しいレコードが挿入されたときに使用できます。
例えば、 従業員IDがインデックスである従業員テーブルについて考えてみます。従業員が組織を離れるたびに、対応するレコードを削除する必要があります。 QUICK句を使用すると、対応するインデックススペースは使用されないままになります。
新入社員が入社すると、退社した人と同じ番号ではなく、新入社員番号を取得します。このような例では、QUICKを使用することはお勧めできません。
MYSQLDELETEの例
以下に、MYSQLで作成されたサンプルテーブルを示します。
スキーマ名: パシフィック
テーブル名: 従業員
列名:
empNum; 従業員番号の整数値を保持します。
苗字: 従業員の姓のvarchar値を保持します。
ファーストネーム: 従業員の名のvarchar値を保持します。
Eメール: 従業員の電子メールIDのvarchar値を保持します。
deptNum; 従業員が属する部門IDのvarcharを保持します。
給料: 各従業員の給与の10進値を保持します。
開始日: 従業員の加入日の日付値を保持します。
スキーマ名: パシフィック
テーブル名: employee_history
列名:
empNum; 従業員番号の整数値を保持します。
苗字: 従業員の姓のvarchar値を保持します。
ファーストネーム: 従業員の名のvarchar値を保持します。
Eメール: 従業員の電子メールIDのvarchar値を保持します。
deptNum; 従業員が属する部門IDのvarcharを保持します。
給料: 各従業員の給与の10進値を保持します。
開始日: 従業員の加入日の日付値を保持します。
スキーマ名: パシフィック
テーブル名: 部門
列名:
deptNum; 組織内の部門IDのvarcharを保持します。
市: 部門が所属する都市の名前を保持します。
国: 都市に対応する国の名前を保持します。
ボーナス: ボーナスのパーセンテージ値を保持します。
MySQLは単一行を削除します
1つの適切なレコードのみが削除されることを保証する非常に強力なWHERE句を使用して、レコードを1つずつ削除する際に、テーブルからレコードを削除する最初の簡単な方法。これをさらに使用して、同様の種類の行のセットをテーブルから削除できます。
削除ステートメントとその実行について詳しく見ていきましょう。
ここでは、従業員番号が1013の「ChrisNolan」という名前の従業員を削除してみます。
上の図に示されているように、DELETEステートメントは正常に実行され、従業員のテーブルから1行が削除されました。
ザ・ 出力 以下のステートメントは、ステートメントが実行された時刻、実行されたMySQLステートメント、および影響を受けた行の数を示しています。
ここでのWHERE句については十分に確認してください。 WHERE句が正しくない場合、またはWHERE句がない場合は、データが失われる可能性があります。このような状況を回避するために、本番環境では、定期的なデータのバックアップまたはアンロードが実行されます。
このDELETEステートメントの出力を確認するために、empNumを1013としてこのテーブルでSELECTステートメントを実行してみましょう。
出力結果は、すべての列にNULL値を示しています。これは、そのようなempNumのレコードが存在しないことを意味します。以下のクエリの出力は、0行が返されたことを示しています。これは、上記のDELETEステートメントの実行によってレコードが削除されたことを意味します。
クエリ:
DELETE FROM employees WHERE empNum = 1013 ;
後のテーブルスナップショット:
empNum | 苗字 | ファーストネーム | Eメール | deptNum | 給料 |
---|---|---|---|---|---|
7 | これは、テーブルからデータ全体を削除する場合と比較すると、TRUNCATEよりも比較的低速です。 | これは、テーブルからデータ全体を削除する場合と比較すると、DELETEよりも比較的高速です。 | |||
ヌル | ヌル | ヌル | ヌル | ヌル | ヌル |
ORDERBY句とLIMIT句を使用したMySQLDELETE
ORDER BYとLIMITは、上記で説明した2つの句です。前者は、レコードをパージする順序を決定するのに役立ちます。empNumが昇順でレコードを削除するか、給与が降順でレコードを削除します。後者は、このトランザクションが削除できるレコードの数を制限するのに役立ちます。
例えば、 部門番号4に属する高給の従業員2人だけを削除したい場合。次に、このクエリには3つの部分があります。
- 最初、 部門番号4から従業員を削除する必要があります。これはWHERE句によって処理されます。
- 次、 高い給料を稼いでいる従業員を一掃する必要があります。これは、給与列のORDERBY句によって降順で処理されます。
- 最後に、 2人の従業員だけをパージする必要があります。これは、LIMIT句によって処理されます。
DELETEクエリを見て、結果を見てみましょう。その前に、まず削除する正確なレコードを特定しましょう。上記の条件をSELECTステートメントで使用して、削除するレコードを取得し、後で同じクエリを実行して、それらのレコードが削除されているかどうかを確認します。
上記のSELECTクエリでは、WHERE、ORDER BY、およびLIMIT句を使用して上記で説明した3つの条件をすべて満たしています。クエリにより、empNum 1010と1007の2つのレコードが得られました。次に、DELETEクエリを実行して、これら2つのレコードが削除されていることを確認します。
上の図に示されているように、DELETEステートメントは正常に実行され、従業員のテーブルから2行が削除されました。ザ・ 出力 以下のステートメントは、ステートメントが実行された時刻、実行されたMySQLステートメント、および影響を受けた行の数を示しています。
このDELETEステートメントの出力を確認するために、empNum1010および1007に対してSELECTを実行してみましょう。 上記で使用したものと同じSELECTクエリを使用して、deptNum4の下にある他の従業員を表示することはできません。
出力結果には、すべての列にNULL値が表示されます。これは、そのような従業員番号のレコードが存在しないことを意味します。ザ・ 出力 以下のクエリのは、0行が返されたことを示しています。これは、上記のDELETEステートメントの実行によってレコードが削除されたことを意味します。
クエリ:
DELETE FROM employees WHERE deptNum = 4 ORDER BY salary DESC LIMIT 2 ;
後のテーブルスナップショット:
empNum | 苗字 | ファーストネーム | Eメール | deptNum | 給料 |
---|---|---|---|---|---|
ヌル | ヌル | ヌル | ヌル | ヌル | ヌル |
Select句を使用したMySQLDELETE
次に、1つのテーブルからレコードを削除する際のSELECT句の使用法について説明します。
働くのに最適なビデオゲーム会社
次のシナリオを検討してください。
2セットのテーブルがあります。 従業員と部門。 deptNumは、部門のテーブルの主キーと従業員のテーブルの外部キーのようなものです。つまり、従業員に部門が割り当てられている場合は、部門のテーブルにある部門の1つからのものである必要があります。
ここで、これまで従業員が割り当てられていない部門のテーブルからこれらのレコードを削除する必要があります。これを行うには、DELETEクエリのサブクエリにSELECT句を含めます。
まず、削除するレコードを特定しましょう。
上記のSELECTクエリにはサブクエリがあります。
クエリの機能は次のとおりです。
クエリは、deptNumが従業員のテーブルに存在しない部門のテーブルからすべてのレコードをプルします。結合は、2つのテーブルのdeptNumのサブクエリで実行されます。
次に、DELETEクエリを実行して、これらの部門に従業員が割り当てられていないため、部門のテーブルからこれら2つのレコードを削除できるかどうかを確認しましょう。
上の図に示されているように、deleteステートメントは、従業員が割り当てられていない部門テーブルから2行を削除しました。
このDELETEステートメントの出力を確認するために、テーブルでSELECTを実行し、出力に何があるかを確認しましょう。
上記の検証クエリの出力メッセージには、「0行が返されました」と表示されます。これは、deptNum6および7の行が削除されることを意味します。レコードが削除されたため、出力にはNULL値が表示される代わりに、レコードが表示されません。
クエリ:
DELETE FROM departments WHERE NOT EXISTS (SELECT deptNum FROM employees WHERE departments.deptNum = employees.deptNum ) ;
MySQLはテーブルからデータ全体を削除します
次に、テーブルからすべての行またはレコードを削除する必要があるシナリオを見ていきます。
本番環境では、このような状況に遭遇することはありません。ただし、この種のことは、複数の異なるシナリオでコードをテストする必要があり、テーブルに存在するレコードを削除して新しいテストデータのセットを再作成する必要がある開発領域で必要になります。
まず、削除する予定のデータを見てみましょう。 employee_historyテーブルからデータを削除しようとします。
以下に示すのは、テーブルに現在存在するデータです。
ここでは、employees_historyテーブルに18行あります。では、これらすべてを1つのトランザクションで削除しましょう。クエリは、最初のセクションで説明したものとほぼ同じです。唯一の変更点は、削除する行数に制限がないように、クエリからWHERE句を削除する必要があることです。
上の図に示されているように、deleteステートメントは正常に実行され、employees_historyテーブルから18行すべてが削除されました。以下の出力ステートメントは、ステートメントが実行された時刻、実行されたMySQLステートメント、および影響を受けた行の数を示しています。
このDELETEステートメントの出力を確認するために、テーブルでSELECTを実行し、出力に何があるかを確認しましょう。
出力結果には、すべての列にNULL値が表示されます。これは、そのような従業員番号のレコードが存在しないことを意味します。以下のクエリの出力は、0行が返されたことを示しています。これは、上記のDELETEステートメントの実行によってすべてのレコードが削除されたことを意味します。
クエリ:
DELETE FROM employees_history ;
後のテーブルスナップショット:
empNum | 苗字 | ファーストネーム | Eメール | deptNum | 給料 |
---|---|---|---|---|---|
ヌル | ヌル | ヌル | ヌル | ヌル | ヌル |
MySQLDELETEテーブル全体
次に、テーブル自体を削除する必要があるシナリオを見ていきます。 SQL用語では、これをDROPテーブルと呼びます。テーブルにデータがあるかどうかは関係ありません。データがある場合は、テーブルをドロップするだけです。
上記のセクションでは、employees_historyテーブルからデータを削除しました。このセクションでは、employees_historyテーブル自体を削除します。
以下は、コマンドとその出力です。
上の図に示されているように、DROPステートメントは正常に実行され、MySQLデータベースのシステムカタログからテーブルemployees_historyが削除されました。
メッセージを見ると、「影響を受けた0行」と表示されます。これは、前のセクションで18行すべてを削除したためです。このテーブルに行がある場合、それらの行数が影響を受けます。これは、削除されたことを意味します。
このDROPステートメントの出力を確認するために、テーブルでSELECTを実行し、出力に何があるかを確認しましょう。
上記の検証クエリの出力メッセージは、テーブルが存在しないことを示しています。これにより、上記のDROPステートメントの実行が検証されてテーブルが削除されます。
クエリ:
DROP TABLE employees_history ;
MySQLTruncateコマンド
DELETEコマンドを使用してテーブルからすべてのレコードを削除することについてはすでに説明しました。 TRUNCATEステートメントを使用しても同じことが実現できます。
経験豊富なパフォーマンステストの面接の質問
この例では、employees_historyテーブルを再作成し、データを再入力してみましょう。 T 以下は、テーブルを再作成して再入力するために実行された2つのクエリです。
クエリ:
CREATE TABLE employees_history LIKE employees ; INSERT INTO employees_history (SELECT * FROM employees) ;
これは、employees_historyテーブルがデータとともにどのように見えるかを示しています。
次に、TRUNCATEステートメントを使用して、このテーブルからすべてのレコードを削除します。
図に示すように、クエリは正常に実行されます。 「メッセージ」の部分をよく見ると、「0行が影響を受けています」と表示されていることがわかります。ただし、このテーブルには15行あることがわかっています。では、なぜショーはゼロなのですか?
理由: Truncateステートメントは、実行によって影響を受ける行の数をカウントする必要はありません。それは単にテーブルを空にします。これは、DELETEステートメントとTRUNCATEステートメントの重要な違いの1つです。
employee_historyテーブルでSELECTクエリを実行して、TRUNCATEステートメントの実行を確認しましょう。
上の図に示すように、クエリは行を返さず、すべての列にNULL値が表示されています。これは、前に実行したTRUNCATEステートメントによってテーブルからすべてのレコードが削除されたことを意味します。
クエリ:
TRUNCATE TABLE employees_history ;
TRUNCATEステートメントとDELETEステートメントの違い
いいえさん | 削除 | 切り捨てる |
---|---|---|
1 | これはDML(データ操作言語)です。 | これはDDL(データ定義言語)です。 |
二 | DELETEコマンドを使用すると、テーブルのAFTERDELETEトリガーがアクティブになります。 | TRUNCATEコマンドを使用しても、テーブルのAFTERDELETEトリガーはアクティブになりません。 |
3 | 外部キーの制約がある場合でも、レコードを削除できます。 | 外部キー制約がある場合、テーブルのレコードを切り捨てることはできません。 |
4 | テーブルの再初期化は行われません。 | テーブルが再初期化されます。 |
5 | WHERE句を使用できます。 | WHERE句は使用できません。 |
6 | これにより、一度に1つのレコードが削除され、削除されたレコードの総数がログに記録されます。 | すべてのレコードを一度にパージし、削除されたレコードの数を追跡しません。 |
参照整合性とそのDELETEへの影響
私たちがいる前に、見てみましょう 参照整合性またはRIまたは外部キー制約とは何ですか?
外部キー制約は、親テーブルと子テーブルの間の関係またはリンクを確立することに関するものです。これは、相互にリンクされているテーブル間でデータを相互参照するのに役立ちます。 1つの親テーブルに複数の子テーブルを含めることができ、その逆も可能です。
例えば、 これまで説明してきた2つのテーブル、つまり従業員と部門は、外部キー制約を使用して相互にリンクされています。この制約は、2つのテーブルをリンクするキー列として1つの列(通常は主キー)を作成することによって確立されます。
部門のテーブルのdeptNum列は、従業員のテーブルのdeptNum列にリンクされています。この場合、部門は親テーブルであり、従業員は子テーブルです。
しかし、これはDELETEステートメントにどのように影響しますか?
MySQLまたは任意のデータベースでは、親テーブルまたは子テーブルからレコードを削除するときに処理する必要のある特定のシナリオがあります。
議論できる参照オプションは複数あります。
#1)カスケードの削除時: このルールでは、親テーブルに参照がある場合、または子テーブルのいずれかに対応する行がある場合、親テーブルから行を削除することはできません。ただし、親テーブルにかなりの数の子テーブルがある場合、最初にすべての子テーブルからレコードを削除し、次に親テーブルからレコードを削除するのは面倒な作業です。
このために、ON DELETECASCADEと呼ばれる回避策があります。これは、各子テーブルのCREATEステートメントに追加される1つの句です。したがって、親テーブルから行を削除すると言うときはいつでも、MySQLエンジンは最初に子テーブル内のその行の参照を識別し、それらのレコードを削除し、最後に親テーブルからレコードを削除します。
#2)アクションなし: これはデフォルトのオプションです。 DELETEステートメントの実行が、子テーブルのいずれかに参照があるレコードを削除しようとすると、このオプションを使用すると、ステートメントの実行が停止し、 MySQLトランザクション 最後のコミットポイントにロールバックされます。
#3)制限: RESTRICTとNOACTIONの機能は同じです。実行を停止し、ロールバックを発行します。
#4)SET NULL: 削除ステートメントの実行が子テーブルのいずれかに参照があるレコードを削除しようとすると、このオプションはすべての子テーブルの列値をNULLとして更新し、完了すると、親からレコードを削除します。テーブル。
#5)デフォルトに設定: DELETEステートメントの実行により、子テーブルのいずれかに参照があるレコードを削除しようとすると、このオプションは、テーブルのCREATEステートメントで定義されているデフォルト値に列値を更新します。
よくある質問と回答
Q#1)MySQLのテーブルからデータを削除する方法は?
回答: 選択したデータ行のみを削除するdeleteコマンドの構文を以下に示します。
DELETE FROM table_name WHERE condition;
Q#2)MySQLのテーブルからすべてのデータを削除するにはどうすればよいですか?
回答: テーブルからすべての行を削除するDELETEコマンドの構文は次のとおりです。
DELETE * FROM table_name;
Q#3)MySQLのデータベースからテーブルを削除するにはどうすればよいですか?
回答: dropコマンドを使用して、データベースからテーブルを削除できます。ユーザーは、table_nameを削除する必要のあるテーブルに置き換えることができます。
DROP TABLE table_name;
Q#4)MySQLでデータベースを削除する方法は?
回答: dropコマンドを使用して、データベースを削除できます。
DROP Database db_name;
ユーザーは、db_nameを削除する必要のあるデータベース名に置き換えることができます。
Q#5)MySQLのON DELETE CASCADEとは何ですか?
回答: 親レコードが削除されると、ON DELETE CASCADEは、削除する一致する子レコードを作成します。したがって、削除の効果は親から子にカスケードされます。これは、複数テーブルの削除を実行する場合に役立ちます。
Q#6)TRUNCATEがDDLステートメントと見なされるのはなぜですか?
回答: TRUNCATEステートメントは、実際にはテーブルのメタデータとともにテーブルを削除して再作成します。したがって、これはDDLステートメントです。
Q#7)TRUNCATEをロールバックできますか?
回答: いいえ、スタンドアロンで実行した場合、TRUNCATEは自動コミットステートメントです。これは、コミットも一緒に実行されるため、ロールバックできないことを意味します。ただし、トランザクションの一部である場合は、SQLログファイルを使用してロールバックできます。
Q#8)DELETEステートメントをロールバックできますか?
回答: はい、DELETEステートメントはロールバックできます。 COMMITを実行する前に、ROLLBACKコマンドを実行するだけです。
Q#9)DELETEコマンドを使用して列を削除できますか?
回答: 列の追加または削除はDDLコマンドです。テーブルから列を削除するには、ALTERステートメントを使用する必要があります。
結論
このチュートリアルでは、MySQLでDELETEステートメントを実行するさまざまな方法を学びました。
一言で言えば、私たちは見ました:
- MySQLは単一行を削除します
- ORDERBYおよび制限句を使用したMySQLの削除
- Select句を使用したMySQLの削除
- MySQLはテーブル全体を削除します
- MySQLの切り捨て
- TRUNCATEステートメントとDELETEステートメントの違い
- 参照整合性とそのDELETEへの影響
要件に応じて、上記のいずれかを使用できます。
幸せな読書!!