MySQL(一)
1|0一、概述
1、什么是数据库 ?
答:数据的仓库。
2、什么是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ?
答:他们均是一个软件,都有两个主要的功能:
- a. 将数据保存到文件或内存
- b. 接收特定的命令,然后对文件进行相应的操作
PS:如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数据库管理系统(DBMS,Database Management System)
3、什么是SQL ?
答:上述提到MySQL等软件可以接受命令,并做出相应的操作,由于命令中可以包含删除文件、获取文件内容等众多操作,对于编写的命令就是是SQL语句。SQ,是结构化语言(Structured Query Language)的缩写,SQL是一种专门用来与数据库通信的语言。
2|0二、下载安装
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
想要使用MySQL来存储并操作数据,则需要做几件事情:
- 安装MySQL服务端
- 安装MySQL客户端
- 【客户端】连接【服务端】
- 【客户端】发送命令给【服务端MySQL】服务的接受命令并执行相应操作(增删改查等)
2|1Window版本
1、下载
2、解压
如果想要让MySQL安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-8.0.11-winx64
3、初始化
MySQL解压后的 bin 目录下有一大堆的可执行文件,执行如下命令初始化数据:(第一步先进入 bin 目录下,如果已经加了环境变量,则可以直接下面一行。)
初始化之后,C:\mysql-8.0.11-winx64 目录下会多出一个 data 目录。如果没有data则自己手动创建一个。
4、启动MySQL服务
执行命令从而启动MySQL服务。
此时会hang住,就是光标会停留在下面一行不停闪烁。如果要启动客户端,则需要打开另一个 cmd 命令提示符。(之后有解决方法。第5步方法b)
5、启动MySQL客户端并连接MySQL服务
由于初始化时使用的【mysqld --initialize-insecure】命令,其默认未给root账户设置密码。
到此为止,MySQL服务端已经安装成功并且客户端已经可以连接上,以后再操作MySQL时,只需要重复上述4、5步骤即可。但是,在4、5步骤中重复的进入可执行文件目录比较繁琐,如想日后操作简便,可以做如下操作。
a. 添加环境变量
将MySQL可执行文件添加到环境变量中,从而执行执行命令即可。
如此一来,以后再启动服务并连接时,仅需:
b. 将MySQL服务制作成windows服务,需要用管理员权限操作
上一步解决了一些问题,但不够彻底,因为在执行【mysqd】启动MySQL服务器时,当前终端会被hang住,那么做一下设置即可解决此问题:
注册成服务之后,以后再启动和关闭MySQL服务时,仅需执行如下命令:
2|2linux版本
一、安装yum repo
1、由于centos的yum源中没有mysql,需要到mysql的官网中下载yuum repo配置文件。
https://dev.mysql.com/downloads/repo/yum/
2、然后进行安装
执行完成后会在/etc/yum.repos.d/目录下生成两个repo文件mysql-community.repo mysql-community-source.repo
二、使用yum命令即可完成安装
注意:必须进入到 /etc/yum.repos.d/目录后再执行以下脚本
1、安装命令
报错
大致意思就是MySQL的GPG升级了,需要更新,如果是新安装的MySQL,执行以下脚本即可:
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
2、启动mysql
3、获取安装时的临时密码
4、如果没有获取到临时密码,先删除原来安装过的mysql残留的数据
再次启动
三、登录
四、修改密码
然后执行 mysql -uroot -p
,输入上面的到的密码进入,用该密码登录后,必须马上修改新的密码,不然会报如下错误:
如果你想要设置一个简单的测试密码的话,比如设置为123456,会提示这个错误,报错的意思就是你的密码不符合要求
这个其实与validate_password_policy的值有关。
validate_password_policy有以下取值:
默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。
有时候,只是为了自己测试,不想密码设置得那么复杂,譬如说,我只想设置root的密码为123456。
必须修改两个全局参数:
首先,修改validate_password_policy参数的值
validate_password_length(密码长度)参数默认为8,我们修改为1
完成之后再次执行修改密码语句即可成功
5.7 版本的话,alter不生效,会报错
五、非localhost远程登录
最后注意刷新
六、赋予所有权限
还不行的话检查服务器 端口是否开放:telnet ip port
七、其他配置
1、设置安全选项:
2、关闭MySQL
3、重启MySQL
4、查看MySQL运行状态
5、设置开机启动
6、关闭开机启动
7、配置默认编码为utf8:
其他默认配置文件路径:
-
3|0三、数据库操作
3|11、显示数据库
默认数据库:
mysql - 用户权限相关数据
test - 用于用户测试数据
information_schema - MySQL本身架构相关数据
3|22、创建数据库
create database test:创建一个名为“test”的数据库;
default charset utf8:设置数据库的字符集编码默认为utf8mb4,是utf8mb4而不是utf-8;
collate utf8_general_ci:数据库的校验规则,ci是case insensitive的缩写,意思是大小写不敏感;相对的是cs,即case sensitive,大小写敏感;还有一种是utf8_bin,是将字符串中的每一个字符用二进制数据存储,区分大小写。
utf8和utf8mb4的区别
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等(utf8的缺点)。
3|33、删除数据库
3|44、使用数据库
功能就是切换到那个数据库。之后再操作,比如显示当前使用的数据库中所有表:show tables;显示的就是这个数据库中的表格。
3|55、用户管理
用户名在mysql数据库中的user表,中有user列、host列是主机,比如localhost或者IP。
如果本地用户,IP地址处填写 “ localhost ” 。
显示用户:(用 root 权限)
3|66、授权管理

