持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
前言
上篇我们学习了MySQL的名规范以及MySQL8.0新特性-DDL的原子化。有兴趣的小伙伴可以阅读(# MySQL学习-命名规范以及DDL的原子化)。
下面学习DML添加,更新,删除数据。
添加数据
首先创建数据库表。
USE testdb;
CREATE TABLE IF NOT EXISTS emp1 (
id INT,
'name' VARCHAR(15),
hire_date DATE,
salary DOUBLE(10, 2)
);
方式一
一条一条的添加数据。
- 没有指明添加的字段。
正确的方法:
INSERT INTO emp1
VALUES (1, 'TOM', '2022-06-16', 2500);
错误的方法:
INSERT INTO emp1
VALUES (2, 3600, '2022-06-16', 'jerry');
注意: 一定要按照声明的字段的先后顺序添加。
- 指明要添加的字段。
INSERT INTO emp1(id, hire_date, salary, 'name')
VALUES (2, '2022-06-16', 3600, 'jerry');
下面这种字段不写全的方式也是正确的。
INSERT INTO emp1(id, salary, 'name')
VALUES (3, 1600, 'baby');
上面的方法没有进行赋值的'hire_date'的值为null。
这种一条一条增加数据的方式,推荐第二种方法添加。
- 同时插入多条记录,使用逗号的方式增加。
INSERT INTO emp1(id, salary, 'name')
VALUES
(6, 6800, 'xiaoming'),
(5, 3200, 'xiaolan');
注意: 一个同时插入多条记录的INSERT语句等同于单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多条数据比使用多条INSERT语句块,所以在插入多条记录时最好选择使用单条INSERT语句的方式插入。
- VALUES也可以写成VALUE,但是VALUES是标准写法。
- 字符和日期型数据应包含在单引号中。
方式二
将查询结果插入到表中。
INSERT INTO emp1(id, salary, 'name', hire_date)
SELECT employee_id, salary, name, hire_date
FROM employees
WHERE department_id = 10
这样使用SELECT查询的结果可以插入到新表中。这里需要注意,查询的字段一定要与添加到的表的字段是一一对应的。
通过DESC,我们分别查看一下两张表的结构。
DESC emp1
DESC employees
可以看到emp1与employees结构是有些不一样的,有些字段的长度可能对应不上。所以在插入前,最好查看一下两张表的结构是否有异同。
说明: emp1表中要添加数据的字段的长度不能低于employees表中查询的字段的长度。如果emp1表中要添加数据的字段的长度低于employees表中查询的字段的长度的话,就有添加不成功的风险。
更新数据(或修改数据)
UPDATE ... SET ... WHERE ...
可以实现批量修改数据。
修改一条数据的一个字段。
UPDATE emp1
SET hire_data = CURDATE()
WHERE id = 5;
同时修改一条数据的多个字段。
UPDATE emp1
SET hire_data = CURDATE(), salary = 6000
WHERE id = 4;
举例一
将表中姓名中包含字符x的提薪20%。
UPDATE emp1
SET salary = salary * 1.2
WHERE NAME LIKE '%x%';
注意: 修改数据时,是可能存在不成功的情况的。(可能是由于约束的影响造成的)。比如以下情况:
UPDATE employees
SET department_id = 10000
WHERE employee_id = 100;
运行发现报错,这是因为在另一个部门表中department_id并没有10000的值。
删除数据
DELETE FROM ... WHERE ...
DELETE FROM emp1
WHERE id = 1;
注意: 删除数据时,是可能存在不成功的情况的。(可能是由于约束的影响造成的)。比如以下情况:
DELETE FROM departments
WHERE department_id = 100;
运行也会发现报错,这是因为另外表中有使用这条数据的记录。
总结: DML操作默认情况下,执行完以后都会自动提交数据。如果希望执行完后不自动提交数据,则需要使用SET autocommit = FALSE。
今天先学到这里,明天继续。