初识MySQL:库的操作、数据类型、表的操作
1. 数据库基础
1.1 什么是数据库
数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的非数值计算问题,数据处理的主要内容是数据的存储、查询、修改、排序和统计等。
1.2 MySQL是什么类型的数据库
目前主流的数据库有两类,分别是 关系型数据库 和 非关系型数据库。
什么是关系型数据库?
关系型数据库是指采⽤了关系模型来组织数据的数据库,以行和列的形式存储数据。关系模型可 以简单理解为二维表格模型,⽽⼀个关系型数据库就是由⼆维表及其之间的关系组成的⼀个数据组 织。

关系型数据库:像严谨的Excel表格,数据结构化、预先定义schema、强调数据一致性和完整性,通过SQL语言进行复杂查询。适合处理结构化数据和需要复杂事务的场景。
非关系型数据库:像一堆用途各异的储物柜,数据模型灵活多样、无需固定schema、强调可扩展性和高性能,使用多种专属API或语言。适合处理海量非结构化数据、高并发简单查询和需要快速迭代的场景。
非关系型数据库有多种模型:
• 文档型:类似JSON文档(如MongoDB)
• 键值型:简单的键值对(如Redis)
• 列族型:按列存储,适合稀疏数据(如Cassandra)
• 图型:存储节点和关系(如Neo4j)
MySQL是什么类型的数据库?
MySQL 是一个开源的关系型数据库管理系统。
关系型数据库:
- Oracle:甲⻣⽂产品,适合⼤型项⽬,业内最强的数据库,没有之⼀,需要收费。
- MySQL:开源免费,最受欢迎的数据库,在中⼩企业中普及率⾮常⾼,属于甲⻣⽂,主要⽤在电 商,论坛等。
- PostgreSQL:加州⼤学伯克利分校计算机系开发的关系型数据库,可以免费使⽤,修改和分发。
- SQLSever:微软推出的⼀款专业级数据库,与旗下的操作系统,编程环境配合使⽤,适⽤于中⼤ 型项⽬。
- SQLite:⼀款轻型的数据库,占⽤资源⾮常低,常⽤于嵌⼊式设备,⼿机APP,桌⾯程序等场景。
【SQL 的全称是 Structured Query Language,中文翻译为 “结构化查询语言”。名字里有“SQL”,通常就意味着它承诺提供完整的关系模型支持和标准的SQL兼容性。】
非关系型数据库:
- Redis:流⾏的基于键值对的内存数据库,常⽤作缓存,⽀持数据持久化,⽀持多种数据结构。
- MongoDB:基于NoSQL的⽂档型数据库,易扩展,⾼性能,⾼可⽤性,⽀持丰富的查询和聚合操 作。
1.3 客户端工具的使用
1.3.1 命令行界面
MySQL安装成功后,会有一个自带的命令⾏客户端⼯具 mysql Client。

打开该客户端工具,会先让我们登录用户,登录完成后就可以通过sql语句使用MySQL数据管理系统了。


我们也可以windows系统的命令提示符来启动mysql,不过需要我们先配置一下mysql的环境变量:
1. 找到 MySQL\MySQL Server X.X\bin 文件:
其中 X.X 是你的MySQL版本号,“MySQL”前面的路径与你当时安装MySQL数据库时存放的地址有关。对于8.0版本MySQL的默认的路径是:C:\Program Files\MySQL\MySQL Server 8.0\bin

2. 在桌面右击鼠标打开“个性化” --> 搜索“高级系统设置” --> 选择“高级” --> 点击“环境变量”

3. 在环境变量界面的“系统变量”栏中找到 path 变量,进入path行

4. 新建环境变量 --> 把刚刚找到的 bin文件 的绝对路径粘贴此处

配置好MySQL的环境变量后就可以在windows系统的命令行提示符中运行MySQL了:
输入命令:mysql -uroot -p

此时已经运行了MySQL,然后我们像在 mysql Client 那样输入登录密码即可使用:


1.3.2 图形化界面
下面这个表格汇总了主流的 MySQL 客户端工具及其核心特点,方便你快速了解:

Workbench是MySQL官方提供的可视化工具。
Navicat Lite是业内广泛使用的可视化客⼾端⼯具,现在出了免费的Lite版本,对于学习中编写SQL语句完全够⽤,推荐使⽤。
第⼀次使⽤要先配置连接,如下图所示:


经过上述图片中描述的步骤,连接就创建好了
注意:
- MySQL 服务器一次只能在一个端口上运行。(不过一个计算机可以同时运行多个MySQL服务器实例)
- 3306是默认的端口号,这与MySQL的配置文件有关。
- 名字不同但端口号相同的连接,它们可操作的数据库是相同的。反之,端口号不同的连接,它们可操作的数据库是不同的。
1.4 MySQL的(选项)配置文件
前面提到3306是默认的端口号,它与配置文件有关,那我们看看MySQL的配置文件长什么样。
配置文件是位于 MySQL/MySQL Server X.X 目录下的 my.ini 文件。

