MySQL数据库——基础篇

  • 第一章 数据库概述
  • 1、为什么要使用数据库
  • 2、数据库与数据库管理系统
  • 1)数据库的相关概念
  • 2)数据库与数据库管理系统的关系
  • 3、MySQL介绍
  • 1)概述
  • 2)Oracle vs MySQL
  • 4、RDBMS 与 非RDBMS
  • 1)关系型数据库(RDBMS)
  • 2)非关系型数据库(非RDBMS)
  • 5、关系型数据库设计规则
  • 1)表、记录、字段
  • 2)表的关联关系
  • ①、一对一关联(one-to-one)
  • ②、一对多关系(one-to-many)
  • ③、多对多(many-to-many)
  • ④、自我引用(Self reference)
  • 第二章 MySQL环境搭建
  • 1、MySQL的下载、安装、配置
  • 1)软件的下载
  • 2)MySQL8.0 版本的安装
  • 3)配置MySQL8.0
  • 4)配置MySQL8.0 环境变量
  • 5)安装失败问题
  • 2、MySQL 的卸载
  • 3、MySQL 的登录
  • 1)服务的启动与停止
  • 2)自带客户端的登录与退出
  • 4、MySQL演示使用
  • 第三章 基本的 SELECT 语句
  • 1、SQL 分类
  • 2、SQL语言的规则与规范
  • 1)语言规则
  • 2)SQL 大小写规范
  • 3)注释
  • 4)命名规则
  • 5)数据导入指令
  • 3、基本的 SELECT 语句
  • 1)SELECT ... FROM
  • 2)列的别名
  • 3)去除重复行
  • 4)空值参与运算
  • 5)着重号
  • 6)查询常数
  • 4、显示表结构
  • 5、过滤数据


第一章 数据库概述

1、为什么要使用数据库

  • 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以“固化”,而持久化的实现过程大多通过各种关系数据库来完成。
  • 持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。

2、数据库与数据库管理系统

1)数据库的相关概念

概念

作用

DB:数据库(Database)

即存储数据的“仓库”,其本质是一个文件系统。它保存了一系列有组织的数据。

DBMS:数据库管理系统(Database Management System)

是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据。

SQL:结构化查询语言(Structured Query Language)

专门用来与数据库通信的语言

2)数据库与数据库管理系统的关系

数据库管理系统(DBMS)可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体用户的数据。

数据库管理系统、数据库和表的关系如图所示:

mysql记录修改表过程 mysql数据库修改记录_学习


mysql记录修改表过程 mysql数据库修改记录_学习_02

3、MySQL介绍

1)概述
  • MySQL是一个开放源代码的关系型数据库管理系统 ,由瑞典MySQL AB(创始人Michael Widenius)公司1995年开发,迅速成为开源数据库的 No.1。
  • MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  • MySQL是可以定制的,采用了 GPL(GNU General Public License) 协议,你可以修改源码来开发自己的MySQL系统。
  • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB
  • MySQL使用标准的SQL数据语言形式。
  • MySQL可以允许运行于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、 Java、Perl、PHP和Ruby等。
2)Oracle vs MySQL
  • Oracle更适合大型跨国企业的使用,因为他们对费用不敏感,但是对性能要求以及安全性有更高的要求。
  • MySQL由于其体积小、速度快、总体拥有成本低,可处理上千万条记录的大型数据库,尤其是开放源码这一特点,使得很多互联网公司、中小型网站选择了MySQL作为网站数据库。

4、RDBMS 与 非RDBMS

1)关系型数据库(RDBMS)
  • 实质
  • 这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系 (即二维表格形式)
  • 关系型数据库以行(row)列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database)
  • SQL 就是关系型数据库的查询语言。
  • 优势
  • 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持使得对于安全性能很高的数据访问要求得以实现。
