一,下载MySQL
这是下载地址:https://dev.mysql.com/downloads/mysql

二,安装步骤
下载好的文件,解压到你想安装的地方

解压好后,默认是没有my.ini文件的,需要我们自己创建一个:
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\\Program_Files_self\\MySQL
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
# datadir=D:\\Program_Files_self\\MySQL\\MySQLData
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
命令行操作
- 以管理员身份打开 cmd 命令行工具,按下Shift+Ctrl+Enter键即可
- 用cd命令切换到自己的安装目录下的 bin 文件夹
- 如果在D盘,再键入D:即可进入目录
#安装
mysqld install
#初始化数据库
mysqld --initialize --console
执行完成后会输出 root 用户的初此密码

#启动服务
net start mysql
#登录
mysql -u root -p
遇到的问题
出现 “ERROR 1045 (28000): Access denied for user ‘root’@’localhost‘ (using password: YES)”
解决方案:
#停止MySQL服务
net stop mysql
#跳过权限验证启动 MySQL
mysqld --console --skip-grant-tables --shared-memory
无密码登录并重置密码
重新打开一个新的 CMD 窗口,进入bin目录
#登录
mysql -u root -p
#提示输入密码时,直接按回车(无密码登录)
#登录后,执行以下命令重置密码(替换新密码为你的密码)
-- 切换到mysql系统数据库
use mysql;
-- 重置root密码(MySQL 8.0+ 必须用此语法)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
exit;
重启 MySQL 服务:
关闭之前 “跳过权限验证” 的 CMD 窗口(停止临时服务)
在新 CMD 窗口中启动服务:
net start mysql
其他
mysql> ALTER USER ‘root’@’localhost‘ IDENTIFIED BY ‘root’; ERROR 1290 (HY000): The MySQL server is running with the –skip-grant-tables option so it cannot execute this statement
如果出现以上问题:
先刷新权限,再修改密码,具体步骤如下:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
exit;
之后按之前的步骤关闭临时启动的 MySQL 窗口,重新启动正常的 MySQL 服务,即可用新密码登录。
Navicat安装
Navicat Premium 16 保姆级手把手 安装教程包含下载、安装、授权(附安装包)-CSDN博客
Mysql使用
Mysql数据库通过SQL(结构化查询语言)语句对数据进行操作。
SQL操作语句可以分为三种:
- DDL(数据定义语言)
- DML(数据操作语言)
- DQL(数据查询语言)
DDL(数据定义语言)
作用:定义和管理数据库、表的结构。
关键字:CREATE,ALTER,DROP
DML(数据操作语言)
作用:对表中的数据进行增、删、改。
关键字:INSERT,UPDATE,DELETE
DQL(数据查询语言)
作用:查询表中的数据。
关键字:SELECT
查询
条件查询,如一条完整的sql查询语句结构为
SELECT [DISTINCT] 列名1, 列名2, ... -- 要查询的列(* 表示所有列)
FROM 表名 -- 数据来源的表
[JOIN 关联表名 ON 关联条件] -- 多表关联(可选)
[WHERE 筛选条件] -- 行级过滤(核心:条件查询)
[GROUP BY 分组列] -- 分组(可选)
[HAVING 分组后筛选条件] -- 分组后过滤(可选)
[ORDER BY 排序列 [ASC/DESC]] -- 排序(可选)
[LIMIT 行数 [OFFSET 偏移量]] -- 限制结果行数(可选,不同数据库语法略有差异)
基础结构
-- 基础结构:SELECT + FROM + WHERE
SELECT name, age
FROM student
WHERE gender = '女' AND age > 18;
SELECT:指定需要查询的字段,使用*表示查询所有字段
FROM:指定数据来源的表名
WHERE:定义筛选条件,只有满足该条件的记录才会被返回
二、常用运算符
1. 比较运算符
比较运算符是最基础的条件判断工具,用于判断字段值与目标值的关系:
=:等于!=/<>:不等于>:大于<:小于>=:大于等于<=:小于等于
2. 范围运算符
当需要判断字段值是否在某个连续区间时,使用BETWEEN ... AND ...会让语句更简洁:
-- 查询年龄在18到25岁之间的学生
SELECT * FROM student WHERE age BETWEEN 18 AND 25;
3. 模糊匹配
使用LIKE关键字可以实现模糊查询,通常配合通配符使用:
%:匹配任意长度的任意字符(包括 0 个字符)_:匹配单个任意字符
-- 查询姓张的学生
SELECT * FROM student WHERE name LIKE '张%';
-- 查询名字为两个字且姓张的学生
SELECT * FROM student WHERE name LIKE '张_';
4. 集合运算符
IN关键字用于判断字段值是否属于指定的集合,适合处理离散的多个取值:
-- 查询学号为1001、1003、1005的学生
SELECT * FROM student WHERE id IN (1001, 1003, 1005);
SQL 连接查询:LEFT JOIN 与 RIGHT JOIN 详解
在多表关联查询的场景中,LEFT JOIN(左连接)和RIGHT JOIN(右连接)是实现数据关联的核心方式,二者的核心区别在于保留的表数据不同。
一、LEFT JOIN(左连接)
核心特点
- 数据保留规则:保留左表(
FROM后的第一个表)的所有记录,即使右表中没有匹配的记录。 - 无匹配处理:当右表无匹配记录时,右表对应的字段会显示为
NULL。
基础语法
SELECT 字段 FROM 表1 LEFT JOIN 表2 ON 关联条件;
应用场景
适用于需要以左表数据为基础,关联右表补充信息的场景,例如:
- 查询所有学生的选课信息,包括没有选课的学生
SELECT student.name, course.course_name
FROM student LEFT JOIN course
ON student.id = course.student_id;
二、RIGHT JOIN(右连接)
核心特点
- 数据保留规则:保留右表(
JOIN后的表)的所有记录,即使左表中没有匹配的记录。 - 无匹配处理:当左表无匹配记录时,左表对应的字段会显示为
NULL。
基础语法
SELECT 字段 FROM 表1 RIGHT JOIN 表2 ON 关联条件;
应用场景
适用于需要以右表数据为基础,关联左表补充信息的场景,例如:
- 查询所有课程的选课学生,包括没有学生选择的课程
SELECT student.name, course.course_name
FROM student RIGHT JOIN course
ON student.id = course.student_id;
三、核心区别对比
| 维度 | LEFT JOIN | RIGHT JOIN |
|---|---|---|
| 保留的表 | 左表 | 右表 |
| 无匹配时的字段值 | 右表字段为 NULL | 左表字段为 NULL |
| 典型使用场景 | 以左表为主,补充右表信息 | 以右表为主,补充左表信息 |
ER 图与物理表的关系解析
ER 图是数据库设计的蓝图,而物理表是其在数据库中的最终实现,二者共同构成了从数据建模到数据存储的完整链路。
一、ER 图:数据库的设计蓝图
定义
ER 图(实体 – 关系图)是用图形化方式描述数据及其关系的工具,是数据库设计阶段的核心产出物。
核心三要素
- 实体(Entity):用矩形表示,对应业务中的核心对象,例如 “学生”“课程”。
- 属性(Attribute):用椭圆形表示,是实体的特征,例如学生的 “姓名”“年龄”。
- 关系(Relationship):用菱形表示,描述实体之间的关联,例如学生 “选课”。
核心作用
清晰规划数据结构与业务关系,提前梳理数据之间的依赖,为后续物理表的创建提供明确依据。
二、物理表:ER 图的具体实现
定义
物理表是 ER 图在数据库中的具体实现,是真实存储数据的二维表结构,也是所有 SQL 操作(增删改查)的最终对象。
与 ER 图的对应关系
| ER 图元素 | 物理表对应项 |
|---|---|
| 实体(Entity) | 表(Table) |
| 属性(Attribute) | 字段(列 / Column) |
| 关系(Relationship) | 主键 / 外键(Primary Key/Foreign Key) |
核心作用
作为数据的最终载体,通过定义字段类型、约束和关联,将 ER 图的设计转化为可操作的数据库对象。
三、从 ER 图到物理表的设计流程
- 需求梳理:分析业务场景,识别核心实体、属性与关系。
- 绘制 ER 图:用图形化方式呈现数据模型,验证业务逻辑的合理性。
- 表结构设计:将 ER 图的实体转化为表,属性转化为字段,关系转化为键约束。
- 数据库落地:通过
CREATE TABLE等 SQL 语句创建物理表,完成从设计到存储的转化。
数据库操作(Database)
1. 创建数据库
-- 基础语法
CREATE DATABASE [IF NOT EXISTS] 数据库名
[DEFAULT CHARACTER SET 字符集]
[DEFAULT COLLATE 排序规则];
-- 示例:创建名为school的数据库,指定UTF8字符集
CREATE DATABASE IF NOT EXISTS school
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
IF NOT EXISTS:避免重复创建报错(推荐必加)
常用字符集:utf8、utf8mb4(支持 emoji)
删除数据库
-- 基础语法
DROP DATABASE [IF EXISTS] 数据库名;
-- 示例:删除school数据库
DROP DATABASE IF EXISTS school;
选择数据库
USE school; -- 切换到school数据库
二、数据表操作(Table)
1. 创建数据表
-- 基础语法
CREATE TABLE [IF NOT EXISTS] 表名 (
字段1 数据类型 [约束条件],
字段2 数据类型 [约束条件],
...
[表级约束]
) [ENGINE=存储引擎] [DEFAULT CHARSET=字符集];
-- 示例:创建student学生表
CREATE TABLE IF NOT EXISTS student (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键+自增
name VARCHAR(50) NOT NULL, -- 姓名,非空
age TINYINT UNSIGNED DEFAULT 18, -- 年龄,无符号,默认18
gender ENUM('男','女','未知') DEFAULT '未知', -- 性别,枚举类型
create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 常用约束:
PRIMARY KEY(主键)、NOT NULL(非空)、UNIQUE(唯一)、DEFAULT(默认值)、AUTO_INCREMENT(自增) - 常用存储引擎:
InnoDB(支持事务 / 外键,推荐)、MyISAM
删除数据表
-- 基础语法
DROP TABLE [IF EXISTS] 表名;
-- 示例:删除student表
DROP TABLE IF EXISTS student;
三、数据操作(增删改查 CRUD)
1. 新增数据(CREATE – INSERT)
-- 方式1:指定字段插入(推荐,字段顺序可自定义)
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
-- 方式2:插入多条数据(高效)
INSERT INTO 表名 (字段1, 字段2) VALUES
(值1, 值2),
(值3, 值4);
-- 示例:插入单条学生数据
INSERT INTO student (name, age, gender) VALUES ('张三', 20, '男');
-- 示例:插入多条学生数据
INSERT INTO student (name, age, gender) VALUES
('李四', 21, '女'),
('王五', 19, '男');
查询数据(READ – SELECT)
-- 基础语法
SELECT [DISTINCT] 字段1, 字段2, ... -- DISTINCT去重
FROM 表名
[WHERE 条件] -- 筛选条件
[ORDER BY 字段 [ASC/DESC]] -- 排序,ASC升序(默认),DESC降序
[LIMIT 起始位置, 条数]; -- 分页
-- 示例1:查询所有学生信息
SELECT * FROM student;
-- 示例2:查询年龄大于19的男生,按年龄降序
SELECT name, age FROM student
WHERE age > 19 AND gender = '男'
ORDER BY age DESC;
-- 示例3:分页查询,第1页(从0开始),每页10条
SELECT * FROM student LIMIT 0, 10;
更新数据(UPDATE)
-- 基础语法
UPDATE 表名
SET 字段1=值1, 字段2=值2, ...
[WHERE 条件]; -- 必加!否则更新全表数据
-- 示例:将张三的年龄改为22
UPDATE student
SET age = 22
WHERE name = '张三';
⚠️ 重要:UPDATE 语句必须加 WHERE 条件,否则会修改表中所有记录!
删除数据(DELETE)
-- 基础语法
DELETE FROM 表名 [WHERE 条件]; -- 必加!否则删除全表数据
-- 示例:删除姓名为王五的学生
DELETE FROM student WHERE name = '王五';
-- 清空表(自增主键重置,慎用)
TRUNCATE TABLE student;
ELETE:删除数据,自增主键不重置,可回滚(事务中)TRUNCATE:清空表并重置结构,不可回滚,效率更高
MySQL必知必会
注释:
简短单行:优先用 -- 注释(通用标准)
MySQL 专属简写:用 # 注释
长文本 / 多行 / 调试:用 /* 注释 */
WHERE 子句
最常用的运算符,分成比较运算符、范围运算符、模糊匹配、空值判断、逻辑运算符5 大类
一、比较运算符(最基础、最常用)
用于判断值是否相等、大小关系,是 WHERE 最基础的用法。
表格
| 运算符 | 含义 | 示例 |
|---|---|---|
= | 等于 | WHERE age = 20 |
<> / != | 不等于 | WHERE age <> 18 |
> | 大于 | WHERE price > 100 |
< | 小于 | WHERE score < 60 |
>= | 大于等于 | WHERE num >= 5 |
<= | 小于等于 | WHERE height <= 180 |
小提示:
!=和<>效果完全一样,<>是 SQL 标准写法,更通用。
二、范围运算符(判断区间)
1. BETWEEN ... AND ...
作用:匹配在两个值之间的数据(包含起始和结束值)
sql
-- 年龄在 18~30 之间(包含18和30)
WHERE age BETWEEN 18 AND 30
2. NOT BETWEEN ... AND ...
作用:匹配不在区间内的数据
sql
WHERE price NOT BETWEEN 100 AND 500
三、指定集合匹配(多选一)
1. IN (值1, 值2, ...)
作用:匹配等于列表中任意一个值的数据
sql
-- 省份是北京、上海、广州之一
WHERE city IN ('北京', '上海', '广州')
2. NOT IN (值1, 值2, ...)
作用:匹配不在列表中的数据
sql
WHERE status NOT IN (0, 1)
四、模糊匹配(字符串搜索)
LIKE + 通配符
专门用于模糊查询文本,两个核心通配符:
%:匹配任意多个字符(包含 0 个)_:匹配 ** exactly 一个字符 **
表格
| 写法 | 含义 |
|---|---|
LIKE '张%' | 以张开头 |
LIKE '%三' | 以三结尾 |
LIKE '%小%' | 包含小字 |
LIKE '刘_' | 姓刘,且名字只有两个字 |
示例:
sql
-- 查询所有姓“李”的用户
WHERE name LIKE '李%'
五、空值判断(特别重要!)
1. IS NULL
作用:判断字段值为空(NULL)
sql
-- 邮箱为空
WHERE email IS NULL
2. IS NOT NULL
作用:判断字段不为空
sql
WHERE phone IS NOT NULL
⚠️ 新手必坑:不能用
= NULL或!= NULL,必须用IS NULL/IS NOT NULL!
六、逻辑运算符(多条件组合)
用于把多个条件组合在一起,实现复杂筛选。
表格
| 运算符 | 含义 | 示例 |
|---|---|---|
AND | 并且(所有条件都满足) | age>18 AND score>=60 |
OR | 或者(任意一个满足) | city='北京' OR city='上海' |
NOT | 取反 | NOT age>30 |
示例:
sql
-- 年龄大于18 且 性别为女
WHERE age > 18 AND gender = '女'
Mysql正则表达式
一、核心关键字:REGEXP
MySQL 用 REGEXP 关键字开启正则匹配。
基本语法
sql
WHERE 字段名 REGEXP '正则表达式'
对比 LIKE:
LIKE依赖%和_,功能弱REGEXP用正则规则,复杂模糊查询首选
二、最常用正则运算符(必背)
1. 基础匹配
表格
| 写法 | 作用 | 示例 |
|---|---|---|
. | 匹配任意一个字符 | REGEXP 'b.' → 匹配 b 后面跟任意 1 个字符 |
^ | 匹配文本开头 | REGEXP '^李' → 以李开头 |
$ | 匹配文本结尾 | REGEXP '三$' → 以三结尾 |
2. 多选一匹配
表格
| 写法 | 作用 | 示例 | |||
|---|---|---|---|---|---|
| ` | ` | 或(多个条件任选) | `REGEXP ‘ 苹果 | 香蕉 | 橘子 ‘` |
[abc] | 匹配括号内任意一个字符 | REGEXP '[xyz]' | |||
[^abc] | 匹配不在括号内的字符 | REGEXP '[^0-9]' → 非数字 |
3. 范围匹配
表格
| 写法 | 作用 |
|---|---|
[0-9] | 匹配 0~9 任意数字 |
[a-z] | 匹配小写字母 |
[A-Z] | 匹配大写字母 |
4. 重复匹配
表格
| 写法 | 作用 |
|---|---|
* | 0 个或多个(前面字符) |
+ | 1 个或多个 |
? | 0 个或 1 个 |
{n} | exactly n 个 |
三、实战示例(一看就会)
1. 包含某个文本(最简单)
只要字段里出现内容就匹配
sql
-- 产品名包含“手机”
SELECT * FROM products
WHERE prod_name REGEXP '手机';
2. 以某字符开头 / 结尾
sql
-- 姓名以“张”开头
WHERE name REGEXP '^张';
-- 邮箱以 .com 结尾
WHERE email REGEXP '\\.com$';
⚠️ 注意:. 是正则关键字,要匹配真实的点,必须加转义 \\.
3. 多条件 “或” 查询
sql
-- 城市是北京、上海、广州之一
WHERE city REGEXP '北京|上海|广州';
4. 数字 / 字母范围
sql
-- 手机号包含 13、15、18 开头
WHERE phone REGEXP '^1[358]';
-- 产品编号包含数字
WHERE prod_id REGEXP '[0-9]';
5. 复杂格式匹配(身份证 / 邮箱 / 邮编)
sql
-- 匹配 18 位身份证
WHERE id_card REGEXP '^[0-9]{17}[0-9X]$';
-- 匹配纯数字
WHERE code REGEXP '^[0-9]+$';
四、不区分大小写:REGEXP 不区分大小写
MySQL 默认正则不区分大小写
想严格区分,用 BINARY 关键字:
sql
WHERE name REGEXP BINARY 'Apple';
五、LIKE 与 REGEXP 的区别(关键)
表格
| LIKE | REGEXP |
|---|---|
| 必须完全匹配 | 只要包含就匹配 |
| 功能简单 | 功能强大 |
| 无特殊语法 | 支持复杂规则 |
例子:
sql
WHERE name LIKE '三' → 只有名字=“三”才匹配
WHERE name REGEXP '三' → 名字里**包含**三就匹配(张三、李四三...)
匹配特殊字符
一、什么是正则特殊字符?
在 MySQL 正则里,这些字符自带特殊功能,不能直接写:
. * + ? | [ ] ( ) { } ^ $ \
如果你想真正匹配这些符号本身,必须加 转义符:
\\(两个反斜杠)
二、正确写法:必须用 \\ 转义
1. 最常用特殊字符匹配(直接复制用)
表格
| 你想匹配的字符 | 正则里必须这样写 | 示例 | |||
|---|---|---|---|---|---|
. 点号 | \\. | REGEXP '\\.com' | |||
* 星号 | \\* | REGEXP '\\*特价' | |||
+ 加号 | \\+ | REGEXP '\\+86' | |||
? 问号 | \\? | REGEXP '\\?查询' | |||
| ` | ` 竖线 | `\ | ` | `REGEXP ‘\ | 分隔 ‘` |
[ 左中括号 | \\[` | `REGEXP '\\[通知'` | | `]` 右中括号 | `\\] | REGEXP '结束\\]' | |||
( 左括号 | \\(` | `REGEXP '\\(备注'` | | `)` 右括号 | `\\) | REGEXP '完成\\)' | |||
^ 尖号 | \\^ | REGEXP '\\^重点' | |||
$ 美元符 | \\$ | REGEXP '价格\\$' | |||
\ 反斜杠 | \\\\ | REGEXP '\\\\文件夹' |
三、实战示例(一看就懂)
1. 匹配包含点号 . 的文本
sql
-- 匹配邮箱、网址里的 .
SELECT * FROM user
WHERE email REGEXP '\\.com'; -- 必须写 \\.
2. 匹配包含括号 () 的内容
sql
-- 匹配商品名里的 (特价)
SELECT * FROM products
WHERE prod_name REGEXP '\\(特价\\)';
3. 匹配包含星号 *、加号 +
sql
-- 匹配 *热销* 、+新品
WHERE title REGEXP '\\*热销\\*|\\+新品';
4. 匹配反斜杠 \(最难记)
匹配一个 \ 必须写 4 个反斜杠 \\\\
sql
-- 匹配路径里的 \
WHERE path REGEXP '\\\\img';
四、超级重点:为什么是两个反斜杠?
MySQL 里有两层解析:
- MySQL 解析器:处理
\\→ 变成\ - 正则引擎:处理
\→ 转义特殊字符
所以:
- 想匹配
.→ 必须写\\. - 想匹配
\→ 必须写\\\\
五、避坑总结
- 只要匹配特殊字符,前面必须加
\\ - 直接写
. = * + ? | [ ]一定会匹配错误或报错 - 反斜杠
\最特殊,必须写\\\\
12 个 POSIX 正则字符类
[:alnum:]字母数字[:alpha:]纯字母[:blank:]空格、制表符[:cntrl:]控制字符[:digit:]数字 0-9[:graph:]可见非空白字符[:lower:]小写字母[:upper:]大写字母[:print:]可打印字符[:punct:]标点符号[:space:]所有空白(空格、换行、制表)[:xdigit:]十六进制字符 0-9 a-f A-F
MySQL 正则 重复元字符
表格
| 元字符 | 含义 |
|---|---|
* | 匹配前面字符 0 次或多次 |
+ | 匹配前面字符 1 次或多次 |
? | 匹配前面字符 0 次或 1 次 |
{n} | 精确匹配 n 次 |
{n,} | 匹配 至少 n 次 |
{n,m} | 匹配 n 到 m 次 |
用法示例:a{3} 匹配连续 3 个 a。
MySQL 正则 定位符
- ^ 匹配字符串开头
- $ 匹配字符串结尾
- [[:<:]] 单词开头
- [[:>:]] 单词结尾
示例:
^a 以 a 开头;z$ 以 z 结尾。
MySQL 计算字段
1. 概念
计算字段:数据库中不存在,查询时临时拼接、运算生成的字段。
2. 常用场景
- 拼接字符串
- 数值四则运算
- 起别名
AS
3. 核心语法
sql
-- 拼接
SELECT CONCAT(字段1,字段2) AS 新字段名;
-- 计算
SELECT 字段1 * 字段2 AS 新字段名;
4. 常用操作
- 拼接:
CONCAT()合并多个字段 - 算术运算:
+ - * / - 别名:
AS给计算字段起名,可省略 AS - 计算字段只在查询结果生效,不改变原表
MySQL 去空格函数
- LTRIM() 去掉左侧空格
- RTRIM() 去掉右侧空格
- TRIM() 去掉左右两端空格
语法:
sql
SELECT TRIM(字段) FROM 表;
SELECT LTRIM(字段), RTRIM(字段) FROM 表;
扩展:TRIM(字符 FROM 字段) 可去除指定首尾字符。
MySQL 函数
一、字符串函数
CONCAT()拼接字符串CONCAT_WS()带分隔符拼接LTRIM()去除左侧空格RTRIM()去除右侧空格TRIM()去除两端空格UPPER()/UCASE()转大写LOWER()/LCASE()转小写LEFT()左截取RIGHT()右截取SUBSTRING()截取子串LENGTH()字节长度CHAR_LENGTH()字符长度REPLACE()替换LOCATE()查找位置REVERSE()反转REPEAT()重复字符串
二、数值 / 数学函数
ABS()绝对值MOD()取模 / 余数ROUND()四舍五入CEIL()/CEILING()向上取整FLOOR()向下取整RAND()0~1 随机数PI()圆周率 πSQRT()平方根POW()/POWER()幂运算EXP()e 的 x 次方LOG()自然对数LOG10()以 10 为底对数SIN()正弦COS()余弦TAN()正切ASIN()反正弦ACOS()反余弦ATAN()反正切
三、日期时间函数
NOW()当前日期时间CURDATE()当前日期CURTIME()当前时间DATE()提取日期TIME()提取时间YEAR()/MONTH()/DAY()年月日HOUR()/MINUTE()/SECOND()时分秒DATE_ADD()增加时间ADDDATE()增加日期DATE_SUB()减少日期ADDTIME()增加时间DATEDIFF()日期差TIMEDIFF()时间差DAYOFWEEK()周几DAYOFMONTH()当月第几天DAYOFYEAR()当年第几天
四、聚合函数
COUNT()计数SUM()求和AVG()平均值MAX()最大值MIN()最小值
五、条件 / 流程函数
IF()条件判断IFNULL()空值替换NULLIF()相等返回 NULLCASE WHEN多分支判断
六、文本处理函数
TRIM()UPPER()LOWER()LENGTH()
MySQL 聚合函数 + 组合用法
一、5 大基础聚合函数
COUNT()统计行数 / 非空值SUM()求和AVG()平均值MAX()最大值MIN()最小值
二、基础语法
sql
SELECT 聚合函数(字段) FROM 表名;
三、组合用法核心
1. 同句多个聚合一起用
sql
SELECT
COUNT(*) AS 总数量,
SUM(price) AS 总价,
AVG(price) AS 均价,
MAX(price) AS 最高价,
MIN(price) AS 最低价
FROM products;
2. 搭配 WHERE 先筛选再聚合
sql
SELECT COUNT(*),SUM(price)
FROM products
WHERE price > 50;
3. GROUP BY 分组聚合(最常用)
规则:GROUP BY 分组字段,SELECT 里非聚合字段必须出现在 GROUP BY 中
sql
SELECT category,COUNT(*),AVG(price)
FROM products
GROUP BY category;
4. HAVING 过滤分组结果
WHERE 过滤行,HAVING 过滤分组后的数据
sql
SELECT category,COUNT(*) AS cnt
FROM products
GROUP BY category
HAVING cnt >= 3;
四、关键区别
WHERE:分组前筛选原始行GROUP BY:按字段分组HAVING:分组后筛选聚合结果- 聚合函数不能用在 WHERE,只能用在 SELECT、HAVING、ORDER BY

