Mysql: 表中数据的增删改
每博一文案
林清玄曾说,我要开花,是为了完成,我作为一株花的庄严生命,不管你们
怎么看我,我都要开花。人生在世,无论我们怎么迎合别人,都不可能让所有
人都满意,得到每个人的喜欢,你好不好,总有误解你,你真不真,总有人不领情。
对你有意见的人,不管你怎么迁就退让,他都不会满意,不愿意相信你的人,无论你怎么解释,
他都不会相信,不是所有人都值得,我们浪费时间和精力争辩的。这辈子不求人人满意,
但求问心无愧。汪曾祺在人间草木中写道,栀子花粗粗大大。又香得掸都掸不开,于是文雅人不取,
以为品格不高。栀子花说,去你的,我就是要这样香,香得痛痛快快,你们管得着吗 !
别人怎么说是别人的事,我们要做的就是按照自己的意愿去生活,与其在意别人
的看法,每天小心翼翼。不如做好自己的事,问心无愧,活得坦荡,自然,很喜欢这样一句话,
单单是生活就让人头疼不已,若是在乎别人的眼光,那就是有点本末倒置了。
—————— 一禅心灵庙语
文章目录
为表插入数据内容
我们知道了如何创建表后 Mysql: 创建表 和 管理表_ChinaRainbowSea的博客-CSDN博客 ,就该为表插入数据,因为只有当表中存在数据,该表才有意义可言,不然就是 一个空空如也的箱子,没有食物。
使用关键字 INSERT 插入数据
对于INSERT
数据的插入存在这多种方式,这里为大家介绍如下方式:
首先我们先创建一个表 emp1
用于对表数据的插入
CREATE TABLE IF NOT EXISTS emp1(
id INT,
`name` VARCHAR(15),
hire_date DATE,
salary DOUBLE
);
第一种方式:
省略掉对于字段名(列)的声明,一条一条的为表插入数据内容
注意:
1. 这种方式的插入数据,因为没有手动声明字段,所以自动是按照默认表的列(字段)中的顺序插入数据的,
所以一定要按照默认表中的列顺序插入数据(值的顺序必须和数据表中字段定义时的顺序相同),不然,轻则会因为数据类型的自动转换导致数据发生截断,导致数据错误,重则报错插入表内容失败。
2. 当你插入的表中的内容是字符串,时间日期时,需要使用单引号括起来。
3. 这种方式的添加数据,当我们省略了添加的列(字段)内容,并不会置为NULL,而是报错。因为是按照默认表的列顺序插入数据的,所以我们不可以省略掉任何一个列(字段)的数据,必须一次性按照默认表的顺序全部把数据都插入进去,不然是会报错的。
格式如下
INSERT INTO 表名
VALUES (列1值, 列2的值, 列3的值);
例如: 为表emp1
添加数据
SELECT *
FROM emp1;
INSERT INTO emp1
VALUES (1,'Tom','2000-12-21',9000);
注意没有手动声明字段,一定要按照默认的字段顺序添加表的数据内容
查看是否添加成功
SELECT *
FROM emp1;
当没有按照表中默认顺序插入数据时的错误示范
INSERT INTO emp1
VALUES (2,34000,'2000-12-21', 'Jerty');
/* 这里默认的值中 的 name varchar 类型插入 34000
salary int 类型插入 Jerty 无法转换 报错 */
第一种方式:如果省略了,表中列的任何一个数据内容都是会报错的,错误示范如下:
INSERT INTO emp1
VALUES (2,'Jerty');
/* 这里省略了默认值中的 hire_date, salary
的内容 */
第二种方式:
手动声明字段,按照声明的字段顺序插入数据
推荐使用这种方式,因为这种方式的插入,可读性高,不容易出错
注意:
1. 我们手动声明了字段的插入顺序,只要按照这个声明的顺序插入数据就可以了。注意手动声明字段的个数与插入的数据的个数是要一致的。不然无法插入成功。
2. 使用这种手动声明字段插入数据的方式,当我们没有声明的字段,不会插入到内容,如果该字段中设定了初始值,就默认是初始值的内容,如果该字段中没有设定初始值并且没有约束条件(NOT NULL),则默认设置为 NULL。
3. 如果一个字段约束条件设定了 NOT NULL, 你省略了插入数据,或者插入数据 NULL,是会报错的。
格式如下:
INSERT INTO 表名 (列名1, 列名2, 列名3)
VALUES (数据内容1, 数据内容2, 数据内容3);
例子: 为表emp
插入第二条数据
INSERT INTO emp1 (id, `name`, salary, hire_date)
VALUES (2,'Jerry', 60000, '1999-9-9');
当我们省略一些插入的字段名(列),存在默认值,插入默认值,没有设定默认值,也没有 NOT NULL
约束条件,则默认是 NULL
。
例如,为表 emp1
插入数据,省略 字段salary
INSERT INTO emp1 (id,`name`, hire_date) /* name 与关键字冲突了,需要使用上着重号*/
VALUES (3,'Shk', '2001-9-1');
注意: 当声明的是一个字段,插入一个字段的数据内容,其他是字段的内容,存在默认值,则是默认值,不存在默认值并且没有约束条件NOT NULL
则默认添加的是 NULL
,如果存在约束条件NOT NULL
则会报错,因为该约束条件不允许添加 NULL
数据。这一点大家需要注意,因为很多初学者会认为,这么做: 当使用 SELECT 查询表时 ,发现有些字段是 NULL,就会使用 INSERT
插入数据的方式,更改字段为 NULL 的内容,这种做法是错误的,只会得到更多的 NULL值,如下面的结果,更改数据是要使用UPDATE
的方式.
INSERT INTO emp1 (`name`)
VALUES ('TM'); /* 其他没有声明的字段,其插入是数值,要么是NULL,要么是默认值*/
插入NULL
INSERT
语句中想要给某一列赋予 NULL
的内容,可以直接在VALUES
子句的值清单中写入 NULL
。
例如,为表emp1
添加数据其中的字段 hire_date
和 salary
设都为 NULL
INSERT INTO emp1 (id, `name`, hire_date, salary)
VALUES (4,'Jim',NULL,NULL);
同时插入多条数据
INSERT
语句可以同时向表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:
INSERT INTO 表名 (列名1, 列名2, 列名3)
VALUES (数据内容1, 数据内容2, 数据内容3),
(数据内容1, 数据内容2, 数据内容3),
(数据内容1, 数据内容2, 数据内容4);
例如: 为表 emp1
中插入多条数据
INSERT INTO emp1 (id, `name`, hire_date, salary)
VALUES (5,'小华', '2022-9-8', 10000),
(6, '小红', '2022-8-9', 8000),
(7, 'KiKi', '1990-1-1', 60000);
或者一条一条的将多条数据一个一个的插入,如下:
INSERT INTO emp1(id, `name`, hire_date, salar)
VALUES (5,'小华', '2022-9-8', 10000);
INSERT INTO emp1(id, `name`, hire_date, salar)
VALUES (6, '小红', '2022-8-9', 8000);
INSERT INTO emp1(id, `name`, hire_date, salar)
VALUES (7, 'KiKi', '1990-1-1', 60000);
使用INSERT
同时插入多条记录时,Mysql
会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:
Records
:表明插入的记录条数Duplicates
:表明插入时被忽略的记录,原因可能时这些记录包含了重复的主键值。Warnings
: 表明有问题的数据值,例如发生数据类型的转换
一个同时插入多行记录的 INSERT 语句等同于多个单行插入的 INSERT语句,但是多行的 INSERT 语句在
处理过程中效率更高。因为 MySQL 执行单条 INSERT 语句插入多行数据比使用多条 INSERT 语句快,
所以在插入多条记录时最好选择使用单条 INSERT 语句的方式插入
插入默认值
通过显式的方式插入默认值 推荐 ,可读性高
我们还可以向表中插入默认值(初始值), 我们使用 INSERT
中的 VALUES
子句中指定 DEFAUlT
关键字(默认值)
格式如下:
INSERT INTO 表名 (列名1, 列名2, 列名3)
VALUES (数据内容1, 数据内容2, DEFAULT); /* DEFAULT 默认值 */
我们先将表emp1
中的 salary
的初始值设为 0 ,具体如何设定大家可以移步到 🔜🔜🔜 : Mysql: 创建表 和 管理表_ChinaRainbowSea的博客-CSDN博客
ALTER TABLE emp1
MODIFY salary INT DEFAULT 0;
DESC emp1; /* 差表结构 */
例如:为表emp1
中插入数据 id = 8,name = benefit, hire_date = 2022-3-2,salary = default
INSERT INTO emp1(id, `name`, hire_date, salary)
VALUES (8,'benefit', '2022-3-2', DEFAULT);
通过隐式的方式插入默认值
不建议,可读性差
插入默认值时,也可以不使用 DEFAULT
关键字,只要在手动声明字段中省略该字段和是在 VALUES
中不插入该字段中的数据内容就可以了。和前面的省略该字段的数据插入一样
例如:为表 emp1
中插入 id = 9,name = benefit2 , hire_date = 2022-3-3, salary = default
INSERT INTO emp1(id,`name`, hire_date)
VALUES (9,'benefit2', '2022-3-3');
将查询结果的数据插入到表中
INSERT
还可以将 SELECT
语句查询的结果插入到表中,此时不需要把每一条记录的值一个一个输入,只需要使用一条 INSERT
语句中一条SELECT
语句组成的组合语句即可快速地从一个或多个表中向一个表中插入多行。
将 VALUES
省略到 接查询语句
注意
1. 查询的结果要与 手动声明的字段中的顺序一致,以及和字段中的数据类型一致,不然轻则可以插入数据,但是会发生类型的转换,数据的截断,从而导致数据没有意义。
2. 一般我们查询的表数据,都是来自其他的数据库当中的表,所以我们需要使用 `数据库名.表名` 所以到指明的数据库中的表,不然是会报错的。
具体格式如下:
INSERT INTO emp1 (列名1, 列名2, 列名3)
VALUES (数据内容1, 数据内容2, 数据内容3)
SELECT 查询的列名1, 查询的列名2
FROM 查询的表名;
例如: 为表 emp1
插入到 查询 atatguigudb.employees
表中的 employee_id , last_name, hire_data, salary, 中的 department_id 中 (70, 60)
INSERT INTO emp1(id, `name`, hire_date, salary)
SELECT employee_id, last_name, hire_date, salary
FROM atguigudb.`employees` /* employees 是在数据库 atguigudb 表中的所以需要索引指明表的来历*/
WHERE department_id IN (70,60);
这里我们可以运行更加复杂的查询操作进行一个数据的插入操作。
为表更新数据内容
使用INSERT
语句向表中插入数据之后,有时却想要再更改数据,这时并不需要把数据删除之后再重新插入,
使用UPDATE
语句就可以改变表中的数据了。
格式如下:
UPDATE 表名
SET 修改的字段名 = 修改后的字段内容
WHERE 筛选出需要修改的字段,筛选条件, 也可以省略(对表中的数据全部更新);
注意
1. 可以一次性更新多条数据的内容,如果需要回滚数据,需要保证在DML前,进行设置:SET AUTOCOMMIT = FALSE;
2. 需要使用 WHERE 进行需要修改的字段的筛选,如果不筛选的话,表中所有的数据都会更新
3. 并不是所有的数据都可以被更新到的,存在约束条件的限制,外键的取值限制
例如:将表 emp1
中 name 为 benefit 中的 salary 改为 15000
UPDATE emp1
SET salary = 15000
WHERE `name` = 'benefit'; /* name 与 关键字冲突了, 需要使用着重号*/
/* 筛选需要更新的字段, 如果省略的话就会全部更新 */
省略筛选条
件全部更新
当我们把 where
的筛选条件省略了,其效果就是会对表中的全部数据进行一个更新
例如,将表emp1
中字段 salary 全部改为 30000
UPDATE emp1
SET salary = 30000;
使用 NULL 更新
使用 UPDATE
也可以将列更新为 NULL
(该更新俗称为 NULL 清空)。此时只需要将赋值表达式右边的值直接写为 NULL
即可。注意: 仅限于为设置NOT NULL
约束的列。
格式如下:
UPDATE 表名
SET 修改的字段名 = NULL
where 筛选条件, 也可以省略(对表中的数据全部更新);
例如:将表emp1
name = Baer 的 hire_date 改为 NULL
UPDATE emp1
SET hire_date = NULL
WHERE `name` = 'Baer';
多列内容的更新
UPDATE
语句的 SET
子句支持同时将多个列作为更新对象,使用逗号将每个字段中的更新分隔
开来
格式如下:
UPDATE 更新的表名
SET 更新的字段1 = 更新的内容1 , 更新的字段2 = 更新的内容2
WHERE 筛选条件, 也可以省略(对表中的数据全部更新);
例如:将表emp1
中的 id = NULL 更新为 0, 以及将 hire_date = 1990 -9 -1;
UPDATE emp1
SET id = 0, hire_date = '1990-9-1'
WHERE id IS NULL;
为表删除数据内容
使用关键字DELETE
删除表中的数据,如果删除的时,没有进行一个条件的筛选,则会将表中的数据全部删除。
注意 删除的对象是一行数据的,不是一列为对象的。
格式如下:
DELETE FROM 表名
WHERE 筛选出需要删除的字段内容的数据
/* 也可以省略不筛选表示清空表中所有的数据*/
例如:将表emp1
表中的 salary = null 的内容清空
DELETE FROM emp1
WHERE salary IS NULL;
如果不加筛选条件的话就是清空表中所有的数据了
DELETE FROM emp1;
TRUNCATE
同样也可以把表清空
TRUNCATE TABLE emp1;
与 SELECT
语句不同的是,DELETE
语句中不能使用 GROUP BY,HAVING
和 ORDER BY
三类子句,而只能使用WHERE
子句。原因很简单。GROUP BY
和HAVING
是从表中选取数据时用来改变抽取数据形式的,而ORDER BY
是用来指定取得结果显示顺序的。因此,在删除表中数据时,它们都不起什么作用。(也就是说 对于 GROUP BY ,HAVING, ORDER BY都是通过已有的数据进行一个处理,处理的结果还是作为临时表显示的,对于删除实质的数据没有任何的作用)
其中关于 DELETE
与 TRUNCATE
之间的不同 ,大家可以移步到 :🔜🔜🔜 Mysql: COMMIT 和 ROLLBACK_ChinaRainbowSea的博客-CSDN博客
MySQL 8.0 新特性: 计算列
什么叫计算列
呢,简单来说就是某一列的值是通过别的列的值,计算得来的,例如,a
列值为 1,b
列值为 2 ,c
列不需要手动插入,定义为 a+b
的结果为 c
的值,那么 c
就是计算列,是通过别列计算得到的,该 c
计算列还会自动根据 a,b
的值而,变化。注意 其计算结果 加减乘除
都是可以的。
在 Mysql 8.0
中 CREATE TABLE
和 ALTER TABLE
中都可以增加计算列,但不可以将已存在的列,修改为 计算列。
CREATE TABLE 中使用 GENERATED ALWAYS AS (...) VIRTUAL
设定计算列
格式如下:
CREATE TABLE 表名 (
列名1 数据类型
列名2 数据类型 /* 根据别的列设定值加减乘除都额可以 */
列名3 数据类型 GENERATED ALWAYS AS (列名1 + 列名2) VIRTUAL
);
例如:创建一个表 test1
c 作为计算列
CREATE TABLE test1 (
a INT ,
b INT ,
c INT GENERATED ALWAYS AS (a+b) VIRTUAL
);
为 a 和 b 插入数值 a = 10 ,b = 20
INSERT INTO test1(a, b)
VALUES (10,20);
SELECT *
FROM test1;
修改 a = 100 , c 会自动变化
UPDATE test1
SET a = 100;
添加计算列字段
为表中添加 计算列 ,使用ALTER TABLE
+ ADD
格式如下:
ALTER TABLE 表名 /* 其他列的值计算最为值,加减乘除都可以*/
ADD 字段 数据类型 GENERATED ALWAYS AS (列名1+列名2) VIRTUAL;
例如,为表test1
添加 计算列 sum (a+b+c)
ALTER TABLE test1
ADD SUM INT GENERATED ALWAYS AS (a+b+c) VIRTUAL;
SELECT *
FROM test1;
添加一个 sub (sum - a) 的计算列
ALTER TABLE test1
ADD sub INT GENERATED ALWAYS AS (SUM - a) VIRTUAL;
总结:
- 关于对表中数据的全部更新,以及表中数据的清空,需要慎重考虑,防止不必要的严重数据丢失。而承担公司损失的后果。
最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!