电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2097 人浏览分享

Mysql联表更新数据代码示例解析

[复制链接]
2097 0
本篇文章小编给大家分享一下Mysql联表更新数据代码示例解析 文章代码介绍的很详细 小编觉得挺不
错的现在分享给大家供大家参考 有需要的小伙伴们可以来看看。

1.MySQL UPDATE JOIN语法

在MySQL中可以在UPDATE语句中使用JOIN子句执行跨表更新 MySQL UPDATE JOIN的语法如下:
  1. UPDATE T1, T2,
  2. [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
  3. SET T1.C2 = T2.C2,
  4. T2.C3 = expr
  5. WHERE condition
复制代码

更详细地看看MySQLUPDATE JOIN语法:

首先 在UPDATE子句之后 指定主表T1和希望主表连接表 T2。
第二,指定一种要使用的连接 即INNER JOIN或LEFT JOIN和连接条件JOIN子句必须出现在UPDATE子句之后。
第三,要为要更新的T1和/或T2表中的列分配新值。
第四,WHERE子句中的条件用于指定要更新的行。

2.样品

首先 我们将在这些示例中使用一个新的示例数据库 empdb 示例数据库包含2个表:
员工表将存储在员工编号 姓名 工作表现和工资的数据。
优点表存储员工绩效和绩效百分比。
以下语句在empdb示例数据库中创建表并导入数据:
  1. CREATE DATABASE IF NOT EXISTS empdb;

  2. USE empdb;
  3. -- create tables
  4. CREATE TABLE merits (
  5. performance INT(11) NOT NULL,
  6. percentage FLOAT NOT NULL,
  7. PRIMARY KEY (performance)
  8. );
  9. CREATE TABLE employees (
  10. emp_id INT(11) NOT NULL AUTO_INCREMENT,
  11. emp_name VARCHAR(255) NOT NULL,
  12. performance INT(11) DEFAULT NULL,
  13. salary FLOAT DEFAULT NULL,
  14. PRIMARY KEY (emp_id),
  15. CONSTRAINT fk_performance FOREIGN KEY (performance)
  16.   REFERENCES merits (performance)
  17. );
  18. -- insert data for merits table
  19. INSERT INTO merits(performance,percentage)
  20. VALUES(1,0),
  21.   (2,0.01),
  22.   (3,0.03),
  23.   (4,0.05),
  24.   (5,0.08);
  25. -- insert data for employees table
  26. INSERT INTO employees(emp_name,performance,salary)  
  27. VALUES('Mary Doe', 1, 50000),
  28.   ('Cindy Minsu', 3, 65000),
  29.   ('Sue Greenspan', 4, 75000),
  30.   ('Grace Dell', 5, 125000),
  31.   ('Nancy Johnson', 3, 85000),
  32.   ('John Doe', 2, 45000),
  33.   ('Lily Bush', 3, 55000);
复制代码

2.1使用INNER JOIN子句的MySQL UPDATE JOIN示例

假设想根据员工的工作表现来调整员工的工资。

因此,优秀百分比存储在优点表中 必须使用更新INNER JOIN语句根据存储在优点表中的比例来调整员工表中员工的工资。
员工和优点表之间以是绩效与绩效相关联的。请参见以下查询:
上面查询语句的工作原理是什么?
我们仅在UPDATE子句之后指定employees表 因为我们只想更新employees表中的数据。
对于雇员表中的每一行 查询根据优点表​​中性能列中的值来检查雇员表中的性能列中的值如果找
到一个匹配 则获得优点表中的百分比 并更新雇员表中的薪金列。
  1. mysql> select * from employees; -- 更新之前的数据
  2. +--------+---------------+-------------+--------+
  3. | emp_id | emp_name  | performance | salary |
  4. +--------+---------------+-------------+--------+
  5. |  1 | Mary Doe  |   1 | 50000 |
  6. |  2 | Cindy Minsu |   3 | 65000 |
  7. |  3 | Sue Greenspan |   4 | 75000 |
  8. |  4 | Grace Dell |   5 | 125000 |
  9. |  5 | Nancy Johnson |   3 | 85000 |
  10. |  6 | John Doe  |   2 | 45000 |
  11. |  7 | Lily Bush  |   3 | 55000 |
  12. +--------+---------------+-------------+--------+
  13. 7 rows in set

  14. mysql> UPDATE employees
  15.   INNER JOIN
  16. merits ON employees.performance = merits.performance
  17. SET
  18. salary = salary + salary * percentage; -- 执行连接更新
  19. Query OK, 6 rows affected
  20. Rows matched: 7 Changed: 6 Warnings: 0

  21. mysql> select * from employees; -- 更新之后的数据
  22. +--------+---------------+-------------+--------+
  23. | emp_id | emp_name  | performance | salary |
  24. +--------+---------------+-------------+--------+
  25. |  1 | Mary Doe  |   1 | 50000 |
  26. |  2 | Cindy Minsu |   3 | 66950 |
  27. |  3 | Sue Greenspan |   4 | 78750 |
  28. |  4 | Grace Dell |   5 | 135000 |
  29. |  5 | Nancy Johnson |   3 | 87550 |
  30. |  6 | John Doe  |   2 | 45450 |
  31. |  7 | Lily Bush  |   3 | 56650 |
  32. +--------+---------------+-------------+--------+
  33. 7 rows in set
复制代码

因为省略了UPDATE语句中的WHERE子句 所以employees表中的所有记录都被更新如果需
要绩效等级大于1的员工才更新薪资那么sql可以这样写:
  1. UPDATE employees
  2.   INNER JOIN
  3. merits ON employees.performance = merits.performance
  4. SET
  5. salary = salary + salary * percentage
  6. WHERE employees.performance > 1;
复制代码


2.2使用LEFT JOIN的MySQL UPDATE JOIN示例

假设公司又雇用了替代新员工:
  1. INSERT INTO employees(emp_name,performance,salary)
  2. VALUES('Jack William',NULL,43000),
  3.   ('Ricky Bond',NULL,52000);
复制代码

因为这些员工是新员工 所以他们的绩效performance 数据不可用或为NULL。现在

员工表中的数据 如下所示:
  1. mysql> SELECT * FROM employees;
  2. +--------+---------------+-------------+--------+
  3. | emp_id | emp_name  | performance | salary |
  4. +--------+---------------+-------------+--------+
  5. |  1 | Mary Doe  |   1 | 50000 |
  6. |  2 | Cindy Minsu |   3 | 66950 |
  7. |  3 | Sue Greenspan |   4 | 78750 |
  8. |  4 | Grace Dell |   5 | 135000 |
  9. |  5 | Nancy Johnson |   3 | 87550 |
  10. |  6 | John Doe  |   2 | 45450 |
  11. |  7 | Lily Bush  |   3 | 56650 |
  12. |  8 | Jack William | NULL  | 43000 |
  13. |  9 | Ricky Bond | NULL  | 52000 |
  14. +--------+---------------+-------------+--------+
  15. 9 rows in set
复制代码

要计算新员工的薪水 不能使用UPDATE INNER JOIN语句为什么不能 可参考sql之左联接 右联接内部联接的区别
因为它们的绩效数据在优点表中不可用。这就是为什么要使用UPDATE LEFT JOIN来实现了。
当UPDATE LEFT JOIN语句在另一个表中没有相应行时 就会更新表中的一行。
例如 可以使用以下语句将新员工的工资增加1.5%:
  1. UPDATE employees
  2.   LEFT JOIN
  3. merits ON employees.performance = merits.performance
  4. SET
  5. salary = salary + salary * 0.015
  6. WHERE
  7. merits.percentage IS NULL;
复制代码

执行结果如下:
  1. mysql> UPDATE employees
  2.   LEFT JOIN
  3. merits ON employees.performance = merits.performance
  4. SET
  5. salary = salary + salary * 0.015
  6. WHERE
  7. merits.percentage IS NULL;
  8. Query OK, 2 rows affected
  9. Rows matched: 2 Changed: 2 Warnings: 0

  10. mysql> select * from employees;
  11. +--------+---------------+-------------+--------+
  12. | emp_id | emp_name  | performance | salary |
  13. +--------+---------------+-------------+--------+
  14. |  1 | Mary Doe  |   1 | 50000 |
  15. |  2 | Cindy Minsu |   3 | 66950 |
  16. |  3 | Sue Greenspan |   4 | 78750 |
  17. |  4 | Grace Dell |   5 | 135000 |
  18. |  5 | Nancy Johnson |   3 | 87550 |
  19. |  6 | John Doe  |   2 | 45450 |
  20. |  7 | Lily Bush  |   3 | 56650 |
  21. |  8 | Jack William | NULL  | 43645 |
  22. |  9 | Ricky Bond | NULL  | 52780 |
  23. +--------+---------------+-------------+--------+
  24. 9 rows in set
复制代码

示例
  1. # 单表join
  2. update bbs_uhome_card_activate ca INNER JOIN bbs_uhome_card_rules cr on ca.card_brach
  3. =cr.card_bach set ca.create_user=cr.create_user;
  4. # 多表join
  5. UPDATE bbs_uhome_card_order co INNER JOIN bbs_uhome_card_order_record cor on co.order_no=c
  6. or.order_no JOIN bbs_uhome_card_activate ca on cor.card_no=ca.card_no set co.c
  7. reate_user=ca.create_user
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.