十三表数据的增删改操作

Posted Amo Xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十三表数据的增删改操作相关的知识,希望对你有一定的参考价值。

文章目录

前置知识:

一、数据库开发与实战专栏导学及数据库基础概念入门
二、MySQL 介绍及 MySQL 安装与配置
三、MySQL 数据库的基本操作
四、MySQL 存储引擎及数据类型
五、数据导入与基本的 SELECT 语句
六、MySQL 数据库练习题1(包含前5章练习题目及答案)
七、MySQL 多表查询详解(附练习题及答案----超详细)
八、MySQL 常用函数汇总(1)
九、MySQL 常用函数汇总(2)
十、MySQL 聚合函数、分组查询及过滤分组
十一、子查询详解
十二、创建和管理表

成功创建数据库和数据表以后,就可以针对表中的数据进行各种交互操作了。这些操作可以有效地使用、维护和管理数据库中的表数据,其中最常用的就是添加、修改和删除操作。本文将详细介绍如何通过 SQL 语句来实现表数据的增、删和改操作。本文知识架构及重难点如下:

一、插入数据

实际问题:

解决方式:使用 INSERT 语句向表中插入数据。 在建立一个空的数据库和数据表时,首先需要考虑如何向数据表中添加数据,该操作可以使用 INSERT 语句来完成。使用 INSERT 语句可以向一个已有数据表中插入一个新行,也就是插入一行新记录。在 mysql 中,INSERT 语句有 3种 语法格式,分别是 INSERT…VALUESINSERT…SETINSERT…SELECT 语句。下面将分别进行介绍。

1.1 使用 INSERT…VALUES 语句插入数据

使用 INSERT…VALUES 语句插入数据,是 INSERT 语句最常用的语法格式,如下所示:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
	[INTO] 数据表名 [(字段名,)]
	VALUES (| DEFAULT,),(),[ ON DUPLICATE KEY UPDATE 字段名=表达式,]

参数说明如下:

  1. [LOW_PRIORITY|DELAYED|HIGH_PRIORITY]:可选项,其中,LOW_PRIORITYINSERTUPDATEDELETE 语句都支持的一种可选修饰符,通常应用在多用户访问数据库的情况下,用于指示 MySQL 降低 INSERTDELETEUPDATE 操作执行的优先级;DELAYEDINSERT 语句支持的一种可选修饰符,用于指定 MySQL 服务器把待插入的行数据放到一个缓冲器中,直到待插数据的表空闲时,才真正在表中插入数据行;HIGH_PRIORITYINSERTSELECT 语句支持的一种可选修饰符,用于指定 INSERTSELECT 操作优先执行。
  2. [IGNORE]:可选项,表示在执行 INSERT 语句时,所出现的错误都会被当作警告处理。
  3. [INTO] 数据表名:可选项,用于指定被操作的数据表。
  4. [(字段名,…)]:可选项,当不指定该选项时,表示要向表中所有列插入数据,否则表示向数据表的指定列插入数据。
  5. VALUES (值|DEFAULT,…),(…),…:必选项,用于指定需要插入的数据清单,其顺序必须与字段的顺序相对应。其中,每一列的数据可以是一个常量、变量、表达式或者 NULL,但是其数据类型要与对应的字段类型相匹配;也可以直接使用 DEFAULT 关键字,表示为该列插入默认值,但是使用的前提是已经明确指定了默认值,否则会出错。
  6. ON DUPLICATE KEY UPDATE 子句:可选项,用于指定向表中插入行时,如果导致 UNIQUE KEYPRIMARY KEY 出现重复值,系统会根据 UPDATE 后的语句修改表中原有行数据。

INSERT…VALUES 语句在使用时,通常有以下3种方式:

情况1:为表的所有字段按默认顺序插入数据。语法如下:

#值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同
INSERT INTO 表名 VALUES (value1,value2,...);

示例1:通过INSERT…VALUES语句向数据表tb_admin中插入一条完整的数据。

mysql> SELECT * FROM tb_admin;
Empty set (0.00 sec)

mysql> DESC tb_admin;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int         | NO   | PRI | NULL    |       |
| username   | varchar(40) | YES  |     | NULL    |       |
| password   | varchar(30) | NO   |     | NULL    |       |
| createtime | datetime    | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> INSERT INTO tb_admin VALUES(1,'amo','123456','2023-01-31 03:32:50');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb_admin;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | amo      | 123456   | 2023-01-31 03:32:50 |
+----+----------+----------+---------------------+
1 row in set (0.00 sec)

情况2:为表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。语法如下:

INSERT INTO 表名(column1 [, column2,, columnn]) VALUES (value1 [,value2,, valuen]);
#在 INSERT 子句中随意列出列名,但是一旦列出,VALUES中要插入的value1,	valuen需要与
#column1,columnn列一一对应。如果类型不同,将无法插入,并且MySQL会产生错误

示例2:通过INSERT…VALUES语句向数据表tb_admin中插入数据记录的一部分。

mysql> INSERT INTO tb_admin(id,username,password) VALUES (2, 'Jerry', 'Jerry123456');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb_admin;
+----+----------+-------------+---------------------+
| id | username | password    | createtime          |
+----+----------+-------------+---------------------+
|  1 | amo      | 123456      | 2023-01-31 03:32:50 |
|  2 | Jerry    | Jerry123456 | NULL                |
+----+----------+-------------+---------------------+
2 rows in set (0.00 sec)

情况3:同时插入多条记录。INSERT语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:

INSERT INTO table_name VALUES
(value1 [,value2,, valuen]), (value1 [,value2,, valuen]),
……
(value1 [,value2,, valuen]);
#或者
INSERT INTO table_name(column1 [, column2,, columnn]) VALUES
(value1 [,value2,, valuen]), (value1 [,value2,, valuen]),
……
(value1 [,value2,, valuen]);

示例3:通过INSERT…VALUES语句向数据表tb_admin中一次插入多条记录。

