MySQL ジョイントテーブル更新デー​​タの詳細な例

MySQL ジョイントテーブル更新デー​​タの詳細な例

1.MySQL UPDATE JOIN構文

MySQL では、UPDATE ステートメントでJOIN句を使用して、テーブル間の更新を実行できます。 MySQL UPDATE JOIN の構文は次のとおりです。

アップデートT1、T2、
[内部結合 | 左結合] T1 ON T1.C1 = T2.C1
T1.C2 = T2.C2 に設定し、 
 T2.C3 = 式
WHERE条件

MySQL のUPDATE JOIN構文を詳しく見てみましょう。

まず、 UPDATE句の後に、プライマリ テーブル ( T1 ) とプライマリ テーブルを結合するテーブル ( T2 ) を指定します。

次に、使用する結合のタイプ( INNER JOINまたはLEFT JOIN )と結合条件を指定します。 JOIN句はUPDATE句の後に置く必要があります。

3 番目に、更新するT1および/またはT2テーブルの列に新しい値を割り当てる必要があります。

4 番目に、WHERE 句の条件を使用して、更新する行を指定します。

2. 例

まず、これらの例では新しいサンプル データベース ( empdb ) を使用します。サンプル データベースには 2 つのテーブルが含まれています。

  • employeesテーブルには、従業員番号、名前、職務実績、給与に関するデータが格納されます。
  • meritsテーブルには、従業員の業績と業績パーセンテージが保存されます。

次のステートメントは、 empdbサンプル データベースにテーブルを作成し、データをインポートします。

empdbが存在しない場合はデータベースを作成します。

empdbを使用します。
--テーブルを作成する
CREATE TABLEのメリット(
 パフォーマンス INT(11) NOT NULL,
 パーセンテージ FLOAT NOT NULL、
 プライマリキー(パフォーマンス)
);

従業員テーブルを作成する(
 emp_id INT(11) NOT NULL AUTO_INCREMENT,
 emp_name VARCHAR(255) NOT NULL、
 パフォーマンス INT(11) デフォルト NULL,
 給与 FLOAT デフォルト NULL、
 主キー (emp_id)、
 制約 fk_performance FOREIGN KEY (パフォーマンス)
  参考文献 メリット(パフォーマンス)
);

-- 功績表にデータを挿入する
メリット(パフォーマンス、パーセンテージ)に挿入
値(1,0)、
  (2,0.01)、
  (3,0.03)、
  (4,0.05)、
  (5,0.08);

-- 従業員テーブルにデータを挿入する
従業員に挿入(従業員名、業績、給与)  
VALUES('メアリー・ドゥー', 1, 50000),
  (「シンディ・ミンス」、3、65000)、
  (『スー・グリーンスパン』、4、75000)、
  (「グレース・デル」、5、125000)、
  (「ナンシー・ジョンソン」、3、85000)、
  (「ジョン・ドゥ」、2、45000)、
  (「リリーブッシュ」、3、55000)

2.1 MySQL UPDATE JOIN INNER JOIN句を使用した例

従業員の給与をその仕事のパフォーマンスに基づいて調整したいとします。
したがって、功績パーセンテージはmeritsテーブルに格納され、 UPDATE INNER JOINステートメントを使用して、 meritsテーブルに格納されているパーセンテージに基づいて employees テーブル内のemployeesの給与を調整する必要があります。
employeesテーブルとmeritsテーブルはperformanceフィールドによってリンクされます。 次のクエリを参照してください。

上記のクエリはどのように機能しますか?
employeesテーブルのデータのみを更新したいため、 UPDATE句の後にのみemployeesテーブルを指定します。
クエリは、 employeesテーブルの各行について、 employeesテーブルのperformance列の値をmeritsテーブルのperformance列の値と比較します。 一致が見つかった場合は、 meritsテーブルからパーセンテージを取得し、 employeesテーブルのsalary列を更新します。

mysql> select * from employees; -- 以前のデータを更新します+--------+---------------+------------+--------+
| 従業員 ID | 従業員名 | 業績 | 給与 |
+--------+---------------+-------------+---------+
| 1 | メアリー・ドゥ | 1 | 50000 |
| 2 | シンディ・ミンス | 3 | 65000 |
| 3 | スー・グリーンスパン | 4 | 75000 |
| 4 | グレースデル | 5 | 125000 |
| 5 | ナンシー・ジョンソン | 3 | 85000 |
| 6 | ジョン・ドゥ | 2 | 45000 |
| 7 | リリーブッシュ | 3 | 55000 |
+--------+---------------+-------------+---------+
7行セット

