一:前置登录
在登录的时候我们可能会遇到这样的一个问题

这个报错本质上是 : MySQL 的 root 用户不允许用密码从本地 TCP(127.0.0.1)登录,或者是 root 的认证方式不是 mysql_native_password,导致你输入密码也没用。
遇到的情况非常典型:
Ubuntu/Debian 系的 MySQL/MariaDB 默认把 root 设置成 auth_socket(用系统 root 身份登录,不用密码)。
理解:
你现在是"门口刷卡系统",但 root 的开门方式被设置成"刷脸"。你拿卡刷半天,系统当然说:不认识。
解决方法:
用系统 root 进入 MySQL 并修改 root 的登录方式
在进入mysql后面执行一下代码:
- 查看 root 的登录方式
cpp
SELECT user, host, plugin FROM mysql.user;

- 改成密码登录方式
把认证方式改为 mysql_native_password:
cpp
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
FLUSH PRIVILEGES;
注意:=='你的新密码'==改成你的密码
二:连接数据库
- 核心参数逻辑
连接一个网络服务,本质上需要知道 "去哪里找 " 和 "我是谁 ":
1)去哪里找:
-h (Host):指明主机 IP(默认是 127.0.0.1 本地)。
-P (Port):指明端口号(默认是 3306)。
2)我是谁:
-u (User):登录身份(目前是 root)。
-p (Password):验证密码(注意:输入时不回显,和 Linux 登录一样)。
- 完整写法:
mysql -h 127.0.0.1 -P 3306 -u root -p
- 简写习惯:因为我们是连本地且用默认端口,通常只输
mysql -u root -p
- 退出:输入 quit。
小结:连接数据库本质上是在连接一个 TCP 网络服务。如果在本地且未改端口,-h 和 -P 可以省略。记住密码输入是不回显的,这是为了安全。
三:什么是数据库
为什么要选择数据库?
我们在存储数据的时候,正常的思维因该是直接创建一个普通文件存储就行,为什么要这样操作呢?
既然数据库最终也是存为文件,为什么不直接用 Linux 的 fopen/fwrite 存个文本文件呢?
文件系统的局限性:它只提供基本的存储能力,不提供内容管理能力。
场景:给你一个 10 万行的日志,让你找 "120 开头的 IP 有多少个"。
痛苦点:如果用文件,程序员必须自己写代码去读文件、解析字符串、过滤、统计。如果需求变了(比如改成删掉这些 IP),代码得重写。
数据库的价值:它是一套数据存储的解决方案。
数据库的优点:你把需求(SQL)告诉数据库服务(mysqld),它帮你去遍历、筛选、统计,然后把结果给你。
区分 mysql 与 mysqld
mysqld (Server 端):
带 d 的通常是 Daemon(守护进程)。
它才是真正的数据库服务,它是服务端。
它在后台一直运行,监听 3306 端口,负责数据的存取和管理。
mysql (Client 端):
它只是一个客户端工具(类似于你手机上的抖音 App)。
你敲的命令通过它发送给服务端。
以后不仅仅可以用这个 CLI 工具,还可以用 C++/Java 代码或 Navicat 图形界面充当客户端。
本质关系:C/S 架构(Client / Server)。
四:数据库的本质
此次使用linux系统进行查看:
- 定位数据库目录:
通常在 /var/lib/mysql(可以通过配置文件 my.cnf 中的 datadir 查看)。
切换为 root 用户进去看看,里面是一堆文件。

注意:
想要查看这些文件,需要你是root用户或者sudo ls /var/lib/mysql,普通用户是直接查看不聊得
- 创建数据库的本质:
MySQL 端操作:执行 create database helloworld;
Linux 端现象 :在 /var/lib/mysql 下多了一个名为 helloworld 的 目录。
结论:建库 = 建目录。
- 创建表的本质:
MySQL 端操作:use helloworld; 然后 create table student (...)。
Linux 端现象:进入 helloworld 目录,发现多了几个文件(如 .frm, .ibd 等)。
结论:建表 = 建文件。
数据存储逻辑
虽然本质是文件,但这些是二进制文件。
程序员通过 SQL 告诉 mysqld 插入数据(insert into...)。
mysqld 按照特定的格式(行列式结构)把数据写入这些二进制文件中。
注意:程序员不要直接去修改这些文件,那是 mysqld 的工作。
小结:数据库在 Linux 上的物理表现非常朴素:数据库就是目录,表就是目录里的文件。但这套文件系统不由用户直接维护,而是由 mysqld 守护进程代理维护。
五:常见数据库与 MySQL 地位
MySQL:互联网公司首选。开源、生态极其丰富、能抗住百万/千万级并发,也是我们学习的重点。
Oracle:银行、金融等不差钱的复杂业务首选,服务费昂贵,极其稳定。
SQL Server:微软系。
SQLite:轻量级、嵌入式(手机App里常用)。
NoSQL (非关系型):Redis(缓存)、MongoDB(文档型)。它们通常作为 MySQL 的补充,配合使用。
六:MySQL 的整体架构
MySQL 服务端并不只是一坨代码,它内部有清晰的分层:

- 连接层(Connection Layer):
-
处理客户端的连接请求。
-
鉴权:验证用户名密码,确认你有没有权限。
- 服务层(SQL Layer):
-
大脑:接收 SQL 语句。
-
分析:词法分析、语法分析(判断你的 SQL 写对没)。
-
优化:决定怎么查最快(比如先过滤再排序)。
- 存储引擎层(Storage Engine Layer):
-
打工人:真正干活的一层。
-
插件式设计:这是 MySQL 的一大特色。你可以根据需要拔插不同的引擎。
-
它负责具体与操作系统的文件系统打交道。
七:SQL 语言分类与存储引擎
SQL 的三种分类
SQL 语句成百上千,但宏观上就三类(可以用链表的代码实现来类比):
DDL (Data Definition Language) 数据定义语言:
作用:搞结构的。建库、建表、修改表结构。
类比:写 C/C++ 时定义 struct Node 结构体,或者定义链表的头节点。
关键字:CREATE, DROP, ALTER。
DML (Data Manipulation Language) 数据操作语言:
作用:搞内容的。增删查改表里的数据。
类比:链表定义好后,进行头插、尾插、删除节点、修改节点值的操作。
关键字:INSERT, DELETE, UPDATE, SELECT。
DCL (Data Control Language) 数据控制语言:
作用:搞权限和事务的。
关键字:GRANT (授权), REVOKE (收权), COMMIT (提交)。
存储引擎 (Storage Engines)
查看命令 :show engines;

核心引擎:
InnoDB(默认):支持事务,支持行级锁,支持外键。适用于大部分互联网业务。
MyISAM:不支持事务,但在某些只读或大文本读取场景下速度快。
理解:引擎就像"插件"或"类对象",你需要什么特性,底层就实例化哪个对象来帮你管理文件。绝大多数情况用默认的 InnoDB 即可。
小结 架构理解要分层:上层管连接和安检,中层管翻译和指挥,下层(存储引擎)管搬砖。SQL 语句按功能分为定义结构(DDL)、操作数据(DML)和控制权限(DCL)。
总结