mysql> INSERT INTO tb_admin(id,username,`password`,createtime) VALUES
    -> (3, 'Paul', 'Paul123456', NOW()),
    -> (4, 'Ben', 'Ben123456', NULL),
    -> (5, 'Crystal', 'Crystal123456', NOW()),
    -> (6, 'Jason', 'Jason123456', NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tb_admin;
+----+----------+---------------+---------------------+
| id | username | password      | createtime          |
+----+----------+---------------+---------------------+
|  1 | amo      | 123456        | 2023-01-31 03:32:50 |
|  2 | Jerry    | Jerry123456   | NULL                |
|  3 | Paul     | Paul123456    | 2023-01-31 03:44:37 |
|  4 | Ben      | Ben123456     | NULL                |
|  5 | Crystal  | Crystal123456 | 2023-01-31 03:44:37 |
|  6 | Jason    | Jason123456   | NULL                |
+----+----------+---------------+---------------------+
6 rows in set (0.00 sec)

使用 INSERT 同时插入多条记录时,MySQL 会返回一些在执行单行插入时没有的额外信息,这些信息的含义如下:

Records: 表明插入的记录条数
Duplicates: 表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值
Warnings: 表明有问题的数据值,例如发生数据类型转换

一个同时插入多行记录的 INSERT 语句等同于多个单行插入的 INSERT 语句,但是多行的 INSERT 语句在处理过程中 效率更高 。因为 MySQL 执行单条 INSERT 语句插入多行数据比使用多条 INSERT 语句快,所以在插入多条记录时最好选择使用单条 INSERT 语句的方式插入。VALUES 也可以写成 VALUE ,但是 VALUES 是标准写法。

#注意: 字符和日期型数据应包含在单引号中
mysql> INSERT INTO tb_admin(id,username,`password`,createtime) VALUE
    -> (7, 'Lily', 'Lily123456', NOW());
Query OK, 1 row affected (0.00 sec)

1.2 使用 INSERT…SET 语句插入数据

MySQL 中,除了可以使用 INSERT…VALUES 语句插入数据,还可以使用 INSERT…SET 语句。这种语法格式用于通过直接给表中的某些字段指定对应的值来实现插入指定数据,对于未指定值的字段将采用默认值进行添加。INSERT...SET 语句的语法格式如下:

参数说明如下:

  1. [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]:可选项,其作用与 INSERT…VALUES 语句相同,这里不再赘述。
  2. [INTO] 数据表名:用于指定被操作的数据表,其中,[INTO] 为可选项,可以省略。
  3. SET字段名=值|DEFAULT:用于给数据表中的某些字段设置要插入的值。
  4. ON DUPLICATE KEY UPDATE 子句:可选项,其作用与 INSERT…VALUES 语句相同,这里不再赘述。

示例4:通过INSERT…SET语句向数据表tb_admin中插入一条记录。

mysql> INSERT INTO tb_admin
    -> SET id=8,username='Amo123',`password`='Amo123456',createtime=NOW();
Query OK, 1 row affected (0.00 sec)

1.3 使用 INSERT…SELECT 语句插入查询结果

MySQL 中,支持将查询结果插入指定的数据表中,这可以通过 INSERT...SELECT 语句来实现,其语法格式如下:

参数说明如下。

  1. [LOW_PRIORITY|DELAYED|HIGH_PRIORITY] [IGNORE]:可选项,其作用与 INSERT...VALUES 语句相同,这里不再赘述。
  2. [INTO] 数据表名:用于指定被操作的数据表,其中,[INTO] 为可选项,可以省略。
  3. [(字段名,…)]:可选项,当不指定该选项时,表示要向表中所有列插入数据,否则表示向数据表的指定列插入数据。
  4. SELECT 子句:用于快速地从一个或者多个表中取出数据,并将这些数据作为行数据插入目标数据表中。需要注意的是,SELECT 子句返回的结果集中的字段数、字段类型必须与目标数据表完全一致。
  5. ON DUPLICATE KEY UPDATE 子句:可选项,其作用与 INSERT…VALUES 语句相同,这里不再赘述。

示例5:从数据表tb_admin中查询出id、username和password字段的值,插入数据表tb_admin2中。

mysql> #复制tb_admin表结构并给新表命名为 tb_admin2
mysql> DESC tb_admin2;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int         | NO   | PRI | NULL    |       |
| username   | varchar(40) | YES  |     | NULL    |       |
| password   | varchar(30) | NO   |     | NULL    |       |
| createtime | datetime    | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM tb_admin2;
Empty set (0.00 sec)

mysql> INSERT INTO tb_admin2(id,username,password) SELECT id,username,password FROM tb_admin;
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tb_admin2;
+----+-----------+---------------+------------+
| id | username  | password      | createtime |
+----+-----------+---------------+------------+
|  1 | amo       | 123456        | NULL       |
|  2 | Jerry     | Jerry123456   | NULL       |
|  3 | Paul      | Paul123456    | NULL       |
|  4 | Ben       | Ben123456     | NULL       |
|  5 | Crystal   | Crystal123456 | NULL       |
|  6 | Jason     | Jason123456   | NULL       |
|  7 | Lily      | Lily123456    | NULL       |
|  8 | Amo1234   | Amo123456     | NULL       |
|  9 | Amo123456 | Amo123456     | NULL       |
+----+-----------+---------------+------------+
9 rows in set (0.00 sec)

二、修改(更新)数据

要执行修改的操作可以使用 UPDATE 语句,其语法如下:

参数说明如下:

  1. [LOW_PRIORITY]:可选项,表示在多用户访问数据库的情况下可用于延迟 UPDATE 操作,直到没有别的用户再从表中读取数据为止。这个过程仅适用于表级锁的存储引擎(如 MyISAM、MEMORY 和 MERGE)。
  2. [IGNORE]:在 MySQL 中,通过 UPDATE 语句更新表中多行数据时,如果出现错误,那么整个 UPDATE 语句操作都会被取消,错误发生前更新的所有行将被恢复到它们原来的值。因此,为了在发生错误时也要继续进行更新,可以在 UPDATE 语句中使用 IGNORE 关键字。
  3. SET 子句:必选项,用于指定表中要修改的字段名及其字段值。其中的值可以是表达式,也可以是该字段所对应的默认值。如果要指定默认值,可使用关键字 DEFAULT
  4. WHERE 子句:可选项,用于限定表中要修改的行,如果不指定该子句,那么 UPDATE 语句会更新表中的所有行。
  5. ORDER BY 子句:可选项,用于限定表中的行被修改的次序。
  6. LIMIT 子句:可选项,用于限定被修改的行数。

示例6:将管理员信息表tb_admin2中用户名为amo的管理员密码123456修改为amo123。

注意: 更新时一定要保证 WHERE 子句的正确性,一旦 WHERE 子句出错,将会破坏所有改变的数据,所以在实际开发中最好是先使用 SELECT 查看 WHERE 子句的准确性,在使用 UPDATE

#如果省略WHERE 子句,则表中的所有数据都将被更新
#如果需要回滚数据,需要保证在DML前,进行设置: SET AUTOCOMMIT = FALSE;
mysql> UPDATE tb_admin2 SET password='amo123';
Query OK, 8 rows affected (0.00 sec)
Rows matched: 9  Changed: 8  Warnings: 0

mysql> SELECT * FROM tb_admin2;
+----+-----------+----------+------------+
| id | username  | password | createtime |
+----+-----------+----------+------------+
|  1 | amo       | amo123   | NULL       |
|  2 | Jerry     | amo123   | NULL       |
|  3 | Paul      | amo123   | NULL       |
|  4 | Ben       | amo123   | NULL       |
|  5 | Crystal   | amo123   | NULL       |
|  6 | Jason     | amo123   | NULL       |
|  7 | Lily      | amo123   | NULL       |
|  8 | Amo1234   | amo123   | NULL       |
|  9 | Amo123456 | amo123   | NULL       |
+----+-----------+----------+------------+
9 rows in set (0.00 sec)

如果表中存在外键,更新中的数据可能会出现完整性错误,这个在后续讲解约束知识点的时候再进行演示,这里不再赘述,如下图所示:

三、删除数据

在数据库中,有些数据已经失去意义或者发生错误,此时需要将它们删除。在 MySQL 中,可以使用 DELETE 或者 TRUNCATE TABLE 语句删除表中的一行或多行数据,下面分别进行介绍。

3.1 通过 DELETE 语句删除数据

通过 DELETE 语句删除数据的基本语法格式如下:

参数说明如下:

  1. [LOW_PRIORITY]:可选项,表示在多用户访问数据库的情况下可用于延迟 DELETE 操作,直到没有别的用户再从表中读取数据为止。这个过程仅适用于表级锁的存储引擎 (如MyISAM、MEMORY 和 MERGE)。
  2. [QUICK]:可选项,用于加快部分种类的删除操作速度。
  3. [IGNORE]:在 MySQL 中,通过 DELETE 语句删除表中多行数据时,如果出现错误,那么整个 DELETE 语句操作都会被取消,错误发生前更新的所有行将被恢复到它们原来的值。因此,为了在发生错误时继续进行删除,可以在 DELETE 语句中使用 IGNORE 关键字。
  4. 数据表名:用于指定要删除的数据表的名称。
  5. WHERE 子句:可选项,用于限定表中要删除的行,如果不指定该子句,那么 DELETE 语句会删除表中的所有行。
  6. ORDER BY 子句:可选项,用于限定表中的行被删除的次序。
  7. LIMIT 子句:可选项,用于限定被删除的行数。

示例7:删除管理员数据表tb_admin2中用户名为amo的记录信息。

mysql> DELETE FROM tb_admin2 WHERE username='amo';
Query OK, 1 row affected (0.00 sec)

#如果省略WHERE 子句,则表中的全部数据将被删除
mysql> DELETE FROM tb_admin2;
Query OK, 8 rows affected (0.00 sec)

mysql> SELECT * FROM tb_admin2;
Empty set (0.00 sec)

注意: 在实际的应用中,执行删除的条件一般应该为数据的 id(具有唯一性),而不是具体某个字段值,这样可以避免一些错误发生。删除中的数据完整性错误也会在后续讲解约束知识点时进行演示:

说明: You cannot delete a row that contains a primary key that is used as a foreign key in another table。

3.2 通过 TRUNCATE TABLE 语句删除数据

如果要删除表中所有的行,可通过 TRUNCATE TABLE 语句实现,其基本语法格式如下:

TRUNCATE [TABLE] 数据表名

在上面的语法中,数据表名表示删除的数据表的名称,也可以使用 数据库名.数据表名 来指定该数据表隶属于哪个数据库。

示例8:使用TRUNCATE TABLE语句清空管理员数据表tb_admin。

mysql> TRUNCATE TABLE db_admin.tb_admin;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM tb_admin;
Empty set (0.00 sec)

注意: 由于 TRUNCATE TABLE 语句会删除数据表中的所有数据,并且无法恢复,因此使用 TRUNCATE TABLE 语句时一定要十分小心。无论是使用 DELETE 或者是 TRUNCATE 都表示清空或者删除表中的数据,仍保留表的数据结构。

3.3 DELETE 语句和 TRUNCATE TABLE 语句的区别

说明: TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE FROM 语句相同。都可以实现对表中所有数据的删除,同时保留表结构。
不同点: TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
DELETE FROM:一旦执行此操作,表数据可以全部清除(不带 WHERE)。同时,数据是可以实现回滚的。

(1) 使用 TRUNCATE TABLE 语句后,表中的 AUTO_INCREMENT 计数器将被重新设置为该列的初始值。示例如下所示:

#创建测试表
mysql> CREATE TABLE tb_admin1(
    ->  id INT PRIMARY KEY AUTO_INCREMENT,
    ->  `user` VARCHAR(30) NOT NULL,
    ->  `password` VARCHAR(30) NOT NULL,
    ->  createtime DATETIME);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+--------------------+
| Tables_in_db_admin |
+--------------------+
| tb_admin           |
| tb_admin1          |
| tb_admin2          |
+--------------------+
3 rows in 以上是关于十三表数据的增删改操作的主要内容,如果未能解决你的问题,请参考以下文章

Beego脱坑(十三)ORM基本增删改查

第十三章 Python数据库编程

SQLAlchemy(二):SQLAlchemy对数据的增删改查操作属性常用数据类型详解

关于vue的增删改查操作

数据库:数据操作-数据的增删改

mysql的增删改查