我们打开看一看:


如果要修改默认的端口号就是在 [mysqld] 部分中修改。这里不建议初学者修改配置文件!!
1.5 MySQL服务端程序
MySQL服务端程序就是 mysqld.exe 可执行文件。
什么是 mysqld ?
mysqld 是MySQL数据库系统的核心引擎和主服务器程序,它是实际执行所有数据库操作的"大脑"。(MySQL Daemon的缩写)
该文件位于 MySQL\MySQL Server X.X\bin 目录下:
有些同学可能会问:我是用客户端工具来操作数据库的,那自己不应该是客户端吗,为什么真正运行的是服务端程序?
这个问题问到了关键点上!
在您的个人电脑上,您同时扮演着两个角色:
- 数据库管理员:您启动和管理 mysqld 服务(图书馆的建造者和维护者)
- 最终用户:您使用Navicat、命令行等客户端(图书馆的读者)
所以在我们的电脑上,我们既是数据库的使用者,也是数据库管理员。
1.6 MySQL的存储引擎
存储引擎是MySQL数据库处理数据的核⼼组件,不同的存储引擎对数据如何存储、索引、更新和 查询的实现⽅式各有不同,在不同的业务场景可以选⽤合适的存储引擎。
查看当前服务器⽀持哪些存储引擎可以使⽤: SHOW ENGINES 语句:

可以看到,MySQL默认的存储引擎是 InnoDB。在Support列中,yes表示支持该存储引擎,no表示不支持该存储引擎。
2. 库的操作
2.1 查看数据库(查1)
语法:
show databases;
我现在总共有10个数据库,这在图形化界面的工具中很容易看出。但对于命令行界面,我们就需要sql语句来查看数据库

sql语句查看数据库:

2.2 创建数据库(增)
语法:
1.简单版 (使用默认的create_option):
create database [ if not exists ] 数据库名;
2.完整版 (自定义create_option):
create database [ if not exists ] 数据库名 [ character set [=] 字符集名称 ]
[ collate [=] 校验规则名称 ] [ encryption [=] { 'Y' | 'N' } ];
解释:
- 紫色部分表示关键字。
- 方括号[]表示可选项。
- 大括号{}表示必填项。
- “|” 表示或。
使用语句 “create database 数据库名” 就能正常创建数据库了,但如果已经存在该数据库还要执行该语句的话就会发生错误:


如果使用“if not exists”就可以避免这种错误的发生:

我们可以查看该警告信息:
语法:show warnings;
注意:SHOW WARNINGS 只显示上一条语句的警告,所以必须在目标语句的后面立即使用。如果中间执行了其他语句,显示的将是最后一条语句的警告。

* 设置字符编码集
我们先查看一下数据库⽀持哪些字符集编码
语法:show charset;


character set 选项的说明:
- character set 选项是用来设置字符编码集的。使用默认create_option的情况下,character set 等于 utf8mb4 。
- utf8mb4 的默认排序规则是 utf8mb4_0900_ai_ci。
- 在不同的编码集中,一个字符所使用的字节数不同。例如 ascii 只有1个字节,仅能表示256个常用字符;而 gbk 是中国国家标准的中文字符集编码,使用2个字节,可以表示两万多个汉字。utf8mb4 编码集使用4个字节,可以表示世界上的所有字符。
我们可以自定义字符串编码集,例如:


* 设置字符集的检验(排序)规则
我们先查看一下数据库⽀持哪些排序规则
语法:show collation;
截取部分:



不同的字串集与排序规则对数据库的影响:
- MySQL8.0默认的排序规则是 utf8mb4_0900_ai_ci,MySQL5.7默认排序规则是 utf8mb4_general_ci 。
- 0900 是基于UCA9.0.0算法,UCA是UnicodeCollationAlgorithm的缩写。
- ai是Accent-insensitive的缩写,表示口声不敏感;as是Accent-sensitive的缩写,表示口声敏感。
- ci是Case-insensitive的缩写,表示大小写不敏感(对唯一性约束的判断不区分大小写);cs是Case-sensitive的缩写,表示大小写敏感(排序、查找操作都会区分大小写)。
- bin 表示二进制。
collate选项的作用:
- collate 选项是用来设置字符集的校验(排序)规则的。如果没有自定义collate选项,那么它会根据 character set 选项自动调整到对应默认校验规则。
- 自定义 collate 选项时,所选的校验规则必须与字符集兼容。
校验规则与字符集不兼容时就会报错:字符集utf8mb4与规则gbk_chinese_ci是不兼容的
![]()
* 对数据库的加密
- encryption 选项表示:是否对该数据库进行加密。“ encryption = 'Y' ”表示加密,“ encryption = 'N' ”不是不加密。
- 使用默认create_option的情况下,是不会对数据库进行加密的。
- 使用加密后,硬盘上的文件是密文,用文本编辑器打开看到的是乱码,只有使用自己的MySQL服务器打开看到的才是明文。可以防止物理窃取。
2.3 查看创建数据库的语句(查2)
语法:show create database db_name;
作用:显示重新创建指定数据库所需的完整SQL语句。主要用于获取数据库的字符集和校对规则。
刚刚创建db1数据库是是用的简单版语句创建的,我们来看看它包含哪些信息:

/*!80016 DEFAULT ENCRYPTION='N' */不是真正的注释,而是一种语法格式,是可以被执行的
语法格式:/*!版本号 代码内容 */
解释:
/*!:开始条件。
版本号:5位数字,如 40100、80016。
代码内容:要执行的 SQL 代码。
*/:条件的结束。
/*!80016 DEFAULT ENCRYPTION='N' */的意思是:如果你的mysql版本号是 8.0.16版本 或 更高的版本号时,那么就会执行“ DEFAULT ENCRYPTION='N' ”语句(即设置数据库默认不加密)。
通过 show create database 查看的语句也是可以执行的,例如:
输入CREATE DATABASE if not exists `db1` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

2.4 修改数据库(改)
语法:
- 紫色部分表示关键字。
- 方括号[]表示可选项。
- 大括号{}表示必填项。
- “|” 表示或。
alter database 数据库名 {alter_option};
- 具体的修改操作(alter_option)包括:
- [default] character set [=] 字符集名称
- [default] collate [=] 校验规则名称
- [default] encryption [=] { 'Y' | 'N' }
- read only [=] { DEFAULT | 0 | 1 }
- 一条alter语句必须且只能使用一个具体的修改操作。
示例
把数据库db1改成加密:alter database db1 encryption = 'Y';

补充:
- alter database语句不支持修改数据库的名称。
- 只有alter database语句可以设置只读[read only]选项,create database语句没有只读选项。
- read only = 0 表示可读可写;read only = 1 表示只读;read only = default 表示只读设置跟随系统默认设置。
2.5 删除数据库(删)
语法:drop database [ if exists ] 数据库名;
注意:删除数据库是危险行为,语法不支持一次性删除多个数据库。
示例:删除数据库db1
查看原有的数据库

删除数据库db1后再次查看:

此时db1已经被删除了。如果再次删除且没有使用 “if exists” 就会报错:

同时删除多个数据库会触发语法错误:

3. 常见数据类型
3.1 数值类型
3.1.1 整型
整型共有5种,分别是:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。

- 实际使用中最常用的整型是 int 和 bigint。
- 如果需要使用无符号整数,只需要在基础整型的后面加上 UNSIGNED 关键字。例如:int unsigned。
- 限定最小显示宽度:整型(m) ZEROFILL (例如:int(5) ZEROFILL、int(10) zerofill)
- m:表示显示宽度,用来限定显示的十进制位数。
- zerofill关键字:填充0。如果存储的数值位数少于m限定的位数时,显示时会用0填充;如果存储的数值位数高于m限定的位数时,那么显示时不会处理该数值。
- 注意:如果只有(m)而没有使用zerofill关键字,那么并不会起到限定显示宽度的作用。
3.1.2 浮点型
浮点型共有3种,分别是:FLOAT、DOUBLE、DECIMAL

- M和D都是十进制位数,其中M表示总位数,D表示小数位数;也就是说最大的整数部分位数为 M-D。如果 整数位数 > M-D 或 小数位数 > D,都会触发约束,数据会被拒绝。
- 实际运用时,float 和 double 通常是不使用(M, D)约束的。虽然它们的D最大可为30,但是一旦超过了自身可以精确的最大位数后,后面的数据都没有意义。
- 使用 decimal 时一般都会使用(M, D)约束,这样能通过M来确定它的大致大小;decimal也可以单独使用(M)约束。
- 没有(D)约束,M最大为65,D最大为30。
- 省略D时,默认的D为0,此时接收的数值中不能有小数点或小数部分。
- 省略M时,默认的M为10。
- decimal不丢失精度的原因:decimal采用的是十进制存储。
- 采用的不是BCD编码。BCD编码的核心是每4个二进制位(可表示的范围 0~15)表示 1个十进制位(0~9)。
- 采用的是压缩十进制格式,每9个十进制使用4个字节。9位十进制数的范围:0 ~ 999,999,999。这个范围需要30个二进制位(2^30 = 1,073,741,824 > 999,999,999)所以30位二进制就足够表示9位十进制数。
3.2 字符串类型
3.2.1 普通字符串

