MySQL 数据分析教程,全程配有示例 SQL,适合零基础入门

下面给你一份可直接跟着做的 MySQL 数据分析教程,从环境准备、基础查询、聚合统计、多表关联,到窗口函数与业务实战,全程配有示例 SQL,适合零基础入门。


一、环境准备(5分钟)

1. 安装 MySQL

  • Windows:下载 MySQL Installer,勾选 Server + Workbench
  • Mac:brew install mysql
  • Linux:sudo apt install mysql-server

2. 连接工具

  • 图形化:MySQL Workbench、Navicat、DBeaver
  • 命令行:mysql -u root -p

3. 导入测试数据(可选)

用官方示例库 sakila(电影租赁)或 world(国家城市):

-- 查看现有库
SHOW DATABASES;
-- 使用库
USE sakila;
-- 查看表
SHOW TABLES;

二、数据分析核心流程

业务目标 → 数据提取 → 清洗 → 统计 → 可视化/报告
MySQL 重点在:提取、清洗、统计


三、基础查询(必掌握)

1. 基本 SELECT

-- 查所有列
SELECT * FROM customer;

-- 查指定列
SELECT customer_id, first_name, email FROM customer;

-- 别名
SELECT customer_id AS 用户ID, first_name AS 姓名 FROM customer;

2. WHERE 条件筛选

-- 等值
SELECT * FROM customer WHERE country_id = 1;

-- 范围
SELECT * FROM payment WHERE amount > 10 AND amount < 20;

-- 模糊匹配
SELECT * FROM customer WHERE first_name LIKE 'A%';

-- 空值判断
SELECT * FROM customer WHERE email IS NULL;

3. 排序与去重

-- 排序(升序ASC/降序DESC)
SELECT * FROM payment ORDER BY amount DESC;

-- 去重
SELECT DISTINCT country_id FROM customer;

四、聚合统计(数据分析基石)

1. 常用聚合函数

  • COUNT():计数
  • SUM():求和
  • AVG():平均值
  • MAX():最大值
  • MIN():最小值

示例:

-- 总用户数
SELECT COUNT(*) AS 总用户数 FROM customer;

-- 有邮箱的用户数
SELECT COUNT(email) AS 有邮箱用户 FROM customer;

-- 总支付金额、平均金额
SELECT 
  SUM(amount) AS 总支付,
  AVG(amount) AS 平均支付,
  MAX(amount) AS 最大单笔
FROM payment;

2. GROUP BY 分组统计

-- 按国家统计用户数
SELECT country_id, COUNT(*) AS 用户数
FROM customer
GROUP BY country_id;

-- 按日期统计日销售额
SELECT DATE(payment_date) AS 日期, SUM(amount) AS 日销售额
FROM payment
GROUP BY DATE(payment_date)
ORDER BY 日期;

3. WHERE 与 HAVING 区别

  • WHERE:分组前过滤行
  • HAVING:分组后过滤组
-- 先筛>5元,再按日期分组,最后保留总额>100的日期
SELECT DATE(payment_date) AS 日期, SUM(amount) AS 总额
FROM payment
WHERE amount > 5
GROUP BY 日期
HAVING 总额 > 100;

五、数据清洗(常用技巧)

1. 处理缺失值

-- 替换NULL为指定值
SELECT email, IF(email IS NULL, '无邮箱', email) AS 处理后邮箱
FROM customer;

2. 数据类型转换

-- 字符串转日期
SELECT STR_TO_DATE('2026-05-13', '%Y-%m-%d');

-- 日期转字符串
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');

3. 异常值过滤

-- 剔除金额为负或过大的异常
SELECT * FROM payment
WHERE amount >= 0 AND amount < 1000;

六、多表关联(核心技能)

1. 关联类型

  • INNER JOIN:两表匹配数据
  • LEFT JOIN:左表全保留,右表匹配不到为NULL
  • RIGHT JOIN:右表全保留

2. 实战:用户 + 订单统计

-- 查用户姓名及对应订单数(无订单也显示)
SELECT 
  c.customer_id,
  c.first_name,
  COUNT(p.payment_id) AS 订单数
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
GROUP BY c.customer_id, c.first_name;

七、窗口函数(高级分析,MySQL 8.0+)

1. 排名函数

-- 按支付金额排名
SELECT 
  payment_id,
  customer_id,
  amount,
  RANK() OVER (ORDER BY amount DESC) AS 排名
FROM payment;

2. 累计求和

-- 按日期累计销售额
SELECT 
  DATE(payment_date) AS 日期,
  amount,
  SUM(amount) OVER (ORDER BY payment_date) AS 累计销售额
FROM payment;

3. 分组内统计

-- 每个用户的支付占其总支付的比例
SELECT 
  customer_id,
  amount,
  amount / SUM(amount) OVER (PARTITION BY customer_id) AS 占比
FROM payment;

八、业务实战:销售数据分析

目标

统计2005年各月销售额、同比/环比(简化版)

SELECT 
  YEAR(payment_date) AS 年份,
  MONTH(payment_date) AS 月份,
  SUM(amount) AS 月销售额
FROM payment
WHERE YEAR(payment_date) = 2005
GROUP BY 年份, 月份
ORDER BY 月份;

九、性能优化(必知)

  1. 索引:WHERE/JOIN/ORDER BY 字段建索引
    CREATE INDEX idx_payment_date ON payment(payment_date);
    
  2. **避免 SELECT ***:只查需要列
  3. 用 EXPLAIN 分析慢查询
    EXPLAIN SELECT * FROM payment WHERE amount > 10;
    

posted @ 2026-05-13 22:14  小帅记事  阅读(10)  评论(0)    收藏  举报