2)非关系型数据库(非RDBMS)
  • 介绍
    非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要经过SQL层的解析,性能非常高。同时,通过减少不常用的功能,进一步提高性能。
  • 种类
  • 键值型数据库
    键值型数据库通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。键值型数据库典型的使用场景是作为内存缓存Redis是最流行的键值型数据库。
    优点:查找速度快,优于关系型数据库。
    缺点:无法像关系型数据库一样使用条件过滤(比如 WHERE),如果不知道去哪里找数据,就要遍历所有的键,这就会消耗大量的计算。
  • mysql记录修改表过程 mysql数据库修改记录_mysql记录修改表过程_03

  • 文档型数据库
    文档型数据库可存放并获取文档,可以是XML、JSON等格式。在数据库中文档作为处理信息的基本单位,一个文档就相当于一条记录。文档数据库所存放的文档,就相当于键值数据库所存放的“值”。流行的文档型数据库有MongoDB、CouchDB等。
  • 搜索引擎数据库
    搜索引擎数据库是应用在搜索引擎领域的数据存储形式,由于搜索引擎会爬取大量的数据,并以特定的格式进行存储,这样在检索的时候才能保证性能最优。核心原理是“倒排索引”。典型产品:Solr、Elasticsearch、Splunk 等。
  • 列式数据库
    列式数据库是相对于行式存储的数据库,Oracle、MySQL、SQL Server 等数据库都是采用的行式存储(Row-based),而列式数据库是将数据按照列存储到数据库中,这样做的好处是可以大量降低系统的I/O,适合于分布式文件系统,不足在于功能相对有限。典型产品:HBase等。
  • mysql记录修改表过程 mysql数据库修改记录_学习_04

  • 图形数据库
    图形数据库,利用了图这种数据结构存储了实体(对象)之间的关系。图形数据库最典型的例子就是社交网络中人与人的关系,数据模型主要是以节点和边(关系)来实现,特点在于能高效地解决复杂的关系问题。典型产品:Neo4J、InfoGrid等。
  • mysql记录修改表过程 mysql数据库修改记录_数据库_05

5、关系型数据库设计规则

  • 关系型数据库的典型数据结构就是数据表,这些数据表的组成都是结构化的(Structured)。
  • 将数据放到表中,表再放到库中。
  • 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
  • 表具有一些特性,这些特性定义了数据在表中如何存储,类似Java和Python中 “类”的设计。
1)表、记录、字段
  • E-R(entity-relationship,实体-联系)模型中有三个主要概念是:实体集属性联系集
  • 一个实体集(class)对应于数据库中的一个表(table)。一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)。
  • ORM思想(Object Relational Mapping)体现:
  • 数据库中的一个表 <——> Java或Python中的一个类
  • 表中的一条数据 <——> 类中的一个对象(或实体)
  • 表中的一个列 <——> 类中的一个字段、属性(field)
2)表的关联关系
  • 表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。
  • 四种:一对一关联、一对多关联、多对多关联、自我引用
①、一对一关联(one-to-one)
  • 在实际的开发中应用不多,因为一对一可以创建成一张表。
  • 举例:设计学生表:学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人、…
  • 拆为两个表:两个表的记录是一一对应关系。
  • 基础信息表(常用信息):学号、姓名、手机号码、班级、系别
  • 档案信息表(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人、…
  • 两种建表原则:
  • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
  • 外键是主键:主表的主键和从表的主键,形成主外键关系。

mysql记录修改表过程 mysql数据库修改记录_数据库_06

②、一对多关系(one-to-many)
  • 常见实例场景:客户表和订单表分类表和商品表部门表和员工表
  • 举例:
  • 员工表:编号、姓名、…、所属部门
  • 部门表:编号、名称、简介
  • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

③、多对多(many-to-many)

要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。

mysql记录修改表过程 mysql数据库修改记录_学习_07

  • 举例1:学生—课程
  • 学生信息表:一行代表一个学生的信息(学号、姓名、手机号码、班级、系别…)
  • 课程信息表:一行代表一个课程的信息(课程编号、授课老师、简介…)
  • 选课信息表:一个学生可以选多门课,一门课可以被多个学生选择

学号

课程编号

1

1001

2

1001

1

1002

  • 举例2:产品—订单
    “订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。
  • 产品表:“产品”表中的每条记录表示一个产品。
  • 订单表:“订单”表中的每条记录表示一个订单。
  • 订单明细表:每个产品可以与“订单”表中的多条记录对应,即出现在多个订单中。一个订单可以与“产品”表中的多条记录对应,即包含多个产品。

mysql记录修改表过程 mysql数据库修改记录_MySQL_08

  • 举例3:用户—角色
    多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
④、自我引用(Self reference)

mysql记录修改表过程 mysql数据库修改记录_数据库_09

第二章 MySQL环境搭建

1、MySQL的下载、安装、配置

1)软件的下载

