目录
本文介绍了MySQL数据库操作语言(DML)的基本使用方法,包括数据添加、更新和删除操作。重点讲解了两种数据添加方式:单条插入和多条批量插入,并比较了它们的效率差异。同时详细说明了UPDATE和DELETE语句的使用方法及注意事项,特别强调了WHERE子句的重要性。文章还介绍了MySQL8.0的新特性计算列,该功能允许通过表达式自动生成列值。最后对比了DELETE和TRUNCATE TABLE的区别,指出后者虽然效率更高但不支持回滚,建议谨慎使用。这些操作在实际应用中可能因约束条件导致失败,使用时需特别注意。
添加数据:
方式1:一条一条添加数据:
未指明添加数据,必须按照字段生命顺序添加。
INSERT INTO 表名
VALUES (
对应表中的字段名顺序进行添加
数据值1,
数据值2,
...
),
(
对应表中的字段名顺序进行添加
数据值1,
数据值2,
...
),
...
(
对应表中的字段名顺序进行添加
数据值1,
数据值2,
...
);
插入完整的行,所有的字段,每一个字段都必须提供一个值,如果某个字段没有值,应该使用NULL,每一个字段必须以表中生命的顺序给出。虽然这种语法简单,但是不安全,应该避免使用。
推荐以下用法:
指明添加字段。
INSERT INTO 表名(字段名1,字段名2,...)
VALUES (
对应上面的字段名顺序进行添加
数据值1,
数据值2,
...
),
(
对应上面的字段名顺序进行添加
数据值1,
数据值2,
...
),
...
(
对应上面的字段名顺序进行添加
数据值1,
数据值2,
...
);
不需要与表中的生命顺序相同,没有值的字段可以不提供数据。
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息含义如下:
Records:表明插入的记录条数。
Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
Warnings:表明有问题的数据值。
一个同时插入多行记录的INSERT语句等于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句快,所以在插入多条记录时最好选择使用单条INSERT语句的方式插入。
字符和日期类型数据应包含在单引号中。
添加数据时,可能会因为约束的原因导致添加数据失败。
方式2:将查询结果插入到表中:
SELECT INTO 表名(字段名1,字段名2,...)
SELECT 对应上面的字段数量和类型
FROM 表名
[WHERE 条件];
应该要注意要添加的字段的类型不能低于查询表中的字段类型,否则可能会出现添加不成功的风险。
更新数据:
UPDATE 表明
SET 字段1 = 修改值,字段2 = 修改值,
...
WHERE 筛选出目标字段的行。
如果未使用HWERE进行筛选目标字段的行,那么该字段所有的值全都会被修改。
修改数据时,可能会存在不成功的情况,可能是因为约束的原因导致的。
删除数据:
DELETE FROM 表名
WHERE 过滤条件;
由于约束的原因,删除数据的操作也可能会失败。
如果删除数据不进行WHERE筛选,那么则会对进行操作的表进行删除,但是会保留表的结构。这个功能和TRUNCATE TABLE的功能时相同的,但是区别在于,TRUNCATE TABLE一旦执行操作之后,不能进行回滚,而DELETE TABLE执行操作之后可以进行回滚。TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少,但是TRUNCATE无事务且不触发TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。
MDL操作默认情况下,执行完之后都会自动提交数据,如果希望执行完成以后,不自动提交数据,则需要使用autocommit = FALSE。
MySQL8的新特性:计算列:
计算列简单来说就是某一列的值是通过别的列的计算得来的。
例如:a列的值为1,b列的值为2,c列的值不需要手动插入,定义为a+b的结果为c的值,那么c就是计算列,通过别的列计算得来的。
CREATE TABLE 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型 GENERATED ALWAYS AS (字段名1+字段名2) VIRTUAL
);
在MySQL8.0中,CREATE TABLE和ALTER TABLE中都支持增加计算列。