MySQL数据库,从入门到精通:第十一篇——MySQL数据处理之增删改指南

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL数据库,从入门到精通:第十一篇——MySQL数据处理之增删改指南

前言

在MySQL数据库中,对数据进行增删改操作是相当常见的需求,也是数据库管理的基本技能之一。本文将深入讲解MySQL中的增删改相关知识,包括插入数据的方式、更新和删除数据的操作方法,同时还会介绍MySQL8的新特性——计算列,并结合综合案例进行实战演练,为读者提供完整的数据处理解决方案。

摘要

本文将主要分为五个部分。首先介绍插入数据的方式,讲解两种常见的插入数据的方式,包括VALUES方式和将查询结果插入到表中。接着,深入探讨更新数据的操作方法,包括使用UPDATE语句以及UPDATE与JOIN的联合操作。

在删除数据方面,本文讲解了使用DELETE语句以及DELETE与JOIN的连表删除操作。同时,本文还会介绍MySQL8的新特性——计算列,并通过实际案例进行演示。

最后,本文将结合综合案例,实战演练MySQL中的数据处理技巧,包括插入、更新、删除和计算列等方面,帮助读者更好地掌握MySQL数据库管理和查询的基本技能,提高数据处理和查询效率。


第 11 篇_数据处理之增删改

官网: http://www.atguigu.com

1. 插入数据

1. 1 实际问题

加粗样式 解决方式:使用 INSERT 语句向表中插入数据。

1. 2 方式 1 :VALUES的方式添加

使用这种语法一次只能向表中插入 一条 数据。

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

INSERT INTO 表名
VALUES (value1,value2,....);

值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。

举例:

INSERT INTO 表名

INSERT INTO departments
VALUES ( 70 , 'Pub', 100 , 1700 );
INSERT INTO departments
VALUES ( 100 , 'Finance', NULL, NULL);

情况 2 :为表的指定字段插入数据

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

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

举例:

INSERT INTO departments(department_id, department_name)
VALUES (80, 'IT');

情况 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]);

举例:

使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息的含 义如下: ● Records:表明插入的记录条数。 ● Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。 ● Warnings:表明有问题的数据值,例如发生数据类型转换。

一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句在处理过程中效率更高。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句

快,所以在插入多条记录时最好选择使用单条INSERT语句的方式插入。

小结:

  • VALUES也可以写成VALUE,但是VALUES是标准写法。
  • 字符和日期型数据应包含在单引号中。

1. 3 方式 2 :将查询结果插入到表中

INSERT还可以将SELECT语句查询的结果插入到表中,此时不需要把每一条记录的值一个一个输入,只需 要使用一条INSERT语句和一条SELECT语句组成的组合语句即可快速地从一个或多个表中向一个表中插入多行。

基本语法格式如下:

INSERT INTO 目标表名
(tar_column1 [, tar_column2, …, tar_columnn])
SELECT
(src_column1 [, src_column2, …, src_columnn])
FROM 源表名
[WHERE condition]
  • 在 INSERT 语句中加入子查询。
  • 不必书写 VALUES 子句。
  • 子查询中的值列表应与 INSERT 子句中的列名对应。

举例:

INSERT INTO emp2
SELECT *
FROM employees
WHERE department_id = 90;
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';

2. 更新数据

使用 UPDATE 语句更新数据。语法如下:

UPDATE table_name
SET column1=value1, column2=value2, … , column=valuen
[WHERE condition]
  • 可以一次更新 多条 数据。
  • 如果需要回滚数据,需要保证在DML前,进行设置: SET AUTOCOMMIT = FALSE;
  • 使用 WHERE 子句指定需要更新的数据。
UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
  • 如果省略 WHERE 子句,则表中的所有数据都将被更新。
UPDATE copy_emp
SET department_id = 110;
  • 更新中的数据完整性错误
UPDATE employees
SET department_id = 55
WHERE department_id = 110;

说明:不存在 55 号部门

3. 删除数据

使用 DELETE 语句从表中删除数据

DELETE FROM table_name [WHERE <condition>];

table_name指定要执行删除操作的表;“[WHERE ]”为可选参数,指定删除条件,如果没有WHERE子句, DELETE语句将删除表中的所有记录。

使用 WHERE 子句删除指定的记录。

DELETE FROM departments
WHERE department_name = 'Finance';

如果省略 WHERE 子句,则表中的全部数据将被删除

DELETE FROM copy_emp;

删除中的数据完整性错误

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.

4. MySQL 8 新特性:计算列

什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。例如,a列值为 1 、b列值为 2 ,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。

在MySQL 8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。下面以CREATE TABLE为例进行讲解。

举例:定义数据表tb1,然后定义字段id、字段a、字段b和字段c,其中字段c为计算列,用于计算a+b的 值。 首先创建测试表tb1,语句如下:

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);

查询数据表tb1中的数据,结果如下:

mysql> SELECT * FROM tb1;
+------+------+------+------+
| id | a | b | c |
+------+------+------+------+
| NULL | 100 | 200 | 300 |
+------+------+------+------+
1 row in set (0.00 sec)

更新数据中的数据,语句如下:

mysql> UPDATE tb1 SET a = 500;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0

5. 综合案例

1、创建数据库test01_library