特殊的:
4|0四、数据表基本
4|11、创建表
-
-
-
普通索引
1、创建索引
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
2、修改表结构(添加索引)
3、创建表的时候指定
4、删除
5、查看
唯一索引(主键不能为空,唯一索引可以为空)
1、创建索引
2、修改表结构(添加索引)
3、创建表的时候指定
-
4|22、删除表
4|33、清空表
4|44、修改表
mysql每新建一个连接,就会自动生成一些库,其中一个库叫做information_schema,这个库里有张表叫做table_constraints。这张表记录了连接里的所有约束信息。比如是否是主键约束,外键约束,唯一性约束,约束名,表名等信息。还有张表叫key_column_usage,他记录了每个表字段的信息,包括了这个字段是否是外键,对应那张表的主键。也就是说,想查看是否有某外键约束,可以去table_constraint查,如果想查看该外键的具体信息,就去key_column_usage表查,比如你想查homework表参考user表的外键信息,可以用以下sql语句查询。
select * from information_schema.key_column_usage where REFERENCED_TABLE_NAME='teacher' and table_name='course';
外键的名字 constraint_name - fk_从表_主表
从表名字 table_name
从表添加外键的列 column_name
主表的名字 referenced_table_name
主表的主键字段 referenced_column_name
SELECT
table_name,
column_name,
referenced_table_name,
referenced_column_name,
constraint_name
FROM
information_schema.key_column_usage
WHERE
REFERENCED_TABLE_NAME = 'teacher'
AND table_name = 'course';
外键的变种
主键、外键和索引的区别?
主键 | 外键 | 索引 | |
定义 | 唯一标识一条记录,不能有重复的,不允许为空 | 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 | 该字段没有重复值,但可以有一个空值 |
作用 | 用来保证数据完整性 | 用来和其他表建立联系用的 | 是提高查询排序的速度 |
个数 | 主键只能有一个 | 一个表可以有多个外键 | 一个表可以有多个索引 |
外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
阻止执行:
1、从表插入新行,其外键值不是主表的主键值便阻止插入;
2、从表修改外键值,新值不是主表的主键值便阻止修改;
3、主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
4、主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行:
1、主表删除行,连带从表的相关行一起删除;
2、主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
扩展资料:
外键使用原则:
1、 为关联字段创建外键。
2、 所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。
4|55、基本数据类型
MySQL的数据类型大致分为:数值、时间和字符串。
二进制数据:TinyBlob、Blob、MediumBlob、LongBlob
如果数据太大,就直接存文件,然后在数据库里保存文件的url
更多参考:
- http://www.runoob.com/mysql/mysql-data-types.html
- http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html
那么,这个M值到底代表什么意思呢?
到这里,我们已经可以发现,M值即使设置为1,它也可以存入字符长度大于1的值,那么,如果存入的字符长度小于1会怎么样?我们来试一试:
先将id1的类型更改为int(2),然后插入数据id1=1:
我们查询一下表中的数据,看看结果具体如何:
接下来,我们再修改一下id1的填充数据类型zerofill(表示用0填充),这里先知道如何操作即可,我们再从结果得出结论:
现在是不是有些清楚了。我们设置的M值是2,没有设置zerofill用0填充时,对于操作没有任何影响,而设置了zerofill后,我们可以清楚地看到值1字符数不足M值,左前位置补0。我们也可以将M值设置成别的大小进行多次测试,这里就不进行测试了。
需要强调的是,不同的数据类型中的M值意义是不一样的,我们这里仅讨论整型中的M值。
从上面我们可以得到如下的结论:
1、整数型的数值类型已经限制了取值范围,有符号整型和无符号整型都有,而M值并不代表可以存储的数值字符长度,它代表的是数据在显示时显示的最小长度;
2、当存储的字符长度超过M值时,没有任何的影响,只要不超过数值类型限制的范围;
3、当存储的字符长度小于M值时,只有在设置了zerofill用0来填充,才能够看到效果,换句话就是说,没有zerofill,M值就是无用的。
总结:int(11),tinyint(1),bigint(20),后面的数字,不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill。
所以我们在设计mysql数据库时,建表时,mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
所以,就用这些默认的显示长度就可以了。不用再去自己填长度,比如搞个int(10)、tinyint(1)之类的,基本没用。而且导致表的字段类型多样化。
5|0五、表内容操作
5|11、增
5|22、删
5|33、改
5|44、查
5|55、其他
5|66、联合
5|77、数据库备份
导出现有数据库数据:
导入现有数据库数据:
5|88、备注
5|99、auto_increment
1.一般数据表的id都是设置成auto_increment的,所以当插入一条记录后,可以使用下面的命令来获取最新插入记录的id值
注意:1. 必须是在使用Insert语句后,紧接着使用select last_insert_id()才有效,在没有使用过Insert语句的情况下,查询返回的结果为0;
2.如果在同一条Insert语句插入多条记录,返回的结果是第一条记录对于的id
2. 为什么不直接使用
因为:如果手动删除了最新的数据,使用 max(id)查询的结果是当前剩下数据中最大的记录,
而新插入数据则不一定从这个数字开始计数。
3. 所以为了准确的获取下一条插入记录的id,应该查询的是auto_increment, 对应的SQL语句如下:
注意:auto_increment返回的是下一条插入记录的id值,而不是当前的最大id值
4、修改 auto_increment
6|0一些归纳
导出现有数据库数据:
- mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 # 结构+数据
- mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径 # 结构
导入现有数据库数据:
- mysqldump -uroot -p密码 数据库名称 < 文件路径
7|0针对navicat无法连接问题。
原因是因为新版 MySQL8 默认采用了caching_sha2_password验证方式。和旧版不一样,和navicat默认的验证方式也不一样。
1、进入CMD命令符窗口(win+R)
2、进入mysql安装目录的bin路径下运行mysql -uroot -p命令进行登录(密码是安装mysql时设置的密码)
3、输入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';(root是用户名,localhost是ip地址127.0.0.1都是特指本机,mysql_native_password是旧的密码验证机制,password是密码,最后别忘了分号;)
4、进入Navicat测试连接
Navicat 快捷键
https://www.cnblogs.com/457248499-qq-com/p/7449492.html
1、ctrl + Q ,新建查询
2、ctrl + / ,注释行
3、shift + ctrl + / ,取消注释行
4、CTRL+R ,运行
5、SHIFT+CTRL+R,运行已经选择的
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/9110234.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!