①、下载地址

官网:https://www.mysql.com

mysql记录修改表过程 mysql数据库修改记录_mysql_10


②、打开官网,点击DOWNLOADS,然后点击MySQL Community(GPL) Downloads

mysql记录修改表过程 mysql数据库修改记录_数据库_11


③、点击MySQL Community Server

mysql记录修改表过程 mysql数据库修改记录_MySQL_12


④、在General Availability(GA) Releases中选择适合的版本

Windows平台下提供两种安装文件:MySQL二进制分发版(.msi安装文件)和免安装版(.zip压缩文件)。一般来讲,应当使用二进制分发版,因为该版本提供了图形化的安装向导过程,比其他的分发版使用起来要简单,不再需要其他工具启动就可以运行MySQL。

  • 这里在Windows系统下推荐下载MSI安装程序;点击Go to Download Page进行下载即可
  • Windows下的MySQL8.0安装有两种安装程序
  • mysql-installer-web-community-8.0.26.0.msi下载程序大小:2.3M;安装时需要联网安装组件。
  • mysql-installer-community-8.0.26.0.msi下载程序大小:439.6M;安装时离线安装即可。推荐。

mysql记录修改表过程 mysql数据库修改记录_mysql记录修改表过程_13

  • 如果安装MySQL5.7版本的话,选择Archives,接着选择MySQL5.7的相应版本即可。这里下载最近期的MySQL5.7.37版本。
2)MySQL8.0 版本的安装
  • MySQL下载完成后,找到下载文件,双击进行安装,具体操作步骤如下。
  • 步骤1:双击下载的mysql-installer-community-8.0.29.0.msi文件,打开安装向导。
  • 步骤2:打开“Choosing a Setup Type”(选择安装类型)窗口,在其中列出了5种安装类型,分别是Developer Default(默认安装类型)、Server only(仅作为服务器)、Client only(仅作为客户端)、Full(完全安装)、Custom(自定义安装)。这里选择“Custom(自定义安装)”类型按钮,单击“Next(下一步)”按钮。
  • 步骤3:打开“Select Products” (选择产品)窗口,可以定制需要安装的产品清单。例如,选择“MySQL Server 8.0.29-X64”后,单击“→”添加按钮,即可选择安装MySQL服务器,如图所示。采用通用的方法,可以添加其他你需要安装的产品。

    此时如果直接“Next”(下一步),则产品的安装路径是默认的。如果想要自定义安装目录,则可以选中对应的产品,然后在下面会出现“Advanced Options”(高级选项)的超链接。

    单击“Advanced Options”(高级选项)则会弹出安装目录的选择窗口,如图所示,此时你可以分别设置MySQL的服务程序安装目录和数据存储目录。如果不设置,默认分别在C盘的Program Files目录和ProgramData目录(这是一个隐藏目录)。如果自定义安装目录,请避免“中文”目录。另外,建议服务目录和数据目录分开存放。
  • 步骤4:在上一步选择好要安装的产品之后,单击“Next”(下一步)进入确认窗口,如图所示。单击“Execute”(执行)按钮开始安装。
  • 步骤5:安装完成后在“Status”(状态)列表下将显示“Complete”(安装完成),如图所示。