mysql> 従業員の更新
  内部結合
 メリット ON employees.performance = merits.performance 
セット 
 salary = salary + salary * percentage; -- 接続更新クエリの実行が成功しました。6 行が影響を受けました。
一致した行: 7 変更された行: 6 警告: 0

mysql> select * from employees; -- 更新されたデータ+--------+---------------+------------+--------+
| 従業員 ID | 従業員名 | 業績 | 給与 |
+--------+---------------+-------------+---------+
| 1 | メアリー・ドゥ | 1 | 50000 |
| 2 | シンディ・ミンス | 3 | 66950 |
| 3 | スー・グリーンスパン | 4 | 78750 |
| 4 | グレースデル | 5 | 135000 |
| 5 | ナンシー・ジョンソン | 3 | 87550 |
| 6 | ジョン・ドゥ | 2 | 45450 |
| 7 | リリーブッシュ | 3 | 56650 |
+--------+---------------+-------------+---------+
7行セット

UPDATEステートメントのWHERE句が省略されているため、 employeesテーブル内のすべてのレコードが更新されます。 performanceレベルが 1 より大きい従業員の給与を更新する必要がある場合、 sql次のように記述できます。

従業員の更新
  内部結合
 メリット ON employees.performance = merits.performance 
セット 
 給与 = 給与 + 給与 * パーセンテージ
ここで、 employees.performance > 1;

2.2 MySQL UPDATE JOIN LEFT JOIN を使用した例

会社が 2 人の新しい従業員を雇ったとします。

従業員に挿入(従業員名、業績、給与)
VALUES('ジャック・ウィリアム',NULL,43000),
  (「リッキー・ボンド」、NULL、52000)

これらの従業員は新入社員であるため、 performanceデータは利用できないか、 NULLなります。今
employeesテーブルのデータは次のとおりです。

mysql> SELECT * FROM 従業員;
+--------+---------------+-------------+---------+
| 従業員 ID | 従業員名 | 業績 | 給与 |
+--------+---------------+-------------+---------+
| 1 | メアリー・ドゥ | 1 | 50000 |
| 2 | シンディ・ミンス | 3 | 66950 |
| 3 | スー・グリーンスパン | 4 | 78750 |
| 4 | グレースデル | 5 | 135000 |
| 5 | ナンシー・ジョンソン | 3 | 87550 |
| 6 | ジョン・ドゥ | 2 | 45450 |
| 7 | リリーブッシュ | 3 | 56650 |
| 8 | ジャック・ウィリアム | NULL | 43000 |
| 9 | リッキー・ボンド | NULL | 52000 |
+--------+---------------+-------------+---------+
9行セット

新入社員の給与を計算する場合、業績データがmeritsテーブルにないため、 UPDATE INNER JOINステートメントは使用できません (使用できない理由については、SQL の左結合、右結合、および内部結合の違いを参照してください)。そのため、これを実装するにはUPDATE LEFT JOINを使用します。
UPDATE LEFT JOINステートメントが、他のテーブルに対応する行がない場合に、一方のテーブルの行を更新する場合。
たとえば、次のステートメントを使用して、新入社員の給与を 1.5% 増額できます。

従業員の更新
  左結合
 メリット ON employees.performance = merits.performance 
セット 
 給料 = 給料 + 給料 * 0.015
どこ
 merits.percentage が NULL です。

実行結果は次のとおりです。

mysql> 従業員の更新
  左結合
 メリット ON employees.performance = merits.performance 
セット 
 給料 = 給料 + 給料 * 0.015
どこ
 merits.percentage が NULL です。
クエリは正常、2 行が影響を受けました
一致した行: 2 変更された行: 2 警告: 0