2、创建表 books,表结构如下:

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

3、向books表中插入记录

1)不指定字段名称,插入第一条记录

2)指定所有字段名称,插入第二记录

3)同时插入多条记录(剩下的所有记录)

id name authors price pubdate note num
1 Tal of AAA Dickes 23 1995 novel 11
2 EmmaT Jane lura 35 1993 joke 22
3 Story of Jane Jane Tim 40 2001 novel
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

练习demo

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

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

6、删除库存为0的记录。

7、统计书名中包含a字母的书

8、统计书名中包含a字母的书的数量和库存总量

9、找出“novel”类型的书,按照价格降序排列

10、查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列

11、按照note分类统计书的数量

12、按照note分类统计书的库存量,显示库存量超过30本的

13、查询所有图书,每页显示5本,显示第二页

14、按照note分类统计书的库存量,显示库存量最多的

15、查询书名达到10个字符的书,不包括里面的空格

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

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

18、统计每一种note的库存量,并合计总量

19、统计每一种note的数量,并合计总量

20、统计库存量前三名的图书

21、找出最早出版的一本书

22、找出novel中价格最高的一本书

23、找出书名中字数最多的一本书,不含空格

答案:

1、创建数据库test01_library

CREATE DATABASE IF NOT EXISTS test01_library CHARACTER SET 'utf8';
#指定使用哪个数据库
USE test01_library;

2、创建表 books

CREATE TABLE books(
id INT,
name VARCHAR(50),
`authors` VARCHAR(100) ,
price FLOAT,
pubdate YEAR ,
note VARCHAR(100),
num INT
);

3、向books表中插入记录

1)不指定字段名称,插入第一条记录

INSERT INTO books
VALUES(1,'Tal of AAA','Dickes',23,1995,'novel',11);

2)指定所有字段名称,插入第二记录

INSERT INTO books (id,name,`authors`,price,pubdate,note,num)
VALUES(2,'EmmaT','Jane lura',35,1993,'Joke',22);

3)同时插入多条记录(剩下的所有记录)

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);

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

UPDATE books SET price=price+5 WHERE note = 'novel';

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

UPDATE books SET price=40,note='drama' WHERE name='EmmaT';

6、删除库存为0的记录。

DELETE FROM books WHERE num=0;

7、统计书名中包含a字母的书

SELECT * FROM books WHERE name LIKE '%a%';

8、统计书名中包含a字母的书的数量和库存总量

SELECT COUNT(*),SUM(num) FROM books WHERE name LIKE '%a%';

9、找出“novel”类型的书,按照价格降序排列

SELECT * FROM books WHERE note = 'novel' ORDER BY price DESC;

10、查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列

SELECT * FROM books ORDER BY num DESC,note ASC;

11、按照note分类统计书的数量

SELECT note,COUNT(*) FROM books GROUP BY note;

12、按照note分类统计书的库存量,显示库存量超过30本的

SELECT note,SUM(num) FROM books GROUP BY note HAVING SUM(num)>30;

13、查询所有图书,每页显示5本,显示第二页

SELECT * FROM books LIMIT 5,5;

14、按照note分类统计书的库存量,显示库存量最多的

SELECT note,SUM(num) sum_num FROM books GROUP BY note ORDER BY sum_num DESC LIMIT 0,1;

15、查询书名达到10个字符的书,不包括里面的空格

SELECT * FROM books WHERE CHAR_LENGTH(REPLACE(name,' ',''))>=10;

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

SELECT name AS "书名" ,note, CASE note
WHEN 'novel' THEN '小说'
WHEN 'law' THEN '法律'
WHEN 'medicine' THEN '医药'
WHEN 'cartoon' THEN '卡通'
WHEN 'joke' THEN '笑话'
END AS "类型"
FROM books;

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

SELECT name,num,CASE
WHEN num>30 THEN '滞销'
WHEN num>0 AND num<10 THEN '畅销'
WHEN num=0 THEN '无货'
ELSE '正常'
END AS "库存状态"
FROM books;

18、统计每一种note的库存量,并合计总量

SELECT IFNULL(note,'合计总库存量') AS note,SUM(num) FROM books GROUP BY note WITH
ROLLUP;

19、统计每一种note的数量,并合计总量

SELECT IFNULL(note,'合计总数') AS note,COUNT(*) FROM books GROUP BY note WITH ROLLUP;

20、统计库存量前三名的图书

SELECT * FROM books ORDER BY num DESC LIMIT 0,3;

21、找出最早出版的一本书

SELECT * FROM books ORDER BY pubdate ASC LIMIT 0,1;

22、找出novel中价格最高的一本书

SELECT * FROM books WHERE note = 'novel' ORDER BY price DESC LIMIT 0,1;

23、找出书名中字数最多的一本书,不含空格

SELECT * FROM books ORDER BY CHAR_LENGTH(REPLACE(name,' ','')) DESC LIMIT 0,1;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
38 3
SpringBoot入门 - 添加内存数据库H2
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
51 4
SpringBoot入门(4) - 添加内存数据库H2
|
12天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
83 15
|
6天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
13天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
17天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
25天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
66 13
|
1月前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
39 1
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
47 4

推荐镜像

更多
下一篇
DataWorks