MySql数据库基础知识点整理
数据库理论基础
-
核心概念
-
数据:描述事物的符号记录(如文本、数值、图像),需数字化后存储。
-
数据库(DB):结构化数据仓库,由
数据库管理系统(DBMS)
统一管理,核心特点:
-
结构化:数据按预设模型组织(如二维表)。
-
高共享性:多用户 / 应用可同时访问同一数据。
-
低冗余度:避免数据重复存储,减少不一致风险。
-
易扩充性:可按需新增表 / 字段,不影响现有应用。
-
高独立性:含物理独立性(存储路径 / 格式变化不影响应用)和逻辑独立性(表结构调整可通过视图隔离)。
-
-
数据库系统(DBS):由数据、DB、DBMS、应用程序、用户组成的完整体系。
-
-
数据库管理系统 (DBMS)
-
定义:管理数据库的核心软件,负责数据的存储、安全、一致性、并发控制、故障恢复和访问接口。
-
核心组件:
-
数据字典:存储元数据(如表结构、字段类型、索引信息)。
-
查询处理器:解析、优化 SQL 语句(如执行计划生成)。
-
存储管理器:管理数据存储(如缓存、磁盘 I/O)。
-
-
支持的数据模型:
模型类型 结构特点 优点 缺点 代表产品 层次模型 树形结构(父 - 子关系) 适合层级数据(如部门) 多对多关系难实现 IBM IMS 网状模型 图形结构(多对多) 支持复杂关系 结构复杂,维护困难 CODASYL 关系模型 二维表(行 = 记录,列 = 字段) 简洁直观,支持 SQL 大数据场景性能有限 MySQL、Oracle、SQL Server 面向对象模型 以对象为核心(含属性 / 方法) 适合复杂数据(如 GIS) 兼容性差,学习成本高 ObjectDB
-
-
常见数据库分类
-
关系型数据库(RDBMS):基于关系模型,依赖 SQL,支持事务 ACID,适合结构化数据存储(如用户信息、订单)。
-
代表:MySQL、Oracle、SQL Server、PostgreSQL。
-
-
非关系型数据库(NoSQL):不依赖关系模型,适合非结构化 / 半结构化数据、高并发场景。
类型 特点 代表产品 适用场景 键值存储 以 “key-value” 存储,高效读写 Redis、Memcached 缓存、会话存储、计数器 文档存储 存储 JSON/BSON 格式文档 MongoDB 内容管理(如博客、商品描述) 列族存储 按列存储,适合批量查询 HBase、Cassandra 大数据分析(如日志、时序数据) 图形数据库 存储节点与关系(图结构) Neo4j、NebulaGraph 社交网络、路径分析(如好友推荐)
-
MySQL 简介
-
发展历程
-
1995 年:瑞典 MySQL AB 公司发布首个稳定版。
-
2008 年:Sun 公司收购 MySQL AB。
-
2009 年:Oracle 收购 Sun,接管 MySQL 版权。
-
现状:社区版(开源免费)与企业版(付费支持)并行,MySQL 8.0 为当前主流版本(支持 UTF8mb4、窗口函数、CTE 等)。
-
-
核心特性
-
跨平台:支持 Windows、Linux、macOS 等。
-
多语言 API:支持 Python、Java、PHP、C++ 等。
-
性能优化:多线程模型、查询缓存(MySQL 8.0 移除,推荐用 Redis)、索引优化。
-
安全特性:支持 SSL 加密、用户权限控制、数据脱敏。
-
编码支持:默认 UTF8mb4(兼容 emoji 和所有 Unicode 字符)。
-
可扩展性:支持主从复制、读写分离、分库分表(如 ShardingSphere)。
-
-
应用场景
-
互联网 Web:用户系统、订单系统、内容管理(如博客、电商)。
-
数据仓库:日志存储、离线分析(搭配 Hadoop)。
-
嵌入式系统:轻量级场景(如物联网设备数据存储)。
-
代表用户:Google、腾讯、百度、阿里巴巴、Facebook。
-
-
架构组成(四层架构)
架构层级 核心功能 网络连接层 处理客户端 TCP 连接,管理连接池(避免频繁创建 / 销毁线程),支持 SSL 加密。 数据库服务层 核心逻辑层:SQL 接口(接收 SQL 语句)、解析器(语法校验)、优化器(生成最优执行计划)、缓存(MySQL 8.0 前的 Query Cache)。 存储引擎层 可插拔设计,负责数据的实际存储与读取,常用引擎:InnoDB(默认)、MyISAM。 系统文件层 存储物理文件: - 数据文件(.ibd:InnoDB 数据 + 索引;.MYD:MyISAM 数据) - 日志文件(binlog:二进制日志;redo log:重做日志;undo log:回滚日志) - 配置文件(my.ini/my.cnf)
MySQL 安装部署
-
版本类型
-
社区版(Community Server):开源免费,适合个人 / 中小企业,无官方技术支持。
-
企业版(Enterprise Edition):付费,含官方技术支持、备份工具(MySQL Enterprise Backup)、监控工具(MySQL Enterprise Monitor)。
-
集群版(MySQL Cluster):开源免费,基于 NDB 存储引擎,支持高可用(多节点冗余)。
-
-
安装方式(分平台)
(1)Windows 安装
安装格式 步骤 注意事项 MSI 格式 1. 下载 MSI 安装包(MySQL 官网) 2. 选择 “Server Only” 或 “Full” 3. 配置端口(默认 3306,需避免冲突) 4. 设置 root 密码(建议复杂度:字母 + 数字 + 符号) 5. 安装服务(默认服务名:MySQL80) 若提示 “缺少 VC++ 运行库”,需先安装Microsoft Visual C++ Redistributable。 ZIP 格式 1. 解压 ZIP 包到指定目录(如 D:\MySQL-8.0) 2. 新增my.ini配置文件(指定 basedir、datadir) 3. 配置环境变量(将bin目录加入 PATH) 4. 命令行初始化:mysqld --initialize --console(记录临时密码) 5. 安装服务:mysqld --install MySQL806. 启动服务:net start MySQL80my.ini需指定编码(character-set-server=utf8mb4);初始化后需修改临时密码(ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';)。(2)Linux 安装(以 CentOS 7 为例)
-
Yum 安装(推荐)
:
-
下载 Yum 源:
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm -
安装源:
rpm -ivh mysql80-community-release-el7-3.noarch.rpm -
安装服务:
yum install -y mysql-community-server -
启动服务:
systemctl start mysqld -
查看临时密码:
grep 'temporary password' /var/log/mysqld.log -
登录并修改密码:
mysql -u root -p→ 输入临时密码 →ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass@123';(MySQL 8.0 要求强密码)
-
-
安全配置
:执行
mysql_secure_installation
,按提示:
-
重置 root 密码(可选)
-
删除匿名用户(建议开启)
-
禁止 root 远程登录(生产环境建议开启)
-
删除 test 数据库(建议开启)
-
-
-
服务管理
操作 Windows 命令 Linux 命令 启动服务 net start MySQL80(服务名需匹配)systemctl start mysqld停止服务 net stop MySQL80systemctl stop mysqld重启服务 net restart MySQL80systemctl restart mysqld开机自启 sc config MySQL80 start= autosystemctl enable mysqld登录数据库 mysql -u root -p(密码交互输入)mysql -u root -h localhost -p远程登录 mysql -u root -h 192.168.1.100 -P 3306 -p同 Windows,需开放防火墙 3306 端口( firewall-cmd --add-port=3306/tcp --permanent)
一、SQL 语句基础
-
SQL 简介:结构化查询语言(Structured Query Language),用于关系型数据库的定义、操作、查询、控制,是数据库行业标准(ANSI SQL)。
-
SQL 语句分类
分类 功能描述 核心关键字 DDL(数据定义) 操作数据库对象(库、表、索引) CREATE(创建)、DROP(删除)、ALTER(修改)、SHOW(查看)、TRUNCATE(清空表) DML(数据操作) 操作表中记录(增删改) INSERT(插入)、DELETE(删除)、UPDATE(更新)、REPLACE(替换) DQL(数据查询) 查询表中数据 SELECT(查询)、FROM(来源)、WHERE(条件)、ORDER BY(排序)、GROUP BY(分组) DCL(数据控制) 控制用户权限 GRANT(授权)、REVOKE(回收权限)、CREATE USER(创建用户)、DROP USER(删除用户) 事务控制 保证数据一致性 START TRANSACTION(开启事务)、COMMIT(提交)、ROLLBACK(回滚)、SAVEPOINT(保存点) -
书写规范
-
大小写:SQL 关键字不区分大小写(建议大写,提高可读性),字符串常量区分大小写(如
'abc'≠'ABC')。 -
结尾:语句以分号(;) 结束(部分客户端支持省略,但不推荐)。
-
格式:关键词不跨多行,子句(如 FROM、WHERE)单独成行,用空格 / 缩进分层(例:
SELECT id, name FROM student WHERE age > 18 ORDER BY age DESC;
-
注释:
-
单行注释:
-- 注释内容(-- 后需加空格)或# 注释内容(MySQL 特有)。 -
多行注释:
/* 注释内容 */(支持跨多行)。
-
-
-
命名约束
-
长度:库 / 表 / 字段名最长 64 个字符。
-
字符:由字母、数字、下划线(_)、#、$ 组成,必须以字母开头(如
student_info合法,123_stu非法)。 -
关键字:避免使用 SQL 保留字(如
user、table),若必须使用,需用 ** 反引号()** 包裹(如CREATE TABLEuser(...);`)。 -
唯一性:同一数据库内,库名唯一;同一库内,表名唯一;同一表内,字段名唯一。
-
二、数据库操作
-
登录与退出
-
登录语法:
mysql -u用户名 -h服务器地址 -P端口 -p密码 -D数据库名
-
选项说明:
-u(指定用户)、-h(指定 IP,默认localhost)、-P(指定端口,默认 3306)、-p(指定密码,建议不直接写密码,仅用-p后交互输入,避免密码泄露)、-D(登录后直接切换到目标库)。 -
示例:远程登录
mysql -u root -h 192.168.1.100 -P 3306 -p。
-
-
退出:
exit、quit或\q(任意一个即可)。
-
-
核心操作语句
操作需求 SQL 语句 说明 查看所有数据库 SHOW DATABASES;显示 MySQL 内置库(如 mysql、information_schema)和自定义库。 模糊查看数据库 SHOW DATABASES LIKE 'db%';%匹配任意长度字符,_匹配单个字符(如'db_'匹配db1、db2)。创建数据库 CREATE DATABASE [IF NOT EXISTS] 库名 [CHARACTER SET 字符集] [COLLATE 排序规则];IF NOT EXISTS避免库已存在时报错;默认字符集 utf8mb4(MySQL 8.0)。查看数据库创建语句 SHOW CREATE DATABASE 库名;显示库的完整定义(含字符集、排序规则)。 切换数据库 USE 库名;后续操作默认在该库下执行;查看当前库: SELECT DATABASE();。查看当前登录用户 SELECT USER();显示格式: 用户名@主机地址(如root@localhost)。删除数据库 DROP DATABASE [IF EXISTS] 库名;谨慎操作:删除后数据无法恢复,建议先备份。 修改数据库字符集 ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;仅影响后续新建的表,已存在的表需单独修改。
三、MySQL 字符集
-
基本概念
-
字符集(Character Set):定义字符的编码规则(如将 “中” 编码为
0xE4B8AD)。 -
排序规则(Collation):定义字符的比较 / 排序规则(如是否区分大小写),命名格式:
字符集_区域_后缀(如utf8mb4_general_ci,ci= 大小写不敏感,bin= 二进制比较)。
-
-
常见字符集对比
字符集 支持范围 存储长度 适用场景 注意事项 latin1 西欧、希腊字符 1 字节 纯英文场景 MySQL 默认字符集(5.7 及之前),不支持中文。 gbk 简体中文、繁体中文(部分) 1-2 字节 中文场景(如早期网站) 兼容 GB2312,不支持 emoji。 big5 繁体中文(台湾、香港) 1-2 字节 繁体中文场景 不兼容 GBK,不支持 emoji。 utf8 MySQL 中为 utf8mb3别名1-3 字节 多数语言(不含 emoji) 无法存储 4 字节字符(如 emoji😀、生僻字),不推荐使用。 utf8mb4 完整 Unicode(含 emoji、生僻字) 1-4 字节 全球多语言、需 emoji 场景 MySQL 8.0 默认字符集,推荐优先使用。 -
字符集相关查询
-
查看 MySQL 支持的所有字符集:
SHOW CHARACTER SET;(或SHOW CHARSET;)。 -
查看支持的排序规则:
SHOW COLLATION;。 -
查看当前字符集配置:
SHOW VARIABLES LIKE 'character_set_%';(关键变量:character_set_client(客户端编码)、character_set_server(服务器编码))。 -
查看当前排序规则配置:
SHOW VARIABLES LIKE 'collation_%';。
-
-
字符集修改(关键场景)
-
修改数据库字符集:
ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。 -
修改表字符集:
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;(会同步修改表中所有字段的字符集)。 -
修改字段字符集:
ALTER TABLE 表名 MODIFY 字段名 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。
-
四、数据库对象与命名规范
-
核心数据库对象:数据库(DB)、表(Table)、索引(Index)、视图(View)、存储过程(Procedure)、函数(Function)、触发器(Trigger)、事件(Event)。
-
生产环境命名规范
对象类型 命名规则 示例 数据库 项目名 + 库功能简写,全小写,下划线分隔,不超过 30 字符 mall_db(商城数据库)、blog_user_db(博客用户库)表 - 常规表: t_+ 模块名 + 表功能,全小写 - 临时表:temp_+ 功能 + 日期 - 备份表:bak_+ 原表名 + 日期t_user(用户表)、temp_order_202405、bak_user_20240520字段 模块名(可选) + 字段含义,全小写,下划线分隔,避免冗余(如 user_id无需写t_user_id)user_id(用户 ID)、order_total(订单金额)索引 - 普通索引: idx_+ 表名 + 字段名 - 唯一索引:uniq_+ 表名 + 字段名 - 主键索引:默认PRIMARYidx_user_age(用户年龄索引)、uniq_user_phone(用户手机号唯一索引)视图 v_+ 视图功能,全小写v_user_order(用户订单视图)存储过程 proc_+ 功能,全小写proc_calculate_order(计算订单金额)
五、表的基本操作
5.1 数据类型详解
MySQL 数据类型按用途分为数值型、字符型、日期时间型、特殊类型,需根据业务场景选择(避免过度占用空间)。
(1)数值型
| 类型 | 字节数 | 取值范围(有符号) | 取值范围(无符号,unsigned) | 适用场景 |
|---|---|---|---|---|
| tinyint | 1 | -128 ~ 127 | 0 ~ 255 | 状态(0 = 禁用,1 = 启用)、布尔值(tinyint (1),0=false,1=true) |
| smallint | 2 | -32768 ~ 32767 | 0 ~ 65535 | 数量较少的 ID(如分类 ID) |
| int | 4 | -2^31 ~ 2^31-1(约 - 21 亿~21 亿) | 0 ~ 2^32-1(约 42 亿) | 主键 ID(如用户 ID、订单 ID) |
| bigint | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 | 超大 ID(如日志 ID、分布式 ID) |
| float(m,d) | 4 | 单精度浮点型,m = 总位数,d = 小数位 | 存在精度丢失 | 非精确数值(如温度、重量) |
| double(m,d) | 8 | 双精度浮点型,精度高于 float | 仍有精度丢失 | 非精确数值(如金额估算) |
| decimal(m,d) | 可变 | 定点型,m = 总位数(最大 65),d = 小数位(最大 30) | 无精度丢失 | 精确数值(如金额、税率) |
(2)字符型
| 类型 | 长度限制 | 存储特点 | 适用场景 |
|---|---|---|---|
| char(n) | n(1~255) | 固定长度,不足补空格 | 短字符串(如手机号、身份证号、性别) |
| varchar(n) | n(1~65535) | 可变长度,按实际内容存储 | 长字符串(如用户名、地址、商品描述) |
| text | 最大 65535 字节 | 存储长文本,不支持默认值 | 超长文本(如文章内容、评论) |
| mediumtext | 最大 16MB | 比 text 更大 | 大文本(如日志、富文本内容) |
| longtext | 最大 4GB | 超大文本 | 极少用(如备份数据) |
| blob | 最大 65535 字节 | 存储二进制数据(如图片) | 不推荐(建议存储图片 URL,而非二进制) |
(3)日期时间型
| 类型 | 字节数 | 取值范围 | 格式 | 适用场景 | 特点 |
|---|---|---|---|---|---|
| date | 3 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 生日、注册日期 | 仅存日期,不受时区影响 |
| time | 3 | -838:59:59 ~ 838:59:59 | HH:MM:SS | 时长、打卡时间 | 可存负数(如跨天时间) |
| datetime | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 订单创建时间、日志时间 | 不受时区影响,默认值需显式指定 |
| timestamp | 4 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 最后更新时间 | 受时区影响,默认自动更新(ON UPDATE CURRENT_TIMESTAMP) |
| year | 1 | 1901 ~ 2155 | YYYY | 年份(如毕业年份) | 存储紧凑,支持 2 位(如 99=1999) |
5.2 表约束(核心)
约束用于保证表数据的完整性和一致性,创建表时可指定,也可后续修改。
| 约束类型 | 关键字 | 功能描述 | 示例(创建表时) |
|---|---|---|---|
| 主键约束 | PRIMARY KEY | 唯一标识表中记录,非空且唯一,一张表仅一个主键(可多字段联合主键) | id INT PRIMARY KEY AUTO_INCREMENT(AUTO_INCREMENT:自增,仅数值型主键支持) |
| 非空约束 | NOT NULL | 字段值不可为空 | name VARCHAR(50) NOT NULL COMMENT '用户名' |
| 默认约束 | DEFAULT | 字段未赋值时,使用默认值 | status TINYINT DEFAULT 1 COMMENT '状态:1=正常,0=禁用' |
| 唯一约束 | UNIQUE | 字段值唯一(允许 NULL,且多个 NULL 不冲突) | phone VARCHAR(20) UNIQUE COMMENT '手机号,唯一' |
| 外键约束 | FOREIGN KEY | 关联另一张表的主键,保证数据一致性(如订单表的 user_id 关联用户表的 id) | user_id INT, FOREIGN KEY (user_id) REFERENCES t_user(id) ON DELETE CASCADE(ON DELETE CASCADE:主表记录删除时,从表关联记录也删除) |
| 检查约束 | CHECK | 限制字段值的范围(MySQL 8.0 及以上支持) | age INT CHECK (age > 0 AND age < 150) COMMENT '年龄需在0-150之间' |
5.3 表操作核心语句
(1)创建表
CREATE TABLE [IF NOT EXISTS] t_user ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID(主键)', name VARCHAR(50) NOT NULL COMMENT '用户名', phone VARCHAR(20) UNIQUE COMMENT '手机号', age INT DEFAULT 0 CHECK (age >= 0 AND age <= 150) COMMENT '年龄', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-
说明:
ENGINE=InnoDB指定存储引擎(默认),COMMENT为表 / 字段添加注释(便于维护)。
(2)查看表信息
| 需求 | SQL 语句 |
|---|---|
| 查看库中所有表 | SHOW TABLES;(当前库)或SHOW TABLES FROM mall_db;(指定库) |
| 查看表结构 | DESC t_user;(或DESCRIBE t_user;、EXPLAIN t_user;) |
| 查看表完整创建语句 | SHOW CREATE TABLE t_user\G;(\G:按行显示,避免列过长) |
| 查看表状态 | SHOW TABLE STATUS LIKE 't_user'\G;(含引擎、字符集、行数等) |
(3)修改表结构(ALTER TABLE)
| 需求 | SQL 语句 |
|---|---|
| 修改表名 | ALTER TABLE t_old RENAME TO t_new;(或RENAME TABLE t_old TO t_new;) |
| 添加字段 | ALTER TABLE t_user ADD email VARCHAR(100) AFTER name;(AFTER 指定位置,FIRST 放第一列) |
| 删除字段 | ALTER TABLE t_user DROP email; |
| 修改字段名 + 类型 | ALTER TABLE t_user CHANGE age user_age INT DEFAULT 18;(CHANGE 需指定新旧字段名) |
| 仅修改字段类型 | ALTER TABLE t_user MODIFY user_age TINYINT DEFAULT 18; |
| 添加主键约束 | ALTER TABLE t_user ADD PRIMARY KEY (id); |
| 添加唯一约束 | ALTER TABLE t_user ADD UNIQUE (phone); |
| 删除主键约束 | ALTER TABLE t_user DROP PRIMARY KEY;(仅当主键无 AUTO_INCREMENT 时) |
(4)删除表
DROP TABLE [IF EXISTS] t_user; -- IF EXISTS避免表不存在时报错
-
注意:
DROP TABLE会删除表结构和所有数据,无法恢复;若仅需清空数据(保留结构),用TRUNCATE TABLE t_user;(比 DELETE 更快,不触发事务)。
(5)表复制(备份场景)
| 需求 | SQL 语句 | 特点 |
|---|---|---|
| 仅复制表结构 | CREATE TABLE t_user_bak LIKE t_user; | 复制结构、约束、索引,不复制数据 |
| 复制结构 + 全部数据 | CREATE TABLE t_user_bak SELECT * FROM t_user; | 不复制主键自增属性,需手动添加 |
| 复制结构 + 部分数据 | CREATE TABLE t_user_adult SELECT * FROM t_user WHERE age >= 18; | 按条件筛选数据 |
| 复制部分字段 + 数据 | CREATE TABLE t_user_name SELECT id, name FROM t_user; | 仅复制指定字段 |
六、SQL 查询进阶(DQL 补充)
DQL 是 SQL 中最常用的部分,核心是SELECT语句,支持复杂条件查询、排序、分组、分页等。
6.1 基础查询语法
SELECT [DISTINCT] 字段1, 字段2, 聚合函数(字段) FROM 表名1 [INNER/LEFT/RIGHT JOIN 表名2 ON 关联条件] -- 多表连接 [WHERE 行过滤条件] -- 过滤行数据 [GROUP BY 分组字段] -- 按字段分组 [HAVING 组过滤条件] -- 过滤分组结果(需配合GROUP BY) [ORDER BY 排序字段 ASC/DESC] -- 排序(ASC升序,默认;DESC降序) [LIMIT 偏移量, 条数]; -- 分页(偏移量从0开始)
6.2 关键子句详解
(1)WHERE 条件(行过滤)
支持多种运算符:
-
比较运算符:
=(等于)、!=/<>(不等于)、>、<、>=、<=、BETWEEN ... AND ...(范围)、IN (值1,值2)(在集合中)、IS NULL(为空)、IS NOT NULL(不为空)。 -
逻辑运算符:
AND(且)、OR(或)、NOT(非)。 -
模糊运算符:
LIKE(配合%/_),如name LIKE '张%'(匹配姓张的所有名字)、phone LIKE '138____5678'(匹配 138 开头、尾号 5678 的手机号)。
示例:查询 18-30 岁、姓张的用户:
SELECT id, name, age FROM t_user WHERE age BETWEEN 18 AND 30 AND name LIKE '张%';
(2)聚合函数(统计数据)
| 函数 | 功能描述 | 示例 |
|---|---|---|
| COUNT (字段) | 统计非 NULL 值的行数 | COUNT(id)(统计用户总数) |
| COUNT(*) | 统计所有行数(含 NULL) | COUNT(*)(统计订单总数) |
| SUM (字段) | 计算数值字段的总和 | SUM(order_total)(订单总金额) |
| AVG (字段) | 计算数值字段的平均值 | AVG(age)(用户平均年龄) |
| MAX (字段) | 取字段最大值 | MAX(create_time)(最新注册时间) |
| MIN (字段) | 取字段最小值 | MIN(price)(最低商品价格) |
示例:统计用户总数、平均年龄、最大年龄:
SELECT COUNT(*) AS total_user, -- AS给字段起别名 AVG(age) AS avg_age, MAX(age) AS max_age FROM t_user;
(3)GROUP BY 分组
按指定字段分组,聚合函数对每组单独计算。 示例:按年龄分组,统计每组用户数:
SELECT age, COUNT(*) AS user_count FROM t_user GROUP BY age HAVING user_count > 5; -- HAVING过滤分组结果(用户数>5的年龄组)
-
注意:
WHERE过滤行数据(分组前),HAVING过滤分组结果(分组后),HAVING可使用聚合函数。
(4)ORDER BY 排序
按一个或多个字段排序,多个字段用逗号分隔。 示例:按年龄降序、创建时间升序排序:
SELECT id, name, age, create_time FROM t_user ORDER BY age DESC, create_time ASC;
(5)LIMIT 分页
用于分页查询,语法:LIMIT 偏移量, 每页条数(偏移量 =(页码 - 1)× 每页条数)。 示例:查询第 2 页数据(每页 10 条):
SELECT id, name FROM t_user LIMIT 10, 10; -- 偏移量10(跳过前10条),取10条
(6)多表连接查询
假设有两张表:t_user(用户表,id 为主键)和t_order(订单表,user_id 为外键,关联 t_user.id)。
| 连接类型 | 功能描述 | 示例 SQL |
|---|---|---|
| INNER JOIN | 只返回两表匹配的记录 | SELECT u.name, o.order_no FROM t_user u INNER JOIN t_order o ON u.id = o.user_id; |
| LEFT JOIN | 返回左表所有记录,右表匹配不到则为 NULL | SELECT u.name, o.order_no FROM t_user u LEFT JOIN t_order o ON u.id = o.user_id; |
| RIGHT JOIN | 返回右表所有记录,左表匹配不到则为 NULL | SELECT u.name, o.order_no FROM t_user u RIGHT JOIN t_order o ON u.id = o.user_id; |
七、事务与隔离级别
7.1 事务的 ACID 特性
事务是一组不可分割的 SQL 操作,要么全部执行成功,要么全部失败回滚,核心保证数据一致性,需满足 ACID:
-
原子性(Atomicity):事务中所有操作要么全成,要么全败(如转账:扣钱和加钱必须同时成功或失败)。
-
一致性(Consistency):事务执行前后,数据总状态不变(如转账前后,双方总金额不变)。
-
隔离性(Isolation):多个事务并发执行时,彼此不干扰(避免 “脏读”“不可重复读” 等问题)。
-
持久性(Durability):事务提交后,数据永久保存在磁盘(即使断电,数据也不丢失)。
7.2 事务控制语句
-- 1. 开启事务(默认自动提交,开启后需手动提交) START TRANSACTION; -- 或 BEGIN; -- 2. 执行DML操作(如插入、更新) UPDATE t_user SET balance = balance - 100 WHERE id = 1; -- 用户1扣100 UPDATE t_user SET balance = balance + 100 WHERE id = 2; -- 用户2加100 -- 3. 提交事务(数据永久生效) COMMIT; -- 4. 若出错,回滚事务(恢复到事务开始前状态) ROLLBACK; -- 5. 保存点(可选,回滚到指定点,而非整个事务) SAVEPOINT sp1; -- 创建保存点sp1 UPDATE t_user SET age = 20 WHERE id = 1; ROLLBACK TO sp1; -- 回滚到sp1,上述UPDATE不生效
7.3 事务隔离级别
MySQL 默认隔离级别为可重复读(Repeatable Read),通过SET TRANSACTION ISOLATION LEVEL修改,各级别解决的并发问题如下:
| 隔离级别 | 脏读(读未提交数据) | 不可重复读(同一事务内多次读结果不同) | 幻读(同一事务内多次读行数不同) | 适用场景 |
|---|---|---|---|---|
| 读未提交(Read Uncommitted) | 允许 | 允许 | 允许 | 极少用(如临时统计,不要求准确性) |
| 读已提交(Read Committed) | 禁止 | 允许 | 允许 | 多数互联网场景(如电商订单) |
| 可重复读(Repeatable Read) | 禁止 | 禁止 | 禁止(MySQL 通过 MVCC 实现) | MySQL 默认,适合对一致性要求高的场景 |
| 串行化(Serializable) | 禁止 | 禁止 | 禁止 | 极高一致性场景(如金融转账,性能低) |
-
查询当前隔离级别:
SELECT @@transaction_isolation;(MySQL 8.0)或SELECT @@tx_isolation;(MySQL 5.7)。 -
修改隔离级别(会话级,仅当前连接生效):
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;。
八、索引基础
8.1 索引的作用
-
优点:加速查询(如通过索引定位记录,避免全表扫描),加速排序 / 分组(索引本身有序)。
-
缺点:占用额外存储空间;减慢写操作(INSERT/UPDATE/DELETE 需同步维护索引)。
8.2 索引类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 主键索引 | 自动创建,唯一且非空,名PRIMARY | 主键字段(如 user.id) |
| 唯一索引 | 字段值唯一(允许 NULL) | 唯一字段(如 user.phone、user.email) |
| 普通索引 | 无约束,仅加速查询 | 频繁查询的非唯一字段(如 user.age) |
| 联合索引 | 基于多个字段的索引(如 (age, name)) | 多字段联合查询(如WHERE age=20 AND name LIKE '张%') |
| 全文索引 | 用于全文搜索(如文章内容) | text 类型字段(如 article.content),MySQL 5.6 + 支持 InnoDB 全文索引 |
8.3 索引操作语句
-- 1. 创建索引(创建表时或后续添加) -- (1)创建表时添加 CREATE TABLE t_user ( id INT PRIMARY KEY, -- 主键索引 phone VARCHAR(20) UNIQUE, -- 唯一索引 age INT, INDEX idx_user_age (age) -- 普通索引 ); -- (2)后续添加索引 CREATE INDEX idx_user_age ON t_user(age); -- 普通索引 CREATE UNIQUE INDEX uniq_user_phone ON t_user(phone); -- 唯一索引 CREATE INDEX idx_user_age_name ON t_user(age, name); -- 联合索引 -- 2. 查看索引 SHOW INDEX FROM t_user; -- 查看表中所有索引 SHOW KEYS FROM t_user; -- 与上等价 -- 3. 删除索引 DROP INDEX idx_user_age ON t_user; -- 删除普通索引 ALTER TABLE t_user DROP INDEX uniq_user_phone; -- 删除唯一索引 ALTER TABLE t_user DROP PRIMARY KEY; -- 删除主键索引(需无AUTO_INCREMENT)
8.4 索引使用注意事项
-
最左前缀原则:联合索引(如 (age, name))仅在查询条件包含左起第一个字段时生效(如
WHERE age=20生效,WHERE name='张三'不生效)。 -
避免索引失效
:
-
不使用函数 / 表达式操作索引字段(如
WHERE SUBSTR(name,1,1)='张'会导致idx_user_name失效)。 -
不使用
!=/<>/IS NOT NULL(可能导致全表扫描)。 -
字符串不加引号(如
WHERE phone=13800138000,若 phone 是 varchar 类型,会导致索引失效)。
-
-
索引不是越多越好:单表索引建议不超过 5 个(过多影响写性能)。
九、存储引擎对比
MySQL 支持多种存储引擎,核心差异在事务支持、锁机制、存储方式,常用引擎对比:
| 特性 | InnoDB(默认) | MyISAM | Memory(内存引擎) |
|---|---|---|---|
| 事务支持 | 支持(ACID) | 不支持 | 不支持 |
| 锁机制 | 行级锁(支持高并发) | 表级锁(并发性能差) | 表级锁 |
| 外键支持 | 支持 | 不支持 | 不支持 |
| 存储方式 | 磁盘存储(.ibd 文件) | 磁盘存储(.MYD 数据 +.MYI 索引) | 内存存储(重启后数据丢失) |
| 缓存机制 | 缓存数据 + 索引 | 仅缓存索引 | 全表缓存(内存中) |
| 崩溃恢复 | 支持(通过 redo log/undo log) | 不支持(需手动修复) | 不支持(数据丢失) |
| 适用场景 | 事务场景(订单、用户) | 只读 / 少写场景(日志、报表) | 临时数据(会话缓存、临时表) |
-
查看当前存储引擎:
SHOW ENGINES;。 -
修改表存储引擎:
ALTER TABLE t_user ENGINE=MyISAM;(仅当表无外键时,InnoDB 可转 MyISAM)。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)