3)配置MySQL8.0
  • MySQL安装之后,需要对服务器进行配置。具体的配置步骤如下。
  • 步骤1:在上一个小节的最后一步,单击“Next”(下一步)按钮,就可以进入产品配置窗口。
  • 步骤2:单击“Next”(下一步)按钮,进入MySQL服务器类型配置窗口,如图所示。端口号一般选择默认端口号3306。

    其中,“Config Type”选项用于设置服务器的类型。单击该选项右侧的下三角按钮,即可查看3个选项,如图所示。

    Development Machine(开发机器):该选项代表典型个人用桌面工作站。此时机器上需要运行多个应用程序,那么MySQL服务器将占用最少的系统资源。
    Server Machine(服务器):该选项代表服务器,MySQL服务器可以同其他服务器应用程序一起运行,例如Web服务器等。MySQL服务器配置成适当比例的系统资源。
    Dedicated Machine(专用服务器):该选项代表只运行MySQL服务的服务器。MySQL服务器配置成使用所有可用系统资源。
  • 步骤3:单击“Next”(下一步)按钮,打开设置授权方式窗口。其中,上面的选项是MySQL8.0提供的新的授权方式,采用SHA256基础的密码加密方法;下面的选项是传统授权方法(保留5.x版本兼容性)。
  • 步骤4:单击“Next”(下一步)按钮,打开设置服务器root超级管理员的密码窗口,如图所示,需要输入两次同样的登录密码。也可以通过“Add User”添加其他用户,添加其他用户时,需要指定用户名、允许该用户名在哪台/哪些主机上登录,还可以指定用户角色等。
  • 步骤5:单击“Next”(下一步)按钮,打开设置服务器名称窗口,如图所示。该服务名会出现在Windows服务列表中,也可以在命令行窗口中使用该服务名进行启动和停止服务。本书将服务名设置为“MySQL80”。如果希望开机自启动服务,也可以勾选“Start the MySQL Server at System Startup”选项(推荐)。
    下面是选择以什么方式运行服务。可以选择“Standard System Account”(标准系统用户)或者“Custom User” (自定义用户)中的一个。这里推荐前者。
  • 步骤6:单击“Next”(下一步)按钮,打开确认设置服务器窗口,单击“Execute”(执行)按钮。
  • 步骤7:完成配置,如图所示。单击“Finish”(完成)按钮,即可完成服务器的配置
  • 步骤8:如果还有其他产品需要配置,可以选择其他产品,然后继续配置。如果没有,直接选择“Next”(下一步),直接完成整个安装和配置过程。
  • 步骤9:结束安装和配置。
4)配置MySQL8.0 环境变量

如果不配置MySQL环境变量,就不能在命令行直接输入MySQL登录命令。下面说如何配置MySQL的环境变量:

  • 步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属性】菜单命令。
  • 步骤2:打开【系统】窗口,单击【高级系统设置】链接。
  • 步骤3:打开【系统属性】对话框,选择【高级】选项卡,然后单击【环境变量】按钮。
  • 步骤4:打开【环境变量】对话框,在系统变量列表中选择path变量。
  • 步骤5:单击【编辑】按钮,在【编辑环境变量】对话框中,将MySQL应用程序的bin目录(D:\develop_tools\MySQL\bin)添加到变量值中,用分号将其与其他路径分隔开。
  • 步骤6:添加完成之后,单击【确定】按钮,这样就完成了配置path变量的操作,然后就可以直接输入MySQL命令来登录数据库了。
5)安装失败问题

2、MySQL 的卸载

3、MySQL 的登录

1)服务的启动与停止
2)自带客户端的登录与退出

4、MySQL演示使用

第三章 基本的 SELECT 语句

1、SQL 分类

SQL 语言在功能上主要分为如下3大类:

  • DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构
  • 主要的语句关键字包括CREATEDROPALTER
  • DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性
  • 主要的语句关键字:INSERTDELETEUPDATESELECT
  • SELECT是SQL语言的基础,最为重要
  • DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别
  • 主要的语句关键字:GRANTREVOKECOMMITROLLBACKSAVEPOINT

2、SQL语言的规则与规范

1)语言规则
  • SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
  • 每条命令以;\g\G结束
  • 关键字不能被缩写也不能分行
  • 关于标点符号
  • 必须保证所有的()、单引号、双引号是成对结束的
  • 必须使用英文状态下的半角输入方式
  • 字符串型和日期时间类型的数据可以使用单引号' '表示
  • 列的别名,尽量使用双引号" ",而且不建议省略as
2)SQL 大小写规范
  • MySQL 在 Windows 环境下是大小写不敏感的
  • MySQL 在 Linux 环境下是大小写敏感的
  • 采用统一的书写规范:
  • 数据库名、表名、表别名、字段名、字段别名等都小写
  • SQL 关键字、函数名、绑定变量等都大写
3)注释

可以使用如下格式的注释结构

单行注释:# 注释文字
单行注释:-- 注释文字(--后面必须包含一个空格) 
多行注释:/* 注释文字 */
4)命名规则
  • 数据库、表名不得超过30个字符,变量名限制为29个
  • 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  • 数据库名、表名、字段名等对象名中间不要包含空格
  • 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来
  • 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
# 以下两句是一样的,不区分大小写
showdatabases;
SHOWDATABASES;

