数据处理之增删改
1. 插入数据
1.2 方式一:VALUES 的方式添加
这种语法一次性只能插入一条
数据
情况一:为表中的所有字段按默认顺序插入数据
INSERT INTO 表名
VALUES (value1,value2,...) 顺序必须和声明表的字段顺序一致
情况二:为表中指定字段插入数据
INSERT INTO 表名(column1,column2,...)
VALUES (value1,value2,...)
其他字段的值为表定义时的默认值
情况三:同时插入多条记录
INSERT INTO 表名
VALUES
(value1,value2,...),
(value1,value2,...),
(value1,value2,...);
或
INSERT INTO 表名(column1,column2,...)
VALUES
(value1,value2,...),
(value1,value2,...),
(value1,value2,...);
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:
● Records:表明插入的记录条数。
● Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
● Warnings:表明有问题的数据值,例如发生数据类型转换。
一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中 效率更高 。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句快,所以在插入多条记录时最好选择使用单条INSERT语句的方式插入。
小结:
- 字符和日期类型数据应使用单引号
1.3 方式2:将查询结果插入到表中
INSERT 可以将 SELECT 语句查询的结果插入到表中
INSERT INTO 目标表名(column1,column2,...)
SELECT (column1,column2,...)
FROM 源表名
[WHERE ....]
- 在 INSERT 语句中加入子查询。
- 不必书写 VALUES 子句。
- 子查询中的值列表应与 INSERT 子句中的列名对应。
2. 更新数据
UPDATE 表名
SET column1=value1,column2=value2...
[WHERE ....]
-
可以一次更新
多条
数据 -
如果需要回滚数据,需要保证在DML前,进行设置:
SET AUTOCOMMIT = FALSE;
-
使用
WHERE
子句指定需要更新的数据
UPDATE employees
SET department_id = 70
WHERE employee_id = 112;
-
如果省略 WHERE 子句,则表中的所有数据都将被更新。
-
更新中的数据完整性错误
UPDATE employees
SET department_id = 55
WHERE department_id = 110;
employees 表和 departments 表有关联
department表中 没有 55 号的部门
3. 删除数据
DELETE FROM 表名
WHERE ...
WHERE 为可选参数,指定删除条件,如果没有WHERE子句,DELETE语句将删除表中的所有记录。
- 删除中的数据完整性错误
DELETE FROM departments
WHERE department_id = 60;
说明:You cannot delete a row that contains a primary key that is used as a foreign key in another table.
employees 表中有数据 与 department 表 关联
4. MySQL8新特性:计算列
有一列的数据是由其他列计算而来的。例如 a 列的值为 1,b 列的值为 2,c 列的值为 a + b
则 c 就是计算列
在 MySQL8.0 中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。
CREATE TABLE tb1(
id INT,
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL
);
INSERT INTO tb1(a,b) VALUES (100,200);
mysql> SELECT * FROM tb1;
+------+------+------+------+
| id | a | b | c |
+------+------+------+------+
| NULL | 100 | 200 | 300 |
+------+------+------+------+
1 row in set (0.00 sec)