内外连接&分组查询&子查询
文章目录- @[toc]
- 一、内连接
- 二、外连接
- 1.左连接
- 2 .右连接
- 三、分组查询
- 1.GROUP BY单独使用
- 2.GROUP BY 与 GROUP_CONCAt()
- 3.GROUP BY 与聚合函数
- 4.GROUP BY 与 WITH ROLLUP
- 四、子查询
- 五、数据库的备份与恢复
- 1.备份方案
- 2.备份工具mysqldump的使用
- 3.数据恢复
- 4.免密登录与免密备份
内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。
内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。
内连接的语法格式如下:
SELECt <字段名> FROM <表1> INNER JOIN <表2> [ON子句];
语法说明如下。
- 字段名:需要查询的字段名称。
- <表1><表2>:需要内连接的表名。
- INNER JOIN :内连接中可以省略 INNER 关键字,只用关键字 JOIN。
- ON 子句:用来设置内连接的连接条件。
INNER JOIN 也可以使用 WHERe 子句指定连接条件,但是 INNER JOIN … ON 语法是官方的标准写法,而且 WHERe 子句在某些时候会影响查询的性能。
多个表内连接时,在 FROM 后连续使用 INNER JOIN 或 JOIN 即可。
后续案例的两张表中所需的数据:
mysql> select * from tb_students_info; +----+--------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+--------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | | 2 | Green | 23 | 男 | 158 | 2 | | 3 | Henry | 23 | 女 | 185 | 1 | | 4 | Jane | 22 | 男 | 162 | 3 | | 5 | Jin | 21 | 女 | 172 | 4 | | 6 | John | 21 | 女 | 172 | 4 | | 7 | Lily | 22 | 男 | 165 | 4 | | 8 | Susan | 23 | 男 | 170 | 5 | | 9 | Thomas | 22 | 女 | 178 | 5 | | 10 | Tom | 23 | 女 | 165 | 5 | | 11 | Liming | 22 | 男 | 176 | 7 | +----+--------+------+------+--------+-----------+ mysql> select * from tb_course; +----+-------------+ | id | course_name | +----+-------------+ | 1 | Java | | 2 | MySQL | | 3 | Python | | 4 | Go | | 5 | C++ | | 6 | HTML | +----+-------------+ 6 rows in set (0.00 sec)
案例1:在 tb_students_info 表和 tb_course 表之间,使用内连接查询学生姓名和相对应的课程名称
mysql> select s.name,c.course_name from tb_students_info as s join tb_course as c on s.course_id = c.id; +--------+-------------+ | name | course_name | +--------+-------------+ | Dany | Java | | Green | MySQL | | Henry | Java | | Jane | Python | | Jin | Go | | John | Go | | Lily | Go | | Susan | C++ | | Thomas | C++ | | Tom | C++ | +--------+-------------+ 10 rows in set (0.00 sec)
案例2:在 tb_students_info 表和 tb_course 表之间,使用内连接查询学习Mysql和Java课程的人
mysql> select s.name,c.course_name from tb_students_info as s join tb_course as c on s.course_id = c.id and (c.course_name = 'Java' or c.course_name = 'Mysql'); +-------+-------------+ | name | course_name | +-------+-------------+ | Dany | Java | | Green | MySQL | | Henry | Java | +-------+-------------+ 3 rows in set (0.00 sec)
案例3:在 tb_students_info 表和 tb_course 表之间,使用内连接查询查询学习Java的人数
mysql> select count(s.name) as '人数',c.course_name as '课程' from tb_students_info as s join tb_course as c on s.course_id = c.id and c.course_name = 'Java'; +--------+--------+ | 人数 | 课程 | +--------+--------+ | 2 | Java | +--------+--------+ 1 row in set (0.00 sec)
二、外连接
内连接的查询结果都是符合连接条件的记录,而外连接会先将连接的表分为主表和辅表,再以主表为依据返回满足和不满足条件的记录。
外连接可以分为左外连接和右外连接2种,下面根据实例分别介绍左外连接和右外连接。
1.左连接左外连接又称为左连接,使用 LEFT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。
左连接的语法格式如下:
SELECt <字段名> FROM <表1> LEFT OUTER JOIN <表2>;
语法说明如下:
- 字段名:需要查询的字段名称。
- <表1><表2>:需要左连接的表名。
- LEFT OUTER JOIN:左连接中可以省略 OUTER 关键字,只使用关键字 LEFT JOIN。
- ON 子句:用来设置左连接的连接条件,不能省略。
上述语法中,"表1"为主表,"表2"为辅表。左连接查询时,可以查询出"表1"中的所有记录和"表2"中匹配连接条件的记录。如果"表1"的某行在"表2"中没有匹配行,那么在返回结果中,"表2"的字段值均为空值(NULL)。
案例1:在 tb_students_info 表和 tb_course 表中查询所有学生姓名和相对应的课程名称,包括没有课程的学生
mysql> select s.name,c.course_name from tb_students_info as s left join tb_course as c on s.course_id = c.id; +--------+-------------+ | name | course_name | +--------+-------------+ | Dany | Java | | Green | MySQL | | Henry | Java | | Jane | Python | | Jin | Go | | John | Go | | Lily | Go | | Susan | C++ | | Thomas | C++ | | Tom | C++ | | Liming | NULL | +--------+-------------+ 11 rows in set (0.00 sec)2 .右连接
右外连接又称为右连接,右连接是左连接的反向连接。使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。
右连接的语法格式如下:
SELECt <字段名> FROM <表1> RIGHT OUTER JOIN <表2>;
语法说明如下:
- 字段名:需要查询的字段名称。
- <表1><表2>:需要右连接的表名。
- RIGHT OUTER JOIN:右连接中可以省略 OUTER 关键字,只使用关键字 RIGHT JOIN。
- ON 子句:用来设置右连接的连接条件,不能省略。
与左连接相反,右连接以"表2"为基表,"表1"为参考表。右连接查询时,可以查询出"表2"中的所有记录和"表1"中匹配连接条件的记录。如果"表2"的某行在"表1"中没有匹配行,那么在返回结果中,"表1"的字段值均为空值(NULL)。
案例2:在 tb_students_info 表和 tb_course 表中查询所有课程,包括没有学生的课程
mysql> select c.course_name,s.name from tb_students_info as s right join tb_course as c on s.course_id = c.id; +-------------+--------+ | course_name | name | +-------------+--------+ | Java | Dany | | MySQL | Green | | Java | Henry | | Python | Jane | | Go | Jin | | Go | John | | Go | Lily | | C++ | Susan | | C++ | Thomas | | C++ | Tom | | HTML | NULL | +-------------+--------+ 11 rows in set (0.00 sec)
三、分组查询
在 MySQL 中,GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。
使用 GROUP BY 关键字的语法格式如下:
GROUP BY <字段名>
其中,"字段名"表示需要分组的字段名称,多个字段时用逗号隔开。
1.GROUP BY单独使用单独使用 GROUP BY 关键字时,查询结果会只显示每个分组的第一条记录。
案例1:根据 tb_students_info 表中的 sex 字段进行分组查询,显示姓名与性别
mysql> select name,sex from tb_students_info group by sex; +-------+------+ | name | sex | +-------+------+ | Henry | 女 | | Dany | 男 | +-------+------+ 2 rows in set (0.00 sec)2.GROUP BY 与 GROUP_CONCAt()
GROUP BY 关键字可以和 GROUP_CONCAt() 函数一起使用。GROUP_CONCAt() 函数会把每个分组的值都显示出来。
案例2:据 tb_students_info 表中的 sex 字段进行分组查询,使用 GROUP_CONCAt() 函数将每个分组的 name 字段的值都显示出来
mysql> select group_concat(name),sex from tb_students_info group by sex; +-----------------------------------+------+ | group_concat(name) | sex | +-----------------------------------+------+ | Henry,Jin,John,Thomas,Tom | 女 | | Dany,Green,Jane,Lily,Susan,Liming | 男 | +-----------------------------------+------+ 2 rows in set (0.00 sec)
由结果可以看到,查询结果分为两组,sex 字段值为"女"的是一组,值为"男"的是一组,且每组的学生姓名都显示出来了。
案例3:根据 tb_students_info 表中的 age 和 sex 字段进行分组查询,且每组的学生姓名都显示
mysql> select group_concat(name),age,sex from tb_students_info group by age,sex; +--------------------+------+------+ | group_concat(name) | age | sex | +--------------------+------+------+ | Jin,John | 21 | 女 | | Thomas | 22 | 女 | | Jane,Lily,Liming | 22 | 男 | | Henry,Tom | 23 | 女 | | Green,Susan | 23 | 男 | | Dany | 25 | 男 | +--------------------+------+------+ 6 rows in set (0.00 sec)
上面案例在分组过程中,先按照 age 字段进行分组,当 age 字段值相等时,再把 age 字段值相等的记录按照 sex 字段进行分组。
多个字段分组查询时,会先按照第一个字段进行分组。如果第一个字段中有相同的值,MySQL 才会按照第二个字段进行分组。如果第一个字段中的数据都是唯一的,那么 MySQL 将不再对第二个字段进行分组。
3.GROUP BY 与聚合函数在数据统计时,GROUP BY 关键字经常和聚合函数一起使用。
| 聚合函数 | 作用 |
|---|---|
| COUNT() | 统计记录的条数 |
| SUM() | 计算字段值的总和 |
| AVG() | 计算字段值的平均值 |
| MAX() | 查询字段的最大值 |
| MIN() | 查询字段的最小值 |
案例4:根据 tb_students_info 表的 sex 字段进行分组查询,使用 COUNT() 函数计算每一组的记录数。
mysql> select count(name),sex from tb_students_info group by sex; +-------------+------+ | count(name) | sex | +-------------+------+ | 5 | 女 | | 6 | 男 | +-------------+------+ 2 rows in set (0.00 sec)
案例5:根据 tb_students_info 表的 sex 字段进行分组查询,使用avg()函数求出男女的平均身高
mysql> select sex,avg(height) from tb_students_info group by sex; +------+--------------------+ | sex | avg(height) | +------+--------------------+ | 女 | 174.4 | | 男 | 165.16666666666666 | +------+--------------------+ 2 rows in set (0.00 sec) //可以看到上面的结果保留了很多位的小数部分,下面用round()来优化一下,只保留2位小数 mysql> select sex,round(avg(height),2) from tb_students_info group by sex; +------+----------------------+ | sex | round(avg(height),2) | +------+----------------------+ | 女 | 174.40 | | 男 | 165.17 | +------+----------------------+ 2 rows in set (0.00 sec)
案例6:根据 tb_students_info 表的 sex 字段进行分组查询,使用sum()函数求出男和女分别的总年龄
mysql> select sex,sum(age) from tb_students_info group by sex; +------+----------+ | sex | sum(age) | +------+----------+ | 女 | 110 | | 男 | 137 | +------+----------+ 2 rows in set (0.00 sec)4.GROUP BY 与 WITH ROLLUP
WITH POLLUP 关键字用来在所有记录的最后加上一条记录,这条记录是上面所有记录的总和,即统计记录数量。
案例7:根据 tb_students_info 表中的 sex 字段进行分组查询,并使用 WITH ROLLUP 显示name记录的总和:
mysql> select sex,group_concat(name) from tb_students_info group by sex with ROLLUP; +------+-------------------------------------------------------------+ | sex | group_concat(name) | +------+-------------------------------------------------------------+ | 女 | Henry,Jin,John,Thomas,Tom | | 男 | Dany,Green,Jane,Lily,Susan,Liming | | NULL | Henry,Jin,John,Thomas,Tom,Dany,Green,Jane,Lily,Susan,Liming | +------+-------------------------------------------------------------+ 3 rows in set (0.00 sec)四、子查询
子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECt、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在 WHERe 子句中。
MySQL 在处理上例的 SELECT 语句时,执行流程为:先执行子查询,再执行父查询。
子查询在 WHERe 中的语法格式如下:
WHERe <表达式> <操作符> (子查询)
其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
-
IN | NOT IN
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。 -
EXISTS | NOT EXISTS
用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。
案例1:使用子查询在 tb_students_info 表和 tb_course 表中查询学习 Java 课程的学生姓名
mysql> select name from tb_students_info where course_id in (select id from tb_course where course_name = 'Java'); +-------+ | name | +-------+ | Dany | | Henry | +-------+ 2 rows in set (0.00 sec)
案例2:使用 NOT IN 关键字,查询没有学习 Java 课程的学生姓名
mysql> select name from tb_students_info where course_id not in (select id from tb_course where course_name = 'Java'); +--------+ | name | +--------+ | Green | | Jane | | Jin | | John | | Lily | | Susan | | Thomas | | Tom | | Liming | +--------+ 9 rows in set (0.00 sec)
案例3:使用=运算符,在 tb_course 表和 tb_students_info 表中查询出所有学习 Python 课程的学生姓名
mysql> select name from tb_students_info where course_id = (select id from tb_course where course_name = 'Python'); +------+ | name | +------+ | Jane | +------+ 1 row in set (0.00 sec)
案例4:使用<>运算符,在 tb_course 表和 tb_students_info 表中查询出没有学习 Python 课程的学生姓名
mysql> select name from tb_students_info where course_id <> (select id from tb_course where course_name = 'Python'); +--------+ | name | +--------+ | Dany | | Green | | Henry | | Jin | | John | | Lily | | Susan | | Thomas | | Tom | | Liming | +--------+ 10 rows in set (0.00 sec)
案例5:查询 tb_course 表中是否存在 id=1 的课程,如果存在,就查询出 tb_students_info 表中的记录
mysql> select * from tb_students_info where exists (select * from tb_course where id = 1); +----+--------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+--------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | | 2 | Green | 23 | 男 | 158 | 2 | | 3 | Henry | 23 | 女 | 185 | 1 | | 4 | Jane | 22 | 男 | 162 | 3 | | 5 | Jin | 21 | 女 | 172 | 4 | | 6 | John | 21 | 女 | 172 | 4 | | 7 | Lily | 22 | 男 | 165 | 4 | | 8 | Susan | 23 | 男 | 170 | 5 | | 9 | Thomas | 22 | 女 | 178 | 5 | | 10 | Tom | 23 | 女 | 165 | 5 | | 11 | Liming | 22 | 男 | 176 | 7 | +----+--------+------+------+--------+-----------+ 11 rows in set (0.00 sec)
由结果可以看到,tb_course 表中存在 id=1 的记录,因此 EXISTS 表达式返回 TRUE,外层查询语句接收 TRUE 之后对表 tb_students_info 进行查询,返回所有的记录。
EXISTS 关键字可以和其它查询条件一起使用,条件表达式与 EXISTS 关键字之间用 AND 和 OR 连接。
案例6:查询 tb_course 表中是否存在 id=1 的课程,如果存在,就查询出 tb_students_info 表中 age 字段大于 24 的记录
mysql> select * from tb_students_info where age > 24 and exists (select * from tb_course where id =1); +----+------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | +----+------+------+------+--------+-----------+ 1 row in set (0.00 sec)
结果显示,从 tb_students_info 表中查询出了一条记录,这条记录的 age 字段取值为 25。内层查询语句从 tb_course 表中查询到记录,返回 TRUE。外层查询语句开始进行查询。根据查询条件,从 tb_students_info 表中查询 age 大于 24 的记录。
子查询的功能也可以通过表连接完成,但是子查询会使 SQL 语句更容易阅读和编写。
一般来说,表连接(内连接和外连接等)都可以用子查询替换,但反过来却不一定,有的子查询不能用表连接来替换。子查询比较灵活、方便、形式多样,适合作为查询的筛选条件,而表连接更适合于查看连接表的数据。
五、数据库的备份与恢复 1.备份方案-
备份类型分为:
- 冷备份:在数据库服务未运行时进行备份,通常使用tar等命令直接对数据存放目录进行打包压缩
- 温备份:温备份:在数据库服务运行时进行备份,数据库的读操作可以执行, 但是不能执行写操作
- 热备份:在数据库服务运行时进行备份,数据库的读写操作均不受影响
-
备份方案分为:
- 全量备份
- 增量备份
- 差异备份
| 备份方案 | 特点 |
|---|---|
| 全量备份 | 全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。 数据恢复快。 备份时间长 |
| 增量备份 | 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份 与前一次相比增加和者被修改的文件。这就意味着,第一次增量备份的对象 是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量 备份后所产生的增加和修改的文件,如此类推。 没有重复的备份数据 备份时间短 恢复数据时必须按一定的顺序进行 |
| 差异备份 | 备份上一次的完全备份后发生变化的所有文件。 差异备份是指在一次全备份后到进行差异备份的这段时间内 对那些增加或者修改文件的备份。在进行恢复时,我们只需对第一次全量备份和最后一次差异备份进行恢复。 |
语法:
mysqldump [OPTIONS] database [tables ...] //备份库中的表
mysqldump [OPTIONS] --all-databases [OPTIONS] //备份整个数据库
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] //备份库
常用的OPTIONS:
-uUSERNAME //指定数据库用户名
-hHOST //指定服务器主机,请使用ip地址
-pPASSWORD //指定数据库用户的密码
-P# //指定数据库监听的端口,这里的#需用实际的端口号代替,如-P3307
2.1备份整个数据库
[root@yf ~]# mysqldump -uroot -p --all-databases > /root/all-$(date '+%Y-%m-%d'_%H:%M:%S).sql Enter password: [root@yf ~]# ls all-2022-07-28_17:37:11.sql anaconda-ks.cfg
2.2备份某个库里的表
[root@yf ~]# mysqldump -uroot -p yf tb_students_info > /root/table-$(date '+%Y%m%d'_%H:%M:%S).sql Enter password: [root@yf ~]# ls all-2022-07-28_17:37:11.sql anaconda-ks.cfg table-20220728_17:41:42.sql
2.3备份某个库
[root@yf ~]# mysqldump -uroot -p --databases yf > /root/db-$(date '+%Y%%_%H:%M:%S').sql Enter password: [root@yf ~]# ls all-2022-07-28_17:37:11.sql anaconda-ks.cfg db-2022%_17:45:31.sql table-20220728_17:41:42.sql3.数据恢复
1.模拟误删yf这个库
mysql> drop database yf; Query OK, 2 rows affected (0.02 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb1 | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
2.从前面的备份文件恢复该库
[root@yf ~]# ls all-2022-07-28_17:37:11.sql anaconda-ks.cfg db-2022%_17:45:31.sql table-20220728_17:41:42.sql [root@yf ~]# [root@yf ~]# mysql -uroot -p < db-2022%_17:45:31.sql Enter password: [root@yf ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 35 Server version: 5.7.38 MySQL Community Server (GPL) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mydb1 | | mysql | | performance_schema | | sys | | yf | +--------------------+ 6 rows in set (0.00 sec)
3.模拟误删数据表
mysql> use yf; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +------------------+ | Tables_in_yf | +------------------+ | tb_course | | tb_students_info | +------------------+ 2 rows in set (0.00 sec) mysql> drop table tb_students_info; Query OK, 0 rows affected (0.01 sec) mysql> show tables; +--------------+ | Tables_in_yf | +--------------+ | tb_course | +--------------+ 1 row in set (0.00 sec)
4.恢复数据表
mysql> use yf; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +--------------+ | Tables_in_yf | +--------------+ | tb_course | +--------------+ 1 row in set (0.00 sec) mysql> source table-20220728_17:41:42.sql //恢复数据表 Query OK, 0 rows affected (0.00 sec) .................... .................... Query OK, 0 rows affected (0.00 sec) mysql> show tables; +------------------+ | Tables_in_yf | +------------------+ | tb_course | | tb_students_info | +------------------+ 2 rows in set (0.00 sec) mysql> desc tb_students_info; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | sex | varchar(6) | YES | | NULL | | | height | float | YES | | NULL | | | course_id | tinyint(4) | YES | | NULL | | +-----------+-------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) mysql> select * from tb_students_info; +----+--------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+--------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | | 2 | Green | 23 | 男 | 158 | 2 | | 3 | Henry | 23 | 女 | 185 | 1 | | 4 | Jane | 22 | 男 | 162 | 3 | | 5 | Jin | 21 | 女 | 172 | 4 | | 6 | John | 21 | 女 | 172 | 4 | | 7 | Lily | 22 | 男 | 165 | 4 | | 8 | Susan | 23 | 男 | 170 | 5 | | 9 | Thomas | 22 | 女 | 178 | 5 | | 10 | Tom | 23 | 女 | 165 | 5 | | 11 | Liming | 22 | 男 | 176 | 7 | +----+--------+------+------+--------+-----------+ 11 rows in set (0.00 sec)4.免密登录与免密备份
1.免密登录
[root@yf ~]# vim .my.cnf [root@yf ~]# cat .my.cnf [client] user=root password=yefeng123 [root@yf ~]# mysql Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 41 Server version: 5.7.38 MySQL Community Server (GPL) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>
2.免密备份
[root@yf ~]# vim .my.cnf [root@yf ~]# cat .my.cnf [mysqldump] user=root password=yefeng123 [root@yf ~]# mysqldump --databases yf > /root/db-$(date '+%Y%m%d_%H:%M:%S').sql [root@yf ~]# ls all-2022-07-28_17:37:11.sql anaconda-ks.cfg db-20220728_20:32:32.sql



