十三、表数据的增、删、改操作

news2024/11/16 1:33:02

文章目录

  • 一、插入数据
    • 1.1 使用 INSERT…VALUES 语句插入数据
    • 1.2 使用 INSERT…SET 语句插入数据
    • 1.3 使用 INSERT...SELECT 语句插入查询结果
  • 二、修改(更新)数据
  • 三、删除数据
    • 3.1 通过 DELETE 语句删除数据
    • 3.2 通过 TRUNCATE TABLE 语句删除数据
    • 3.3 DELETE 语句和 TRUNCATE TABLE 语句的区别
    • 3.4 补充: DCL 中 COMMIT 和 ROLLBACK
    • 3.5 补充: MySQL8新特性:计算列
    • 3.6 小结
  • 四、综合练习

前置知识:

一、数据库开发与实战专栏导学及数据库基础概念入门
二、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 set (0.00 sec)

mysql> drop table tb_admin2;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+--------------------+
| Tables_in_db_admin |
+--------------------+
| tb_admin           |
| tb_admin1          |
+--------------------+
2 rows in set (0.00 sec)

mysql> INSERT INTO tb_admin1(user, password) VALUES('amo', 'amo123');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb_admin1(user, password) VALUES('amo1', 'amo123');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb_admin1;
+----+------+----------+------------+
| id | user | password | createtime |
+----+------+----------+------------+
|  1 | amo  | amo123   | NULL       |
|  2 | amo1 | amo123   | NULL       |
+----+------+----------+------------+
2 rows in set (0.00 sec)

mysql> TRUNCATE TABLE tb_admin1;
Query OK, 0 rows affected (0.01 sec)

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

mysql> INSERT INTO tb_admin1(user, password) VALUES('amo', 'amo123');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb_admin1(user, password) VALUES('amo123', 'amo123');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb_admin1;
+----+--------+----------+------------+
| id | user   | password | createtime |
+----+--------+----------+------------+
|  1 | amo    | amo123   | NULL       |
|  2 | amo123 | amo123   | NULL       |
+----+--------+----------+------------+
2 rows in set (0.00 sec)

mysql> DELETE FROM tb_admin1;
Query OK, 2 rows affected (0.00 sec)

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

mysql> INSERT INTO tb_admin1(user, password) VALUES('amo123', 'amo123');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb_admin1(user, password) VALUES('amo', 'amo123');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb_admin1;
+----+--------+----------+------------+
| id | user   | password | createtime |
+----+--------+----------+------------+
|  3 | amo123 | amo123   | NULL       |
|  4 | amo    | amo123   | NULL       |
+----+--------+----------+------------+
2 rows in set (0.00 sec)

(2) TRUNCATE TABLE 操作比 DELETE 操作使用的系统和事务日志资源少。DELETE 语句每删除一行都会在事务日志中添加一行记录,而 TRUNCATE TABLE 语句是通过释放存储表数据所用的数据页来删除数据的,因此只在事务日志中记录页的释放。

阿里开发规范 【参考】: TRUNCATE TABLEDELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。

(3) 对于参与了索引和视图的表,不能使用 TRUNCATE TABLE 语句来删除数据,而应该使用 DELETE 语句。

3.4 补充: DCL 中 COMMIT 和 ROLLBACK

COMMIT:提交数据。一旦执行 COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
ROLLBACK:回滚数据。一旦执行 ROLLBACK,则可以实现数据的回滚。回滚到最近的一次 COMMIT 之后。对比 TRUNCATE TABLEDELETE FROM,演示 DELETE FROM 如下所示:

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tb_admin1;
+----+--------+----------+------------+
| id | user   | password | createtime |
+----+--------+----------+------------+
|  3 | amo123 | amo123   | NULL       |
|  4 | amo    | amo123   | NULL       |
+----+--------+----------+------------+
2 rows in set (0.00 sec)

