MySQL知识点综合详解_01
一、数据库基础概念
1.1 什么是数据库?
通俗理解:数据库是一个超级智能的电子文件柜,按照特定规则存储和管理数据,便于长期保存和快速查找。
想象一下你有一个通讯录,里面记录了1000个朋友的姓名、电话、地址。如果用一个普通的Word文档记录,每次找一个人可能要翻半天;但用数据库,只需输入一句查询,一秒钟就能找到。
技术定义:数据库是按照数据结构来组织、存储和管理数据的仓库,建立在文件系统之上。数据库不仅保存数据本身,还保存数据之间的关系。
**举个生活化的例子:
一家电商网站的所有商品信息、订单信息、用户信息都存储在数据库中
你在淘宝搜索"手机"时,数据库瞬间从数百万商品中筛选出相关结果
你下单后,数据库同时更新库存、生成订单记录、扣减余额——这一系列操作由数据库统一管理
1.2 数据库解决的核心问题
| 问题场景 | 传统方式(文件/Excel) | 数据库方式 |
|---|---|---|
| 多人同时修改 | 容易冲突、数据错乱 | 并发控制,保证数据一致性 |
| 数据安全 | 文件丢失就没了 | 备份机制、权限控制 |
| 数据量很大 | 打开慢、行数有限 | 高效索引,支持海量数据 |
| 复杂查询 | 手动筛选、计算 | SQL语句一键完成 |
详细举例说明:
场景1:多人同时修改(并发控制)
假设一家公司有一个Excel文件记录员工工资表,放在共享文件夹中。
传统方式:A和B同时打开文件,A修改了张三的工资从8000→9000,B修改了李四的工资从7000→7500。A先保存,B后保存,结果A的修改被B的旧版本覆盖了。
数据库方式:A和B可以同时操作数据库,数据库通过行级锁定机制保证两人的修改都能正确保存,互不冲突。
-- A执行 UPDATE employees SET salary = 9000 WHERE name = '张三'; -- B执行 UPDATE employees SET salary = 7500 WHERE name = '李四'; -- 两条语句独立执行,互不影响
场景2:数据安全
传统方式:硬盘坏了或误删文件,数据就没了。
数据库方式:可以定期备份(Backup),即使服务器出问题,可以从备份恢复(Restore)。
# 数据库备份命令示例 mysqldump -uroot -p my_db > backup_20260605.sql # 数据库恢复命令示例 mysql -uroot -p my_db < backup_20260605.sql
场景3:数据量很大
传统方式:Excel超过100万行数据打开极慢,甚至无法打开。
数据库方式:MySQL可以轻松处理上千万甚至上亿条记录,通过索引快速定位。
-- 从1000万条记录中查找,有索引的查询只需毫秒级响应 SELECT * FROM orders WHERE order_id = '2026060500123;
场景4:复杂查询
传统方式:需要手动筛选、排序、计算,耗时耗力。
数据库方式:一条SQL语句完成复杂的筛选、分组、聚合、排序。
-- 查询2026年5月,每个部门工资总额,按总额降序 SELECT department, SUM(salary) AS total_salary FROM employees WHERE hire_date >= '2026-05-01' GROUP BY department ORDER BY total_salary DESC;
1.3 数据库的四大核心操作(CRUD)
CRUD是数据库的四种基本操作,几乎所有业务系统都围绕这四个操作构建。
**假设我们有一张学生表students:
| id | name | age | gender |
|---|---|---|---|
| 1 | 张三 | 20 | 男 |
| 2 | 李四 | 21 | 男 |
Create(创建):新增一条数据
-- 新增一个学生 INSERT INTO students (id, name, age, gender) VALUES (3, '王五', 19, '女');
操作后表中多了一行:
| id | name | age | gender |
|---|---|---|---|
| 1 | 张三 | 20 | 男 |
| 2 | 李四 | 21 | 男 |
| 3 | 王五 | 19 | 女 |
Read(读取):查询已有数据
-- 查看所有学生 SELECT * FROM students; -- 只看年龄大于20的学生 SELECT * FROM students WHERE age > 20;
查询结果:
| id | name | age | gender |
|---|---|---|---|
| 2 | 李四 | 21 | 男 |
Update(更新):修改已有数据
-- 将张三的年龄改为21岁 UPDATE students SET age = 21 WHERE id = 1;
操作后:
| id | name | age | gender |
|---|---|---|---|
| 1 | 张三 | 21 | 男 |
| 2 | 李四 | 21 | 男 |
| 3 | 王五 | 19 | 女 |
Delete(删除):移除不需要的数据
-- 删除王五的记录 DELETE FROM students WHERE id = 3;
操作后:
| id | name | age | gender |
|---|---|---|---|
| 1 | 张三 | 21 | 男 |
| 2 | 李四 | 21 | 男 |
**生活化的CRUD场景举例(电商下单流程):
-- 1. Create:用户注册 → 新增订单 INSERT INTO orders (order_id, user_id, product_id, amount) VALUES ('20260605001', 1001, 5001, 299.00); -- 2. Read:用户查看订单列表 SELECT * FROM orders WHERE user_id = 1001; -- 3. Update:用户修改收货地址 UPDATE orders SET address = '北京市朝阳区XX路' WHERE order_id = '20260605001'; -- 4. Delete:用户取消订单(通常是逻辑删除,实际不常用软删除 -- UPDATE orders SET status = 'cancelled' WHERE order_id = '20260605001';1.4 数据库分类
关系型数据库(SQL)
数据以二维表格形式存储(类似Excel)
表与表之间可建立关联关系
必须遵守ACID特性,保证数据一致性
常见产品:MySQL、Oracle、SQL Server、SQLite
关系型数据库的表格示例:
students学生表:
| id | name | class_id |
|---|---|---|
| 1 | 张三 | 1 |
| 2 | 李四 | 2 |
classes班级表:
| id | name | teacher |
|---|---|---|
| 1 | 高三(1)班 | 王老师 |
| 2 | 高三(2)班 | 李老师 |
两张表通过class_id关联,可以通过JOIN查询:
SELECT s.name AS student_name, c.name AS class_name FROM students s JOIN classes c ON s.class_id = c.id;
查询结果:
| student_name | class_name |
|---|---|
| 张三 | 高三(1)班 |
| 李四 | 高三(2)班 |
非关系型数据库(NoSQL)
不强制使用表格结构,数据模型更灵活
常见形态:Key-Value、文档型、列式等
常见产品:Redis(缓存)、MongoDB(文档)、HBase(列式)
Key-Value数据库(Redis)示例:
SET user:1001:name "张三" SET user:1001:age 20 GET user:1001:name → "张三"
文档型数据库(MongoDB)示例:
// 一条文档记录,结构灵活,可嵌套 { "_id": "abc123", "name": "张三", "age": 20, "contacts": [ { "type": "phone", "value": "13800138000" }, { "type": "email", "value": "zhangsan@example.com" } ] }关系型 vs 非关系型对比:
| 维度 | 关系型数据库 | 非关系型数据库 |
|---|---|---|
| 数据结构 | 固定表格,行列严格 | 灵活多变,结构自由 |
| 查询语言 | SQL(结构化查询) | 各自的查询语言 |
| 事务支持 | 完善,ACID | 部分支持,较弱 |
| 扩展性 | 垂直扩展(升级硬件) | 水平扩展(加机器) |
| 适用场景 | 业务系统、金融、银行 | 缓存、日志、社交、大数据 |
1.5 DB、DBMS、SQL的关系
| 术语 | 全称 | 说明 |
|---|---|---|
| DB | Database | 数据库,存储数据的仓库 |
| DBMS | Database Management System | 数据库管理系统,操作数据库的软件 |
| SQL | Structured Query Language | 结构化查询语言,与数据库通信的语言 |
三者关系示意图:
用户(你) ↓ 用SQL语言说话 SQL 语句:"SELECT * FROM students;" ↓ DBMS(MySQL软件) ← 翻译SQL ↓ 操作 DB(实际存储的数据文件) ↓ 返回 查询结果表格
生活化类比:
DB就像图书馆,存放所有书籍(数据)
DBMS就像图书管理员,负责帮你找书、整理书籍
SQL就像你跟管理员说的话:"请帮我找计算机类的所有图书"
具体到MySQL中三者的体现:
你在命令行输入: mysql> SELECT name, age FROM students WHERE age > 20; ↓ DBMS(MySQL Server)解析SQL,找到数据文件 ↓ 结果: +------+-----+ | name | age | +------+-----+ | 李四 | 21 | +------+-----+
二、MySQL数据库介绍
2.1 MySQL的特点
✅开源免费:社区版完全免费,适合个人学习和中小企业 ✅功能强大:支持上千万条记录的大型数据库 ✅标准SQL:使用通用SQL语言,易于学习和迁移 ✅跨平台:支持Windows、Linux、Mac等操作系统 ✅多语言支持:Python、Java、C++等都有客户端驱动
特点详细说明与举例:
开源免费MySQL Community Server 是完全开源免费的,任何人都可以下载使用,无需支付授权费用。这使得它成为个人开发者、初创公司和中小企业的首选。相比之下,Oracle 数据库的企业版授权费用可能高达数十万元。
对比: - MySQL社区版:¥0,功能完整,适合学习和小型项目 - Oracle企业版:¥100万+/年,功能超强,适合大型企业
功能强大MySQL 能够处理大型数据集,支持复杂查询、事务、存储过程、触发器、视图、开窗函数等高级特性。
-- 举例:复杂查询 SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary, RANK() OVER(ORDER BY AVG(salary) DESC) AS rank_num FROM employees GROUP BY department HAVING COUNT(*) > 5 ORDER BY avg_salary DESC;
标准SQLMySQL 遵循 ANSI SQL 标准,你在 MySQL 中学到的知识可以轻松迁移到 Oracle、SQL Server 等其他关系型数据库。
-- 标准SQL语句(在任何主流关系数据库都能运行) SELECT name, age FROM students WHERE age > 20;
跨平台MySQL 可以在 Windows、Linux、MacOS 等多种操作系统上运行。你的数据库在 Windows 开发环境写的应用部署到 Linux 服务器上几乎不需要修改。
多语言支持几乎所有主流编程语言都有 MySQL 的驱动程序:
# Python 使用 pymysql 连接 MySQL import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', database='my_db') cursor = conn.cursor() cursor.execute("SELECT * FROM students") results = cursor.fetchall()// Java 使用 JDBC 连接 MySQL Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/my_db", "root", "123456"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM students");2.2 版本选择
推荐:MySQL 8.0 社区版(MySQL Community Server)
企业版:需付费,提供官方技术支持(学习用社区版足够)
MySQL 版本历史简要说明:
| 版本 | 发布时间 | 主要特性 |
|---|---|---|
| MySQL 5.6 | 2013年 | 全文搜索、性能优化 |
| MySQL 5.7 | 2015年 | JSON支持、优化器改进 |
| MySQL 8.0 | 2018年 | 窗口函数、CTE、更好的字符集(utf8mb4) |
| MySQL 8.4 | 2024年 | LTS版本,性能持续优化 |
为什么推荐 8.0?
支持窗口函数(Window Functions):可以很方便地实现排名、分组计算等功能
支持通用表表达式(CTE):可以编写更易读的复杂查询
默认字符集 utf8mb4:完美支持 emoji 和各种生僻字
性能显著提升:查询速度比 5.7 快数倍
-- MySQL 8.0 新增的窗口函数示例(5.7及之前版本不支持) SELECT name, score, RANK() OVER(ORDER BY score DESC) AS rank_num FROM students;
2.3 常用数据库产品对比
| 数据库 | 厂商 | 类型 | 特点 | 应用场景 |
|---|---|---|---|---|
| MySQL | Oracle | 关系型 | 开源免费,功能强大 | Web应用、企业管理系统 |
| Oracle | Oracle | 关系型 | 大型收费,稳定可靠 | 银行、金融系统 |
| SQL Server | Microsoft | 关系型 | Windows平台常用 | .NET开发项目 |
| SQLite | D. Richard Hipp | 关系型 | 轻量级嵌入式 | 手机App、小型工具 |
| Redis | Redis Labs | 非关系型 | 内存缓存,速度极快 | 缓存、会话管理 |
| MongoDB | MongoDB Inc | 非关系型 | 文档型,灵活 | 大数据、日志存储 |
各数据库典型应用举例:
MySQL— 中小电商网站的产品库
CREATE TABLE products ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(200) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0 );
Oracle— 银行核心交易系统(需要极高的稳定性和安全性)
SQL Server— .NET 企业应用,配合微软生态系统使用
SQLite— 手机App中的本地数据库(如微信的聊天记录、手机游戏存档)
Redis— 电商秒杀库存缓存
SET product:1001:stock 100 # 设置商品库存 DECR product:1001:stock # 下单时扣减库存,原子操作
MongoDB— 存储用户评论(结构灵活,可嵌套)
{ "user": "张三", "content": "这本书很好", "replies": [ {"user": "李四", "content": "我同意"}, {"user": "王五", "content": "我觉得一般"} ] }三、MySQL安装与配置
3.1 验证安装
打开命令提示符或PowerShell:
mysql --version
成功输出示例:
mysql Ver 8.0.45 for Win64 on x86_64 (MySQL Community Server - GPL)
如果未安装,提示信息说明:
# Windows提示: 'mysql' 不是内部或外部命令,也不是可运行的程序
这时你需要去 MySQL 官网下载安装包(https://dev.mysql.com/downloads/mysql/),选择适合你的操作系统的版本。
Windows安装步骤简要说明:
下载 MySQL Installer for Windows
选择 "Developer Default"(开发默认)或 "Server only"(仅服务器)
按照安装向导完成安装
设置 root 密码(务必记住)
配置端口(默认3306)
选择 "Configure MySQL Server as a Windows Service"
3.2 配置环境变量
目的:让系统能直接找到mysql命令
如果不配置环境变量,每次使用 mysql 命令需要写完整路径:
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -uroot -p
配置环境变量后可以直接:
mysql -uroot -p
详细步骤(Windows):
找到MySQL的
bin目录,默认路径:C:\Program Files\MySQL\MySQL Server 8.0\bin右键点击「此电脑」→「属性」→「高级系统设置」→「环境变量」
在「系统变量」中找到
Path,点击「编辑」点击「新建」,将MySQL的
bin目录路径粘贴进去一路点击「确定」保存
关闭旧终端,重新打开新终端,输入
mysql --version验证
常见问题排查:
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 提示找不到mysql命令 | 环境变量未正确配置 | 检查路径是否正确,重启终端 |
| Access denied for user 'root'@'localhost' | 密码错误 | 使用正确的密码登录 |
| Can't connect to MySQL server | MySQL服务未启动 | 在服务中启动MySQL服务 |
3.3 登录MySQL
# 方式1:交互式输入密码(推荐,安全) mysql -uroot -p # 方式2:指定主机地址(远程连接) mysql -uroot -p -h 127.0.0.1 # 方式3:完整参数写法 mysql --user=root --password --host=127.0.0.1
成功登录后显示:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.45 MySQL Community Server - GPL Copyright (c) 2000, 2024, 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>
看到mysql>提示符表示已成功连接。
退出MySQL命令:
exit; -- 或 quit; -- 或 \q
参数说明:
-u:用户名(user),如root、admin-p:密码(password),不直接跟密码更安全。如果硬写密码如-p123456,密码会保存在历史记录中,有风险-h:主机地址(host),127.0.0.1或localhost表示本机,远程连接写服务器IP-P:端口号(Port),默认3306,大写P
完整参数示例:
# 连接远程数据库 mysql -u admin -p -h 192.168.1.100 -P 3306 # 连接后直接进入某个数据库 mysql -uroot -p my_db
登录后的常用初始命令:
-- 查看当前用户 SELECT USER(); -- 查看当前数据库 SELECT DATABASE(); -- 查看所有数据库 SHOW DATABASES; -- 查看MySQL版本 SELECT VERSION();
四、SQL语句基础
4.1 SQL语句分类
| 分类 | 简称 | 作用 | 关键字 |
|---|---|---|---|
| 数据定义语言 | DDL | 创建/修改/删除数据库对象 | CREATE, ALTER, DROP |
| 数据操作语言 | DML | 增删改表中数据 | INSERT, UPDATE, DELETE |
| 数据查询语言 | DQL | 查询表中数据 | SELECT |
| 数据控制语言 | DCL | 管理用户权限和事务 | GRANT, REVOKE, COMMIT, ROLLBACK |
各类语句详细举例说明:
DDL(Data Definition Language)—— 定义数据结构DDL操作的对象是「数据库对象」(表、索引、视图等),不是数据本身。DDL语句执行后立即生效,不可回滚。
-- 创建表 CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 修改表结构 ALTER TABLE employees ADD COLUMN salary DECIMAL(10,2); -- 删除表 DROP TABLE employees;
类比:DDL就像盖房子,先画图纸(设计表结构),盖房子(创建表),装修(修改表结构),拆房(删除表)。
DML(Data Manipulation Language)—— 操作数据DML操作的对象是表中的数据行。可以通过事务控制回滚。
-- 插入数据 INSERT INTO employees (id, name, salary) VALUES (1, '张三', 8000); -- 更新数据 UPDATE employees SET salary = 9000 WHERE id = 1; -- 删除数据 DELETE FROM employees WHERE id = 1;
类比:DML就像日常往房子里搬家具(INSERT)、挪家具(UPDATE)、扔家具(DELETE)。
DQL(Data Query Language)—— 查询数据DQL只有一个核心关键字:SELECT。用来从数据库中读取数据,不修改数据。
-- 最简单的查询 SELECT * FROM employees; -- 带条件的查询 SELECT name, salary FROM employees WHERE salary > 8000; -- 排序分组查询 SELECT name, salary FROM employees WHERE salary > 8000 ORDER BY salary DESC LIMIT 10;
DCL(Data Control Language)—— 控制权限和事务管理谁能访问什么数据,以及事务的提交和回滚。
-- 创建用户 CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password123'; -- 授予权限 GRANT SELECT, INSERT ON my_db.* TO 'app_user'@'localhost'; -- 回收权限 REVOKE INSERT ON my_db.* FROM 'app_user'@'localhost'; -- 事务控制 START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;
四类语句记忆口诀:
DDL:定义对象 —— CREATE, ALTER, DROP
DML:操作数据 —— INSERT, UPDATE, DELETE
DQL:查询数据 —— SELECT
DCL:控制权限 —— GRANT, REVOKE, COMMIT, ROLLBACK
4.2 SQL语法规范
分号结尾:每条SQL语句以
;结束关键字大写:建议关键字大写(如SELECT、FROM)
空格缩进:可换行和缩进增强可读性
注释方式:
-- 单行注释 /* 多行注释 */ # MySQL特有单行注释
规范详细说明与举例:
1. 分号结尾在MySQL中,分号是语句结束的标志。不写分号MySQL会认为语句还没写完,继续等待输入。
-- 正确写法 SELECT * FROM students; -- 不写分号的后果(MySQL会等待你继续输入) mysql> SELECT * FROM students -> -- 此时需要补一个分号或者按Ctrl+C取消
在MySQL客户端中,可以使用DELIMITER临时改变结束符(常用于存储过程):
DELIMITER // CREATE PROCEDURE GetStudents() BEGIN SELECT * FROM students; END // DELIMITER ;
2. 关键字大写虽然SQL不区分大小写,但约定俗成关键字大写,表名列名小写,使代码更易读。
-- 推荐写法(关键字大写) SELECT id, name, age FROM students WHERE age > 20 ORDER BY age DESC; -- 不推荐写法(全小写,可读性差) select id, name, age from students where age > 20 order by age desc; -- 也不推荐(关键字和表名列名混写) SELECT ID, NAME, AGE FROM STUDENTS WHERE AGE > 20;
3. 空格与缩进复杂查询建议换行和缩进,清晰表达层级关系。
-- 推荐写法(缩进对齐) SELECT s.name, c.name AS class_name, AVG(sc.score) AS avg_score FROM students s INNER JOIN classes c ON s.class_id = c.id LEFT JOIN scores sc ON sc.student_id = s.id WHERE s.age >= 18 AND c.name LIKE '高三%' GROUP BY s.name, c.name HAVING avg_score >= 80 ORDER BY avg_score DESC LIMIT 10; -- 不推荐写法(一行到底) SELECT s.name, c.name AS class_name, AVG(sc.score) AS avg_score FROM students s INNER JOIN classes c ON s.class_id = c.id LEFT JOIN scores sc ON sc.student_id = s.id WHERE s.age >= 18 AND c.name LIKE '高三%' GROUP BY s.name, c.name HAVING avg_score >= 80 ORDER BY avg_score DESC LIMIT 10;
4. 注释方式注释不会被执行,用于解释代码逻辑。
-- 这是单行注释,从--开始到行尾 SELECT name FROM students; -- 也可以写在语句后面 /* 这是多行注释 可以写多行内容 常用于注释掉一大段代码 */ SELECT id, name FROM students; # MySQL特有的单行注释(不推荐跨数据库使用) SELECT * FROM students;
注释的实际应用场景:
-- 2026-06-05,统计各班级人数,用于月报 SELECT class_id, COUNT(*) FROM students GROUP BY class_id; /* 以下语句用于数据修复 UPDATE students SET status = 'active' WHERE created_at < '2026-01-01'; 暂时注释掉,等确认后再执行 */
MySQL中的一些特殊规则:
数据库名、表名、列名可以用反引号
`包裹,避免与关键字冲突字符串用单引号
'或双引号"包裹,推荐使用单引号
