ITPub博客

首页 > 数据库 > 数据库开发技术 > SQL教程#6Day:更新数据——Updating

SQL教程#6Day:更新数据——Updating

原创 数据库开发技术 作者:jackzhang 时间:2024-04-06 23:45:22 0 删除 编辑
“

教程所用示例表:关注并回复关键字“sql教程示例数据”即可获取,需要的朋友请自取。

引言(Preface)

哈喽,各位朋友大家好啊🤝🤝🤝!清明节过了,大家有没有出去玩呢?假期的时间总是过得格外的快,眨眼间又到上班学习的时间了。在这个技术高速发展的时代,唯一能够让我们不掉队的方式就是学习。所以,让我们开始今天的学习之旅吧!

欢迎来到我的SQL教程系列的第6讲——更新数据。今天的主讲内容是SQL中的数据更新操作。在SQL数据库管理中,更新数据是一项至关重要的操作。无论是对单个表中的记录进行更新,还是在记录存在于另一个表中时更新数据,更新操作都是保持数据库内容最新和准确的重要手段。本文将专注于SQL中更新数据的各种技术和方法,包括单表记录更新、当记录在另一个表中存在时的更新、使用另一个表的值更新记录以及合并记录等。通过深入探讨这些主题,我们将学习如何高效地管理和更新数据库中的数据,为数据库管理工作提供有力的支持。

更新记录(Updating)

单表记录更新

  • Problem:假设你想修改单表中的某些行或所有行的值。比如,将20号部门中所有员工的薪水都增长10%。

  • Solution:使用UPDATE语句和WHERE子句即可实现按条件更新记录。

UPDATE emp
SET sal = sal * 1.10
WHERE deptNo = 20;
  • Discussion:UPDATE语句和WHERE子句可以实现按条件更新行,WHERE子句后面跟条件表达式即可(比如上面的deptNo = 20)。如果省略WHERE子句,则会更新表中的所有行。

带CASE表达式的UPDATE语句

  • Problem:前面我们将20号部门的所有员工薪水增长了10%,假设我们知道更新前每个员工的薪资:
SELECT deptNo,
       eName,
       sal        ori_sal,
       sal * .10  amt_to_add,
       sal * 1.10 new_sal
FROM emp
WHERE deptNo = 20
ORDER BY deptNo, new_sal;

现在想要将这些员工的薪水变回更新前的值,如何实现?

  • Solution:在UPDATE的SET子句后使用CASE表达式即可实现。
UPDATE emp
SET sal = CASE
              WHEN eName = 'SMITH' THEN 800
              WHEN eName = 'ADAMS' THEN 1100
              WHEN eName = 'JONES' THEN 2975
              WHEN eName = 'SCOTT' THEN 3000
              WHEN eName = 'FORD' THEN 3000
              ELSE sal
    END
WHERE deptNo = 20;
  • Discussion:CASE表达式相当于二重条件,WHERE子句是第一重条件(根据部门号更新),SET子句后后的CASE表达式再根据另一个字段(员工姓名)将20号部门的员工薪水更新回原来的值。这有点类似数据恢复,但是这种方法仅限于技术说明或者涉及需要更新的行比较少时,在实际工作中,数据量往往比较大,这种方式不可取,需要通过事务、日志或者第三方工具等方式恢复数据。

当记录在另一个表中存在时更新行

  • Problem:当一个表中的行在另一个表中存在时更新。例如,如果若员工在表emp_bonus表如下:中时,将其薪水增加20%。emp_bonus表如下:
DROP TABLE IF EXISTS emp_bonus;
CREATE TEMPORARY TABLE IF NOT EXISTS emp_bonus
(
    empNo INT PRIMARY KEY,
    eName VARCHAR(50) NOT NULL
);

INSERT INTO emp_bonus (empNo, eName)
VALUES (7360, 'SMITH'),
       (7900, 'JAMES'),
       (7934, 'MILLER');

SELECT * FROM emp_bonus;
  • Solution:在UPDATE语句的WHERE子句中使用一个子查询,用于找到那些在emp_bonus表中的员工,然后将他们的薪水增加20%即可。
UPDATE emp
SET sal = sal * 1.20
WHERE empNo IN (SELECT empNo FROM emp_bonus);
  • Discussion:子查询的结果表示emp表中需要更新的行,IN谓词用于检验emp表中的员工号是否在子查询所返回的员工号值列表中。另外,我们还可以使用相关子查询实现与上面相同的更新效果:
UPDATE emp
SET sal = sal * 1.20
WHERE EXISTS(
              SELECT NULL
              FROM emp_bonus eb
              WHERE emp.empNo = eb.empNo
          );

使用其他表的值更新当前表的行

  • Problem:假设你想使用其他表的值更新当前表的行。比如,有一个薪水表new_sal,里面存储特定员工的薪水,如下:
DROP TABLE IF EXISTS new_sal;
CREATE TEMPORARY TABLE IF NOT EXISTS new_sal
(
    deptNo INT PRIMARY KEY,
    sal    INT NOT NULL
);

INSERT INTO new_sal (deptNo, sal)
VALUES (10, 4000);

SELECT * FROM new_sal;

如果emp表中的部门号跟new_sal表中部门号匹配,则将emp表中的对应部门下员工的薪水更新为new_sal表中的薪水,佣金更新为薪水的一半。

  • Solution:这涉及到两表关联更新,当关联条件满足时,更新对应行。
-- MySQL
UPDATE emp e, new_sal ns
SET e.sal  = ns.sal,
    e.comm = ns.sal / 2
WHERE e.deptNo = ns.deptNo;
  • Discussion:通过表关联可以实现更新其中一个表的行(条件满足时)。上面的实现是MySQL环境,如果你的DBMS是其他(如Oracle、PostgreSQL、DB2等),实现方法有所不同,可以自行探索。如果不知道怎么做,可以留言告诉我哦~~。

总结(Conclusion)

在本教程中,我们深入研究了SQL中更新数据的各种技术和方法。通过学习如何对单个表中的记录进行更新,以及在记录存在于另一个表中时如何更新数据,我们提升了SQL操作的熟练程度,并增强了对数据库管理的理解和应用能力。同时,我们还学习了如何使用另一个表的值来更新当前表的记录。通过掌握这些技术,我们能够更加灵活和高效地管理和更新数据库中的数据,保持数据内容的最新和准确。希望本教程能够帮助您更好地掌握SQL中更新数据的操作,并在实际工作中取得更大的成就。


“

如果你觉得这篇文章对你有用,请“点赞➕关注”支持我(关注我,不迷路🤭🤭🤭),你的点赞和关注就是我持续创作分享的动力,让更多的朋友发现并加入我们,共同学习和进步!

Thank you for reading!

- END -

推荐阅读👇👇👇

SQL教程#5Day:插入操作—Inserting

好消息!ChatGPT不用登录可以免费使用了

SQL教程#4Day:多表关联查询#2

SQL教程#3Day:多表关联查询#1

SQL教程#2Day:查询结果排序,order by?


原文作者:数据派探险家;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55947