MySQL数据的插入、修改、删除(INSERT /Update/DELETE)

一、数据的插入(Insert/Create)


CREATE TABLE students (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    sn INT NOT NULL UNIQUE COMMENT '学号',
    name VARCHAR(45) NOT NULL,
    email VARCHAR(200) NULL
);

-- INSERT 操作的基本格式

-- 表名称:
-- 全名称: `库名`.`表名`
-- 库名和表名没有歧义的情况下: 库名.表名
-- 指定了默认库的情况下: 表名 遗憾着是 默认库.表名
-- 一次插入一行,并且插入的数据中包含 (id、sn、name、email) 所有的字段的数据
-- 由于插入的是全字段,所以 SQL 中可以省略字段部分
-- 后边跟要插入的值,值的顺序必须和表结构中的顺序一致
-- id、sn、name、email
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
-- 由于我们的 id 是主键、sn 是唯一键,所以这两个字段的值不能出现重复
INSERT INTO students VALUES (101, 10001, '孙悟空', '[email protected]');
-- 一次插入一行,指定列的插入,要求,没有默认值的字段,必须有值
-- id(自增,视为有默认值)
-- sn(没有默认值)
-- name(没有默认值)
-- email(允许为 Null,视为有默认值,就是 Null)
-- 所以 sn、name 字段必须在插入时有值
INSERT INTO students (sn, name) VALUES (20002, '鹿角大仙');
-- 指定字段的顺序,没有要求,不要求和建表的顺序有关系
-- 字段的顺序 和 传入的值的顺序一致即可
INSERT INTO students (name, sn) VALUES ('牛角大仙', 20003);
-- 多行插入
-- 多行 + 全字段    
INSERT INTO students VALUES
    (204, 30001, '贾宝玉', '[email protected]'),    -- 一条记录
    (205, 30002, '林黛玉', NULL),    -- 一条记录
    (206, 30003, '薛宝钗', NULL);    -- 一条记录
-- 多行 + 指定字段
INSERT INTO students (sn, name, email) VALUES
    (40001, '宋江', '[email protected]'),
    (40002, '扈三娘', '[email protected]'),
    (40003, '王英', NULL),
    (40004, '武松', NULL);

二、Update  更新操作:

指定where条件(如果不写where,视为所有记录都满足条件),一定可以选择出一批记录(可能只有一条,或者1条没有)只能统一将这批记录中的指定字段的值,一次性修改!
update 表名 set 要修改的字段 where ...
-- 更新操作
update exam_result set chinese = 60 where id between 1 and 3;

update exam_result set chinese = 30 where id = 1;
update exam_result set chinese = 60 where id = 2;
update exam_result set chinese = 90 where id = 3;

-- 表中已经存在的所有记录的语文都被改成了 40
update exam_result set chinese = 40;

-- 允许修改时,一次改多个字段
-- 字段直接用逗号(,)分割即可
update exam_result set chinese = 10, math = 20, english = 30 where id between 1 and 3;

-- 修改时,以字段的原来的值作为基础进行修改
update exam_result set math = math / 2 where not (id between 1 and 3);
-- 注意,不支持 math -= 3、math += 10,只能 math = math - 3、math = math + 10

三、DELETE 删除操作:

-- 数据库的所有操作,都是以一行行记录为基本单位
-- 目标:只想删除 孙悟空
-- delete 和 from 中间没东西
delete from exam_result where id = 2;            -- 最精确
delete from exam_result where name = '孙悟空';    -- 毕竟精确的
delete from exam_result where name like '孙__';    -- 正确的前提,是我知道我表里的数据有哪些
delete from exam_result where name like '孙%';    -- 不是数据库报错,是不符合目标错误,因为会把孙权也删除
-- 不加 where 条件,意味着所有记录都满足条件,所以是全表中的所有数据统统删除(慎用)
delete from exam_result;
-- 建议:
-- 1. 删除之前,先用 SELECT + 同样的 where 条件确认下数据是否满足预期
-- 2. 能用主键删除,优先用主键删除;由于主键不会重复,所以使用主键是最准确的
-- 从数据安全的角度,核心数据一定做好备份;

-- 截断表: DDL 操作,针对表结构的操作,视为把表结构复位(reset)
-- 主要体现的自增的 id 上,重点观察其生成的 id
-- exam_result 表当时建表时没有带上自增 id,我们先修改表结构,带上 AI
INSERT INTO db_11_23.exam_result SELECT * FROM db_11_22.exam_result;
truncate exam_result;
insert into exam_result (name, math, chinese, english) values ('A', 1, 1, 1);

-- 对比全表数据删除:DML 操作,针对表中的数据操作的,表结构不动
INSERT INTO db_11_23.exam_result SELECT * FROM db_11_22.exam_result;
delete from exam_result;
insert into exam_result (name, math, chinese, english) values ('A', 1, 1, 1);

-- truncate 和 delete 一样,也是谨慎使用
-- 如果我们已经明确要把表清空了,使用 truncate 会比 delete from 来的速度快
-- truncate 是时间复杂度是 O(1) :只需要动表结构,不管多少条数据
-- delete from 的时间复杂度是 O(n) :挨个记录遍历,删除

你可能感兴趣的:(java,开发语言,后端)