mysql> 従業員から * を選択します。
+--------+---------------+-------------+---------+
| 従業員 ID | 従業員名 | 業績 | 給与 |
+--------+---------------+-------------+---------+
| 1 | メアリー・ドゥ | 1 | 50000 |
| 2 | シンディ・ミンス | 3 | 66950 |
| 3 | スー・グリーンスパン | 4 | 78750 |
| 4 | グレースデル | 5 | 135000 |
| 5 | ナンシー・ジョンソン | 3 | 87550 |
| 6 | ジョン・ドゥ | 2 | 45450 |
| 7 | リリーブッシュ | 3 | 56650 |
| 8 | ジャック・ウィリアム | NULL | 43645 |
| 9 | リッキー・ボンド | NULL | 52780 |
+--------+---------------+-------------+---------+
9行セット

# 単一テーブル結合
bbs_uhome_card_activate ca を更新し、bbs_uhome_card_rules cr を ca.card_brach=cr.card_bach に設定し、ca.create_user=cr.create_user を設定します。

# 複数テーブルの結合
bbs_uhome_card_order co を更新し、 bbs_uhome_card_order_record cor を co.order_no=cor.order_no で内部結合し、 bbs_uhome_card_activate ca を cor.card_no=ca.card_no で結合し、 co.create_user=ca.create_user を設定します。

これで、MySQL ジョイント テーブル更新デー​​タの詳細な例に関するこの記事は終了です。MySQL ジョイント テーブル更新デー​​タに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL UPDATE ステートメントの非標準実装コード
  • mysql 更新ケース更新フィールド値が固定されていない操作
  • MySQLでレコードを変更する場合、更新操作フィールド = フィールド + 文字列
  • MySQL で結果を選択して更新を実行する例のチュートリアル
  • Mysql トランザクションで Update を実行するとテーブルがロックされますか?
  • 複数のフィールドを変更するためのMysql更新の構文の詳細な分析
  • MySQLのUPDATE文の落とし穴を記録する
  • mysql update文の実行プロセスの詳細な説明
  • Mysql 更新マルチテーブル共同更新方法の概要
  • MySQL 更新セットとの違い

<<:  Tomcat サーバーの設定と Web プロジェクトの公開に関する IDEA グラフィック チュートリアル

>>:  テーブルの動的な色の変更を実現するJavaScript

推薦する

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します...

Docker を使用した Laravel アプリケーションのデプロイ例

この記事で使用されているPHPベースイメージはphp:7.3-apacheです。この記事の Lara...

Centos7はMySQLログに基づいてデータを復元するためのサンプルコードを実装します

導入Binlog ログ、つまりバイナリ ログ ファイルは、データベースに対するユーザー操作の SQL...

Vue.js ディレクティブのカスタム命令の詳細な説明

デモコマンドをカスタマイズするVue カスタム ディレクティブの構文は次のとおりです。 Vue.di...

Linux コマンドラインターミナルで画面を分割するための 2 つのツール

ターミナル分割画面ツールは2つあります: screen と tmux 1. 画面分割を使用する(上下...

Vue で棒グラフを使用し、自分で設定を変更する方法

1. HTMLファイルでechartをインポートする <!-- echarts をインポート ...

Mysqlの同時パラメータ調整の詳細な説明

目次クエリキャッシュの最適化概要クエリプロセスクエリキャッシュ構成クエリキャッシュの無効化メモリ管理...

MySQL binlog の解析

目次1. binlogの紹介2. Binlog関連のパラメータ3. バイナリログの内容を分析するIV...

MySQL 5.7.17 無料インストールバージョンの設定方法グラフィックチュートリアル (Windows10)

1. 概要ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージ...

Windows 10 システムで nginx ファイル サーバーを構成するためのグラフィック チュートリアル

Nginx の公式 Web サイトから Windows バージョンの Nginx をダウンロードしま...

Linux statコマンドの使用

1. コマンドの紹介stat コマンドは、ファイルまたはファイル システムに関する詳細情報を表示する...

マウスがカード上に移動したときにフローティング効果を実現する CSS の使用例

原理ホバーしたときに要素に影を設定します: box-shadow で、通常とは異なるスタイルにします...

MySQLは1億のテストデータを素早く挿入します

目次1. テーブルを作成する1.1 テストテーブルt_userを作成する1.2 一時テーブルの作成2...

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

空のパスがページのパフォーマンスに与える影響に対する解決策

数日前、Google Reader で Yu Bo さんが共有した投稿「空のパスがページのパフォーマ...