mysql> SET autocommit = FALSE;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM tb_admin1;
Query OK, 2 rows affected (0.00 sec)

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

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tb_admin1;
+----+--------+----------+------------+
| id | user   | password | createtime |
+----+--------+----------+------------+
|  3 | amo123 | amo123   | NULL       |
|  4 | amo    | amo123   | NULL       |
+----+--------+----------+------------+
2 rows in set (0.00 sec)

演示 TRUNCATE TABLE 如下所示:

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tb_admin1;
+----+--------+----------+------------+
| id | user   | password | createtime |
+----+--------+----------+------------+
|  3 | amo123 | amo123   | NULL       |
|  4 | amo    | amo123   | NULL       |
+----+--------+----------+------------+
2 rows in set (0.00 sec)

mysql> SET autocommit = FALSE;
Query OK, 0 rows affected (0.00 sec)

mysql> TRUNCATE TABLE tb_admin1;
Query OK, 0 rows affected (0.01 sec)

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

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

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

3.5 补充: MySQL8新特性:计算列

什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。例如,a 列值为1、b 列值为2,c 列不需要手动插入,定义 a+b 的结果为 c 的值,那么 c 就是计算列,是通过别的列计算得来的。在 MySQL 8.0 中,CREATE TABLEALTER TABLE 中都支持增加计算列。下面以 CREATE TABLE 为例进行讲解。举例:定义数据表 tb1,然后定义字段 id、字段 a、字段 b 和字段 c,其中字段 c 为计算列,用于计算 a+b 的值。 示例如下:

mysql> CREATE TABLE tb1(
    -> id INT, a INT, b INT,
    -> c INT GENERATED ALWAYS AS (a + b) VIRTUAL
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO tb1(a, b) VALUES(10, 20);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tb1;
+------+------+------+------+
| id   | a    | b    | c    |
+------+------+------+------+
| NULL |   10 |   20 |   30 |
+------+------+------+------+
1 row in set (0.00 sec)

mysql> #更新数据中的数据,语句如下:
mysql> UPDATE tb1 SET a=40;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM tb1;
+------+------+------+------+
| id   | a    | b    | c    |
+------+------+------+------+
| NULL |   40 |   20 |   60 |
+------+------+------+------+
1 row in set (0.00 sec)

3.6 小结

本文介绍了在 MySQL 中添加、修改和删除表数据的具体方法,也就是对表数据的增、删和改操作。这3种操作在实际开发中经常应用。因此,读者需要认真学习本文的内容,争取做到举一反三、灵活应用。

四、综合练习

练习1:创建数据库test01_library。

mysql> CREATE DATABASE IF NOT EXISTS test01_library CHARACTER SET = 'utf8mb4';
Query OK, 1 row affected (0.00 sec)

mysql> USE test01_library;
Database changed

练习2:创建表 books,表结构如下:

字段名字段说明数据类型
id书编号INT
name书名VARCHAR(50)
authors作者VARCHAR(100)
price价格FLOAT
pubdate出版日期YEAR
note说明VARCHAR(100)
num库存INT

SQL 语句如下:

mysql>  CREATE TABLE IF NOT EXISTS books(
    ->  id INT COMMENT '图书编号',
    ->  `name` VARCHAR(50) COMMENT '书名',
    ->  `authors` VARCHAR(100) COMMENT '作者',
    ->  price FLOAT COMMENT '价格',
    ->  pubdate YEAR COMMENT '出版日期',
    ->  note VARCHAR(100) COMMENT '说明',
    ->  num INT COMMENT '库存');
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW  TABLES;
+--------------------------+
| Tables_in_test01_library |
+--------------------------+
| books                    |
+--------------------------+
1 row in set (0.00 sec)

mysql> DESC books;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int          | YES  |     | NULL    |       |
| name    | varchar(50)  | YES  |     | NULL    |       |
| authors | varchar(100) | YES  |     | NULL    |       |
| price   | float        | YES  |     | NULL    |       |
| pubdate | year         | YES  |     | NULL    |       |
| note    | varchar(100) | YES  |     | NULL    |       |
| num     | int          | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

练习3:向books表中插入记录。

idnameauthorspricepubdatenotenum
1Tal of AAADickes231995novel11
2EmmaTJane lura351993joke22
3Story of JaneJane Tim402001novel0
4Lovey DayGeorge Byron202005novel30
5Old landHonore Blade302010law0
6The BattleUpton Sara301999medicine40
7Rose HoodRichard haggard282008cartoon28

SQL 语句如下:

#1.不指定字段名称,插入第一条记录
mysql> INSERT INTO books
    -> VALUES(1,'Tal of AAA','Dickes',23,'1995','novel',11);
Query OK, 1 row affected (0.00 sec)
#2.指定所有字段名称,插入第二记录
mysql> INSERT INTO books(id,NAME,AUTHORS,price,pubdate,note,num)
    -> VALUES(2,'EmmaT','Jane lura',35,'1993','joke',22);
Query OK, 1 row affected (0.00 sec)
#3.同时插入多条记录(剩下的所有记录)
mysql> INSERT INTO books(id,NAME,AUTHORS,price,pubdate,note,num)
    -> VALUES
    -> (3,'Story of Jane','Jane Tim',40,2001,'novel',0),
    -> (4,'Lovey Day','George Byron',20,2005,'novel',30),
    -> (5,'Old land','Honore Blade',30,2010,'Law',0),
    -> (6,'The Battle','Upton Sara',30,1999,'medicine',40),
    -> (7,'Rose Hood','Richard haggard',28,2008,'cartoon',28);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

练习4:将小说类型(novel)的书的价格都增加5。

mysql> UPDATE books SET price=price+5 WHERE note='novel';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

练习5:将名称为EmmaT的书的价格改为40,并将说明改为drama。

mysql> UPDATE books SET price=40,note='drama' WHERE name='EmmaT';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

练习6:删除库存为0的记录。

mysql> DELETE FROM books WHERE num=0;
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM books;
+------+------------+-----------------+-------+---------+----------+------+
| id   | name       | authors         | price | pubdate | note     | num  |
+------+------------+-----------------+-------+---------+----------+------+
|    1 | Tal of AAA | Dickes          |    28 |    1995 | novel    |   11 |
|    2 | EmmaT      | Jane lura       |    40 |    1993 | drama    |   22 |
|    4 | Lovey Day  | George Byron    |    25 |    2005 | novel    |   30 |
|    6 | The Battle | Upton Sara      |    30 |    1999 | medicine |   40 |
|    7 | Rose Hood  | Richard haggard |    28 |    2008 | cartoon  |   28 |
+------+------------+-----------------+-------+---------+----------+------+
5 rows in set (0.00 sec)

练习7:统计书名中包含a字母的书。

mysql> SELECT name FROM books WHERE name LIKE '%a%';
+------------+
| name       |
+------------+
| Tal of AAA |
| EmmaT      |
| Lovey Day  |
| The Battle |
+------------+
4 rows in set (0.00 sec)

练习8:统计书名中包含a字母的书的数量和库存总量。

mysql> SELECT COUNT(name), SUM(num) FROM books WHERE name LIKE '%a%';
+-------------+----------+
| COUNT(name) | SUM(num) |
+-------------+----------+
|           4 |      103 |
+-------------+----------+
1 row in set (0.00 sec)

练习9:统计书名中包含a字母的书的数量和库存总量。

mysql> SELECT COUNT(name), SUM(num) FROM books WHERE name LIKE '%a%';
+-------------+----------+
| COUNT(name) | SUM(num) |
+-------------+----------+
|           4 |      103 |
+-------------+----------+
1 row in set (0.00 sec)

练习10:找出“novel”类型的书,按照价格降序排列。

mysql> SELECT * FROM books WHERE note='novel' ORDER BY price DESC;
+------+------------+--------------+-------+---------+-------+------+
| id   | name       | authors      | price | pubdate | note  | num  |
+------+------------+--------------+-------+---------+-------+------+
|    1 | Tal of AAA | Dickes       |    28 |    1995 | novel |   11 |
|    4 | Lovey Day  | George Byron |    25 |    2005 | novel |   30 |
+------+------------+--------------+-------+---------+-------+------+
2 rows in set (0.00 sec)

练习11:查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列。

mysql> SELECT * FROM books ORDER BY num DESC, name ASC;
+------+------------+-----------------+-------+---------+----------+------+
| id   | name       | authors         | price | pubdate | note     | num  |
+------+------------+-----------------+-------+---------+----------+------+
|    6 | The Battle | Upton Sara      |    30 |    1999 | medicine |   40 |
|    4 | Lovey Day  | George Byron    |    25 |    2005 | novel    |   30 |
|    7 | Rose Hood  | Richard haggard |    28 |    2008 | cartoon  |   28 |
|    2 | EmmaT      | Jane lura       |    40 |    1993 | drama    |   22 |
|    1 | Tal of AAA | Dickes          |    28 |    1995 | novel    |   11 |
+------+------------+-----------------+-------+---------+----------+------+
5 rows in set (0.00 sec)

练习12:按照note分类统计书的数量。

mysql> SELECT note,COUNT(*) FROM books GROUP BY note;
+----------+----------+
| note     | COUNT(*) |
+----------+----------+
| novel    |        2 |
| drama    |        1 |
| medicine |        1 |
| cartoon  |        1 |
+----------+----------+
4 rows in set (0.00 sec)

练习13:按照note分类统计书的库存量,显示库存量超过30本的。

mysql> SELECT note,SUM(num) FROM books GROUP BY note HAVING SUM(num)>30;
+----------+----------+
| note     | SUM(num) |
+----------+----------+
| novel    |       41 |
| medicine |       40 |
+----------+----------+
2 rows in set (0.00 sec)

练习14:查询所有图书,每页显示5本,显示第二页。

mysql> SELECT *
    -> FROM books
    -> LIMIT 5,5;
Empty set (0.00 sec)

练习15:按照note分类统计书的库存量,显示库存量最多的。

mysql> SELECT note,SUM(num) "sum_num" FROM books GROUP BY note ORDER BY sum_num DESC LIMIT 1;
+-------+---------+
| note  | sum_num |
+-------+---------+
| novel |      41 |
+-------+---------+
1 row in set (0.00 sec)

练习16:查询书名达到9个字符的书,不包括里面的空格。

mysql> SELECT * FROM books WHERE CHAR_LENGTH(REPLACE(name, ' ', ''))>=9;
+------+------------+------------+-------+---------+----------+------+
| id   | name       | authors    | price | pubdate | note     | num  |
+------+------------+------------+-------+---------+----------+------+
|    6 | The Battle | Upton Sara |    30 |    1999 | medicine |   40 |
+------+------------+------------+-------+---------+----------+------+
1 row in set (0.00 sec)

练习17:查询书名和类型,其中note值为novel显示小说,law显示法律,medicine显示医药,cartoon显示卡通,joke显示笑话。

mysql> SELECT name "书名",note, CASE note WHEN 'novel' THEN '小说'
    -> WHEN 'law' THEN '法律'
    -> WHEN 'medicine' THEN '医药'
    -> WHEN 'cartoon' THEN '卡通'
    -> WHEN 'joke' THEN '笑话'
    -> ELSE '其他'
    -> END "类型" FROM books;
+------------+----------+------+
| 书名       | note     | 类型 |
+------------+----------+------+
| Tal of AAA | novel    | 小说 |
| EmmaT      | drama    | 其他 |
| Lovey Day  | novel    | 小说 |
| The Battle | medicine | 医药 |
| Rose Hood  | cartoon  | 卡通 |
+------------+----------+------+
5 rows in set (0.00 sec)

练习18:查询书名、库存,其中num值超过30本的,显示滞销,大于0并低于10的,显示畅销,为0的显示需要无货。

mysql> SELECT name "书名", num "库存", CASE WHEN num > 30 THEN '滞销'
    -> WHEN num > 0 AND num < 10 THEN '畅销'
    -> WHEN num = 0 THEN '无货'
    -> ELSE '正常'
    -> END "显示状态" FROM books;
+------------+------+----------+
| 书名       | 库存 | 显示状态 |
+------------+------+----------+
| Tal of AAA |   11 | 正常     |
| EmmaT      |   22 | 正常     |
| Lovey Day  |   30 | 正常     |
| The Battle |   40 | 滞销     |
| Rose Hood  |   28 | 正常     |
+------------+------+----------+
5 rows in set (0.00 sec)

练习19:统计每一种note的库存量,并合计总量。

mysql> SELECT IFNULL(note,'合计库存总量') AS note,SUM(num)
    -> FROM books
    -> GROUP BY note WITH ROLLUP;
+--------------+----------+
| note         | SUM(num) |
+--------------+----------+
| cartoon      |       28 |
| drama        |       22 |
| medicine     |       40 |
| novel        |       41 |
| 合计库存总量 |      131 |
+--------------+----------+
5 rows in set, 1 warning (0.00 sec)

练习20:统计每一种note的数量,并合计总量。

mysql> SELECT IFNULL(note,'合计总量') AS note,COUNT(*)
    -> FROM books
    -> GROUP BY note WITH ROLLUP;
+----------+----------+
| note     | COUNT(*) |
+----------+----------+
| cartoon  |        1 |
| drama    |        1 |
| medicine |        1 |
| novel    |        2 |
| 合计总量 |        5 |
+----------+----------+
5 rows in set, 1 warning (0.00 sec)

练习21:统计库存量前三名的图书。

mysql> SELECT * FROM books ORDER BY num DESC LIMIT 3;
+------+------------+-----------------+-------+---------+----------+------+
| id   | name       | authors         | price | pubdate | note     | num  |
+------+------------+-----------------+-------+---------+----------+------+
|    6 | The Battle | Upton Sara      |    30 |    1999 | medicine |   40 |
|    4 | Lovey Day  | George Byron    |    25 |    2005 | novel    |   30 |
|    7 | Rose Hood  | Richard haggard |    28 |    2008 | cartoon  |   28 |
+------+------------+-----------------+-------+---------+----------+------+
3 rows in set (0.00 sec)

练习22:找出最早出版的一本书。

mysql> SELECT *
    -> FROM books
    -> ORDER BY pubdate ASC
    -> LIMIT 0,1;
+------+-------+-----------+-------+---------+-------+------+
| id   | name  | authors   | price | pubdate | note  | num  |
+------+-------+-----------+-------+---------+-------+------+
|    2 | EmmaT | Jane lura |    40 |    1993 | drama |   22 |
+------+-------+-----------+-------+---------+-------+------+
1 row in set (0.00 sec)

练习23:找出novel中价格最高的一本书。

mysql> SELECT *
    -> FROM books
    -> WHERE note = 'novel'
    -> ORDER BY price DESC
    -> LIMIT 0,1;
+------+------------+---------+-------+---------+-------+------+
| id   | name       | authors | price | pubdate | note  | num  |
+------+------------+---------+-------+---------+-------+------+
|    1 | Tal of AAA | Dickes  |    28 |    1995 | novel |   11 |
+------+------------+---------+-------+---------+-------+------+
1 row in set (0.00 sec)

练习24:找出书名中字数最多的一本书,不含空格。

mysql> SELECT *
    -> FROM books
    -> ORDER BY CHAR_LENGTH(REPLACE(NAME,' ','')) DESC
    -> LIMIT 0,1;
+------+------------+------------+-------+---------+----------+------+
| id   | name       | authors    | price | pubdate | note     | num  |
+------+------------+------------+-------+---------+----------+------+
|    6 | The Battle | Upton Sara |    30 |    1999 | medicine |   40 |
+------+------------+------------+-------+---------+----------+------+
1 row in set (0.00 sec)

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习数据库的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫实例(二)—— 爬取高清4K图片

大家好&#xff0c;我是 Enovo飞鱼&#xff0c;今天继续分享一个爬虫案例&#xff0c;爬取高清4K图片&#xff0c;加油&#x1f4aa;。 目录 前言 增加异常处理 增加代码灵活性 基本环境配置 爬取目标网站 分析网站页面 具体代码实现 图片下载示例 感谢支持&#x1f6…

ABB机器人设置有效载荷的2种方法具体步骤(直接输入法+自动识别推算法1)

ABB机器人设置有效载荷的2种方法具体步骤(直接输入法+自动识别推算法1) 为什么要设置有效载荷Loaddata? 对于搬运应用的机器人只有设定正确的工具和载荷数据,机器人才能正确的工作; 对于搬运比较重的产品,或工具的重量也比较重,需要设置工具及搬运对象的重心和重量; 对…

如何用ChatGPT高效完成工作

如何用ChatGPT高效完成工作 过完年刚开工&#xff0c;很多人还没有从假期综合症中走出来&#xff0c;不想上班&#xff0c;总想摸鱼&#xff0c;可是手上的工作还是要完成的。都2023年了&#xff0c;是时候让ChatGPT来帮我们完成工作了&#xff01;本文将教你如何用ChatGPT高效…

Unity-Tcp-网络聊天功能(二): 登录与注册

5.客户端实现注册与登录接口创建好UI接下来定义发给客户端的协议等public class MessageHelper {//发送登录的消息给服务器 1002public void SendLoginMsg(string account, string pwd){LoginMsgC2S msg new LoginMsgC2S();msg.account account;msg.password pwd;var str J…

java程序cpu飙高定位

1 定位过程 CPU飙升问题定位的一般步骤是&#xff1a; 首先通过top指令查看当前占用CPU较高的进程PID查看当前进程消耗资源的线程PID&#xff1a;top -Hp PID通过print命令将线程PID转为16进制&#xff0c;根据该16进制值去打印的堆栈日志内查询&#xff0c;查看该线程所驻留…

Plecs电力电子仿真专业教程-第一季

Plecs电力电子仿真专业教程-第一季 第一章 Plecs是什么&#xff1f; 第一节 Plecs简介 Plecs是瑞士Plexim GmbH公司开发的系统级电力电子仿真软件PLECS。PLECS是一个用于电路和控制结合的多功能仿真软件&#xff0c;尤其适用于电力电子和传动系统。不管您是工业领域中的开发…

Lua 面向对象(详解)

Lua 面向对象&#xff08;详解&#xff09; 参考文章&#xff1a; https://blog.csdn.net/linxinfa/article/details/103254828 https://zhuanlan.zhihu.com/p/115159195 https://blog.codingnow.com/cloud/LuaOO https://blog.codingnow.com/2006/06/oo_lua.html Lua的面向对象…

Homekit智能家居DIY-智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…

不再一个个试错,这众多的flex属性

流式布局 本篇我们将从流式布局的四大方面入手&#xff0c;旨在认识、了解、以至于掌握其特性及功能。 为什么要用&#xff1f; 在我们抛弃标准流、定位流以及浮动流之后&#xff0c;取而代之的是flex流式布局。以一种更加优雅的方式实现元素布局。 轴的定义 在开始说它的特…

C语言#if、##ifdef、#ifndef的用法详解

假如现在要开发一个C语言程序&#xff0c;让它输出红色的文字&#xff0c;并且要求跨平台&#xff0c;在 Windows 和 Linux 下都能运行&#xff0c;怎么办呢&#xff1f;这个程序的难点在于&#xff0c;不同平台下控制文字颜色的代码不一样&#xff0c;我们必须要能够识别出不同…

2023最新版easyrecovery数据恢复软件免费版测评

大家好&#xff0c;关于easyrecovery数据恢复软件免费版很多朋友都还不太明白&#xff0c;今天小编就来为大家分享关于easyrecovery数据恢复软件免费版下载使用的知识&#xff0c;希望对各位有所帮助&#xff01; EasyRecovery其实是目前为止我用的最喜欢的一款数据恢复软件&a…

C++string的模拟实现(上篇)

目录 一.命名空间的封装与交换函数模板 1.命名空间的封装与类的定义 2.交换函数模板 二.string类的四个重要默认成员函数 1.构造函数的类外定义&#xff1a; 2.析构函数在类外的定义 3.拷贝构造函数在类外的定义 4.赋值运算符重载在类外的定义 5.关于两个string对象…

在线 OJ 项目(一) · 项目介绍 · 进程与线程 · 实现编译运行模块

一、项目介绍二、导入依赖、创建基本项目结构导入依赖创建基本项目结构三、进程、线程的基础知识回顾四、封装操作进程的工具类五、实现 “编译运行” 模块 Task 类六、封装读写文件的方法修改 JDK 版本七、Task 类的实现八、整理一下项目列表一、项目介绍 项目实现一个在线 O…

煤矿AI智能视频分析识别系统 opencv

煤矿AI智能视频分析识别系统通过opencvpython 深度学习网络模型&#xff0c;对皮带跑偏、撕裂、堆煤、异物、非法运人、有煤无煤状态等异常情况&#xff0c;以及人员工服穿戴、反光衣、安全帽、睡岗离岗、打电话、抽烟等行为进行自动抓拍存档。OpenCV基于C实现&#xff0c;同时…

【正点原子FPGA连载】第二十八章Linux并发与竞争 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十八章Linux…

【splishsplash】Houdini粒子的导入与导出

Houdini粒子的导入与导出 Houdini导入到splish 在Houdini中使用file导入任意几何模型 使用points from volume采样点&#xff0c;使其粒子化 使用file导出粒子化之后的模型&#xff0c;后缀写bhclassic 创建json场景文件&#xff08;建议放到MyScences文件夹&#xff09; …

C语言指针是什么?

计算机中所有的数据都必须放在内存中&#xff0c;不同类型的数据占用的字节数不一样&#xff0c;例如 int 占用 4 个字节&#xff0c;char 占用 1 个字节。为了正确地访问这些数据&#xff0c;必须为每个字节都编上号码&#xff0c;就像门牌号、身份证号一样&#xff0c;每个字…

HTTP协议 | 青训营笔记

1、概述 HTTP协议&#xff0c;超文本传输协议 应用层的协议&#xff0c;基于TCP协议&#xff0c;简单可扩展&#xff08;可以自定义header&#xff09; 每个HTTP请求都可以分为请求和响应两个部分 无状态的&#xff08;不知道之前的请求是携带过什么信息&#xff09; 2、协…

【Qt】8.QPainter、高级设置、手动调用绘图事件、绘图设备、文件操作、文件信息

目录 QPainter 代码 widget.h widget.cpp 结果 高级设置 代码 widget.h widget.cpp 结果 手动调用绘图事件 代码 widget.h widget.cpp 结果 绘图设备 代码 widget.h widget.cpp 结果 文件操作 代码 widget.cpp 结果 文件信息 代码 widget.cpp 结果…

一文带你看懂健康管理系统----IPMI

目录 1. IPMI概述 2. IPMI系统设计 3. 主BMC模块设计 5. 从IPMI模块设计 6. 名词解释 6. 代码 1. IPMI概述 智能平台管理接口&#xff08;IPMI&#xff1a;Intelligent Platform Management Interface&#xff09;是一项应用于服务器管理系统设计的标准&#xff0c;由Int…