- N 在char类型中表示字符串长度的大小,其单位是字符,其大小与表的字符编码集有关。N 在varchar类型中表示的是最大可存储字节数。
- 如果没有指定N的大小(如char、varchar),那么N默认等于1,此时只能存储一个字符。允许定义 char(0),此时列的值只能为NULL或空字符串,主要的⽬的是为了旧系兼容。
- CHAR是定长字符串,无论存储的字符数量是否达到了N,该字符串的物理长度都是N。【类似字符数组】
- VARCHAR是变长字符串,假设此时存储的字符数量为length,如果length小于N,那么该字符串的物理长度就是length。
3.2.2 文本类型
文本类型有4种:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT

- 实际运用时一般是使用TEXT类型。因为文本类型有一个特性,当存储的文本量超出自己的范围时会自动向上转型。
- 所有文本类型都是以字节为单位,且其物理长度都是变长的。
varchar是存储在行内的,文本类型可以存储在行外。
3.2.3 二进制类型

3.3 bit类型

BIT类型可以用于(状态)功能开关、位运算等。
例如:

每一个二进制位都表示一种功能,0表示功能关闭,1表示功能开启。
3.4 布尔类型

MySQL并没有真正的布尔数据类型,而是通过TINYINT(1) 模拟布尔行为。所以BOOL、BOOLEAN 和 TINYINT(1) 是相同的。
3.4 日期类型

- fsp 为可选设置,⽤来指定小数秒精度,范围从0到6,值为0表示没有小数部分,如果省略,默认精度为0
- CURRENT_DATE 和 CURRENT_DATE() 是 CURDATE() 的同义词⽤于获取当前日期。
- CURRENT_TIME 和 CURRENT_TIME([fsp]) 是 CURTIME() 的同义词⽤于获取当前时间。
- CURRENT_TIMESTAMP 和 CURRENT_TIMESTAMP([fsp]) 是 NOW() 的同义词用于获取当前日期和时间。
以搜索当前时间为例:select current_time, current_time(), curtime();

4. 表的操作
4.1 查看所有表(查1)
在查看表之前,我们要选择一个数据库。因为表是在库里面的
选择数据库:
语法:use 数据库名;
查看所有表:
语法:show tables;

4.2 创建表(增)
语法:
create [ temporary ] table [ if not exists ] 表名 (
列名1 数据类型 [约束] [comment '注解内容'] ,
列名2 数据类型 [约束] [comment '注解内容'] ,
……
列名N 数据类型 [约束] [comment '注解内容']
) [ engine 存储引擎 ] [ character set 字符集 ] [ collate 排序规则 ];
补充:
- 不是最后一个的列名定义,它们的后面都需要加上逗号;最后一个列名定义后面不能有逗号。
- TEMPORARY:表示创建的是⼀个临时表。
- comment:对列的描述或说明。
- 如果创建表时没有显式指定字符集、排序规则和存储引擎,那么表会继承数据库级别的设置。这里建议表的设置与数据库的设置一致,不然可能会出现乱码。(下面4.3部分有现象讲解)
示例:创建⼀个⽤⼾表,其中包含⽤⼾编号、⽤⼾名、密码、⽣⽇,并指定字符集为utf8mb4,排序规则 为utf8mb4_0900_ai_ci

创建成功后我们在图形化界面工具中可以看到:

4.3 查看表结构(查2) 、查看表的创建语句(查3)
查看表结构
语法:desc 表名;
如果没有图形化界面工具,我们在命令行界面中也能通过该语法来查看表结构:

我们发现列名栏那里怎么出现了?问号,其实这是因为表的字符集与数据库的字符集不一致导致的。
我们来查看一下两者的字符集:
查看表的创建语句
语法:show create table 表名;

当数据库使用gbk字符集,而表使用utf8mb4字符集时,MySQL在存储和读取元数据(如表名、列名)时会出现字符集不匹配,导致显示乱码。
4.4 修改表结构(改)
语法:
alter table 表名 [ alter_option ];
具体的修改操作(alter_option):
- RENAME:
- 修改表名:rename [ to | as ] 新表名
- 修改列名:rename column 旧列名 to 新列名
- ADD:
- 添加新的列成员:add [ column ] 新列列名 数据类型 [ first | after 表中的某一列 ]
- MODEIFY:
- 修改列的数据类型和约束:modify [ column ] 原列名 新数据类型 [ 新约束条件 ]
- 修改列的位置:modify [ column ] 原列名 原数据类型 [ first | after 表中的某一列 ]
说明:first的意思是把该列放到最上面(第一个位置)。
4.5 删除表(删)
语法:
drop [ temporary ] table [ if exists ] 表名1, 表名2,…,表名n;
说明:
- 对于临时表的删除,可以使用drop table;但对于非临时表的删除,不能使用drop temporary table。
- 当同时删除多个表的时候,表名之间用逗号隔开。
本次分享到次结束,感谢你的支持Thanks♪(・ω・)ノ