# 创建表格
# create table student info(...); # 表名错误,因为表名有空格
create table student_info(...);

# 其中order使用``飘号,因为order和系统关键字或系统函数名等预定义标识符重名了
CREATE TABLE `order`(
 id INT,
 lname VARCHAR(20)
);

select id as "编号", `name` as "姓名" from t_stu; # 起别名时,as都可以省略
select id as 编号,`name` as 姓名 from t_stu; # 如果字段别名中没有空格,那么可以省略""
select id as 编号,`name` as 姓 名 from t_stu; # 错误,如果字段别名中有空格,那么不能省略""
5)数据导入指令
  • 方式一:在命令行客户端登录 mysql ,使用 source 指令导入
  • 举例:source d:\atguigudb.sql;
  • 方式二:基于具体的图形化界面的工具可以导入数据
  • 比如:SQLyog中选择“工具” →“执行sql脚本”→选择需要导入的数据即可

3、基本的 SELECT 语句

1)SELECT … FROM
  • 语法:
# SELECT 字段1, 字段2, ... FROM 表名

SELECT 	标识选择哪些列
FROM 	标识从哪个表中选择
  • 选择全部列:
# *:表中的所有字段(或列)	
SELECT * 
FROM departments;
  • 选择特定的列:
SELECT department_id, location_id
FROM departments;
2)列的别名
  • 紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写
  • AS 可以省略
  • 举例:
SELECT last_name AS name, commission_pct comm
FROM employees; 

SELECT last_name "Name", salary * 12 "Annual Salary"
FROM employees;
3)去除重复行

默认情况下,查询会返回全部行,包括重复行。

SELECT department_id
FROM employees;

mysql记录修改表过程 mysql数据库修改记录_mysql_14

在SELECT语句中使用关键字DISTINCT去除重复行

SELECT DISTINCT department_id
FROM employees;

mysql记录修改表过程 mysql数据库修改记录_数据库_15


注意:

DISTINCT 需要放到所有列名的前面,如果写成 SELECT salary, DISTINCT department_id FROM employees会报错

4)空值参与运算
  • 所有运算符或列值遇到null值,运算的结果都为null
  • 在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的
  • 举例:
# 空值参与运算:结果一定为空
SELECT employee_id, salary "月工资", salary * (1 + commission_pct) * 12 "年工资"
FROM employees;

mysql记录修改表过程 mysql数据库修改记录_数据库_16

# 实际问题的解决方案:引入IFNULL
SELECT employee_id, salary "月工资", salary * (1 + IFNULL(commission_pct, 0)) * 12 "年工资"
FROM employees;

mysql记录修改表过程 mysql数据库修改记录_数据库_17

5)着重号

我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,请在
SQL语句中使用一对``(着重号)引起来。

# 错误的
SELECT * FROM ORDER;

# 正确的
SELECT * FROM `order`;
6)查询常数
  • SELECT 查询还可以对常数进行查询,就是在 SELECT 查询结果中增加一列固定的常数列。这列的
    取值是我们指定的,而不是从数据表中动态取出的。
  • 我们想对 employees 数据表中的员工姓名进行查询,同时增加一列字段 corporation ,这个字段固定值为“尚硅谷”,可以这样写:
SELECT '尚硅谷' AS corporation, last_name
FROM employees;

mysql记录修改表过程 mysql数据库修改记录_数据库_18

4、显示表结构

使用DESCRIBE 或 DESC 命令,表示表结构。

DESCRIBE employees; 
DESC employees;

mysql记录修改表过程 mysql数据库修改记录_mysql记录修改表过程_19

其中,各个字段的含义分别解释如下:

  • Field:表示字段名称
  • Type:表示字段类型
  • Null:表示该列是否可以存储NULL值。
  • Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
  • Default:表示该列是否有默认值,如果有,那么值是多少。
  • Extra:表示可以获取的与给定列有关的附加信息

5、过滤数据

  • 语法:
  • 使用WHERE 子句,将不满足条件的行过滤掉
  • WHERE子句紧随FROM子句
SELECT 字段1,字段2 
FROM 表名 
WHERE 过滤条件
  • 举例:
SELECT employee_id, hire_date, salary, job_id
FROM employees
WHERE job_id = 'AD_VP';

mysql记录修改表过程 mysql数据库修改记录_学习_20