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

推薦する

Vueでのバスの使用に関する詳細な説明

Vue バス メカニズム (バス) vuex を使用するだけでなく、vue 内の親子以外のコンポーネ...

Nginx アップロードファイルのサイズを変更する簡単な方法

オリジナルリンク: https://vien.tech/article/138序文私は、マークダウン...

Docker で Redis センチネル モードを構成する方法 (複数のサーバー上)

目次序文状態DockerをインストールするRedisのマスターノードとスレーブノードを構成する序文以...

Vue はコンポーネント間の通信をどのように実装しますか?

目次1. 父と息子のコミュニケーション1.1 親コンポーネント --> 子コンポーネント1.2...

jQueryはすべてのショッピングカート機能を実装します

目次1. すべて選択2. 商品の数量を増やすか減らす3. 商品の小計を変更する4. 合計と合計額を計...

MySQL 5.7.22 バイナリパッケージのインストールとインストール不要版 Windows 設定方法

次のコードは、MySQL 5.7.22 バイナリ パッケージのインストール方法を紹介しています。具体...

Vue.js フロントエンドプロジェクト向け多言語ソリューションのアイデアと実践

目次1. 通常どのようなコンテンツを処理する必要があるか2. 基本的な考え方3. 具体的な実践の詳細...

純粋な CSS ヘッダーの実装コードを修正

純粋な CSS で固定ヘッダーを実装するのが難しい主な理由は 2 つあります。まず、最大のシェアを持...

ウェブデザイナー職の面接でよくある質問と回答

1. ASP.NET Web アプリケーションのテンプレートとは何ですか? それらの違いは何ですか?...

Zabbixのインストールと展開の詳細な説明

序文Zabbix は最も主流のオープンソース監視ソリューションの 1 つです。導入自体は難しくありま...

CSS3 で背景ぼかしを実現する 3 つの方法 (要約)

1. 通常の背景ぼかしコード: <スタイル> html, 体 { 幅: 100%; 高...

フレームセットの高さを設定する際のインターフェース変形の解決策

現在、プロジェクトを作成しました。インターフェースは次のとおりです。これはフレームセットを使用して行...

Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法

1. Vueプロジェクトのパッケージ化開発されたvueプロジェクトに次の名前を入力し、パッケージ化し...

CentOS の Nginx 公式 Yum ソースの設定を詳しく解説

私はプロジェクトの展開にAlibaba Cloudから購入したCentOSを使用しています。最近、プ...

CSS の読み込みによってブロックが発生しますか?

おそらく誰もが js の実行によって DOM ツリーの解析とレンダリングがブロックされることを知って...