前言
船长在数据分析这行干了快10年,用过无数SQL。
每次带新人,被问最多的问题是:"SQL到底怎么学?从哪开始?"
今天这篇,就是给零基础同学准备的。10个最常用的SQL语句,覆盖你80%的日常查询需求。每段代码都有详细注释,建议收藏。
先说结论:学好这10个语句,你就能独立完成大部分数据分析工作。
〇、建表准备(后续所有例子都用这张表)
先创建一张电商订单表,后续所有SQL都基于这张表来写。
-- ============================================
-- 电商订单表 orders
-- 公主号:船长Talk
-- ============================================
CREATE TABLE orders (
order_id INT PRIMARY KEY COMMENT '订单ID',
customer VARCHAR(50) COMMENT '客户姓名',
product VARCHAR(100) COMMENT '商品名称',
category VARCHAR(50) COMMENT '商品分类',
price DECIMAL(10,2) COMMENT '单价',
quantity INT COMMENT '购买数量',
total_amount DECIMAL(10,2) COMMENT '订单总金额',
order_date DATE COMMENT '下单日期',
status VARCHAR(20) COMMENT '订单状态'
);
-- 插入测试数据
INSERT INTO orders VALUES
(1, '张三', 'iPhone 15', '手机', 7999.00, 1, 7999.00, '2026-04-01', '已发货'),
(2, '李四', 'MacBook Pro', '电脑', 14999.00, 1,14999.00, '2026-04-01', '已完成'),
(3, '张三', 'AirPods Pro', '配件', 999.00, 2, 1998.00, '2026-04-02', '已完成'),
(4, '王五', 'iPhone 15', '手机', 7999.00, 1, 7999.00, '2026-04-02', '待发货'),
(5, '赵六', 'iPad Air', '平板', 4799.00, 2, 9598.00, '2026-04-03', '已取消'),
(6, '李四', 'Apple Watch', '配件', 2999.00, 1, 2999.00, '2026-04-03', '已完成'),
(7, '张三', 'MacBook Pro', '电脑', 14999.00, 1,14999.00, '2026-04-04', '待发货'),
(8, '王五', 'Magic Keyboard', '配件', 1999.00, 1, 1999.00, '2026-04-05', '已发货'),
(9, '赵六', 'iPhone 15', '手机', 7999.00, 1, 7999.00, '2026-04-05', '已完成'),
(10, '张三', 'HomePod mini', '配件', 749.00, 2, 1498.00, '2026-04-06', '已完成');
这张表有10条数据、9个字段,涵盖了订单分析中最常见的场景。
一、SELECT —— 查询指定列
**用途:**从表中选取你想要的列。这是SQL的起点,所有查询都从SELECT开始。
-- ============================================
-- 1. SELECT 查询指定列
-- 公主号:船长Talk
-- ============================================
-- 查询所有列(*代表全部列)
SELECT * FROM orders;
-- 只查询需要的列(推荐:养成好习惯,只查需要的列)
SELECT
order_id,
customer,
product,
total_amount
FROM orders;
-- 用 AS 给列起别名(让结果更易读)
SELECT
customer AS '客户姓名',
product AS '商品名称',
total_amount AS '订单金额'
FROM orders;
**实战建议:**生产环境中尽量不要用 SELECT *,明确列出需要的列,查询效率更高,也更安全。
二、WHERE —— 条件筛选
**用途:**按条件过滤数据。你不需要所有数据,只需要满足条件的那部分。
-- ============================================
-- 2. WHERE 条件筛选
-- 公主号:船长Talk
-- ============================================
-- 等值查询:查张三的所有订单
SELECT * FROM orders
WHERE customer = '张三';
-- 数值比较:查订单金额大于5000的订单
SELECT * FROM orders
WHERE total_amount > 5000;
-- 多条件组合:AND(同时满足)/ OR(满足其一)
-- 查张三且金额大于5000的订单
SELECT * FROM orders
WHERE customer = '张三' AND total_amount > 5000;
-- 查手机或电脑类别的订单
SELECT * FROM orders
WHERE category IN ('手机', '电脑');
-- 范围查询:查4月1日到4月4日的订单
SELECT * FROM orders
WHERE order_date BETWEEN '2026-04-01' AND '2026-04-04';
-- 模糊匹配:查商品名包含"Pro"的订单
SELECT * FROM orders
WHERE product LIKE '%Pro%';
常用运算符速查:
-
=等于 /!=或<>不等于 -
>大于 /<小于 />=/<= -
IN (值1, 值2)在集合内 -
BETWEEN x AND y在范围内(含边界) -
LIKE '%关键字%'模糊匹配(%是通配符) -
IS NULL/IS NOT NULL判空
三、ORDER BY —— 排序
**用途:**对查询结果排序。分析数据时,排序能帮你快速发现规律。
-- ============================================
-- 3. ORDER BY 排序
-- 公主号:船长Talk
-- ============================================
-- 按订单金额升序(ASC是默认,可以省略)
SELECT * FROM orders
ORDER BY total_amount ASC;
-- 按订单金额降序(DESC)
SELECT * FROM orders
ORDER BY total_amount DESC;
-- 多列排序:先按客户分组,再按金额降序
SELECT * FROM orders
ORDER BY customer ASC, total_amount DESC;
实战场景:"帮我看看消费最高的前5个订单"——排序+LIMIT组合。
四、LIMIT —— 限制结果数量
**用途:**只取前N条结果。常用于"TopN"查询。
-- ============================================
-- 4. LIMIT 限制结果数量
-- 公主号:船长Talk
-- ============================================
-- 取订单金额最高的3个订单
SELECT * FROM orders
ORDER BY total_amount DESC
LIMIT 3;
-- LIMIT + OFFSET:分页查询
-- OFFSET 3 表示跳过前3条,从第4条开始取3条(即第4-6条)
SELECT * FROM orders
ORDER BY total_amount DESC
LIMIT 3 OFFSET 3;
**注意:**MySQL用 LIMIT,SQL Server用 TOP N,Oracle用 ROWNUM。本文以MySQL为主。
五、DISTINCT —— 去重
**用途:**去除重复数据,只保留唯一值。
-- ============================================
-- 5. DISTINCT 去重
-- 公主号:船长Talk
-- ============================================
-- 查有多少个不同的客户
SELECT DISTINCT customer FROM orders;
-- 查有多少个不同的商品分类
SELECT DISTINCT category FROM orders;
-- 组合去重:查每个客户购买过的不同分类
SELECT DISTINCT customer, category FROM orders;
实战场景:"查一共有多少个活跃用户"——SELECT COUNT(DISTINCT customer) FROM orders;
六、COUNT / SUM / AVG / MAX / MIN —— 聚合函数
**用途:**对数据进行统计计算。这是数据分析的核心。
-- ============================================
-- 6. 聚合函数(COUNT/SUM/AVG/MAX/MIN)
-- 公主号:船长Talk
-- ============================================
-- COUNT:计数
-- 总订单数
SELECT COUNT(*) AS '总订单数' FROM orders;
-- 不重复的客户数
SELECT COUNT(DISTINCT customer) AS '客户数' FROM orders;
-- SUM:求和
-- 总销售额
SELECT SUM(total_amount) AS '总销售额' FROM orders;
-- AVG:平均值
-- 平均订单金额
SELECT ROUND(AVG(total_amount), 2) AS '平均订单金额' FROM orders;
-- MAX / MIN:最大值 / 最小值
-- 最高订单金额和最低订单金额
SELECT
MAX(total_amount) AS '最高订单金额',
MIN(total_amount) AS '最低订单金额'
FROM orders;
-- 组合使用:一次看多个指标
SELECT
COUNT(*) AS '订单总数',
COUNT(DISTINCT customer) AS '客户总数',
SUM(total_amount) AS '总销售额',
ROUND(AVG(total_amount), 2) AS '平均客单价',
MAX(total_amount) AS '最高客单价'
FROM orders
WHERE status != '已取消'; -- 排除已取消的订单
船长提示:COUNT(*) 统计所有行(含NULL),COUNT(字段名) 只统计该字段非NULL的行。
七、GROUP BY —— 分组统计
**用途:**按某个维度分组后聚合。和聚合函数配合使用,是数据分析最核心的组合。
-- ============================================
-- 7. GROUP BY 分组统计
-- 公主号:船长Talk
-- ============================================
-- 按客户分组:每个客户的订单数和总消费
SELECT
customer AS '客户',
COUNT(*) AS '订单数',
SUM(total_amount) AS '总消费',
ROUND(AVG(total_amount), 2) AS '平均客单价'
FROM orders
WHERE status != '已取消'
GROUP BY customer;
-- 按商品分类分组:每个品类的销售情况
SELECT
category AS '品类',
COUNT(*) AS '订单数',
SUM(total_amount) AS '品类销售额',
ROUND(AVG(total_amount), 2) AS '平均客单价'
FROM orders
GROUP BY category
ORDER BY 品类销售额 DESC;
-- 按日期分组:每天的订单量和销售额(日报场景)
SELECT
order_date AS '日期',
COUNT(*) AS '订单量',
SUM(total_amount) AS '日销售额'
FROM orders
WHERE status != '已取消'
GROUP BY order_date
ORDER BY 日期 ASC;
-- 多维度分组:客户+品类交叉分析
SELECT
customer AS '客户',
category AS '品类',
COUNT(*) AS '订单数',
SUM(total_amount) AS '消费金额'
FROM orders
GROUP BY customer, category
ORDER BY 客户 ASC, 消费金额 DESC;
**GROUP BY 铁律:**SELECT中出现的非聚合字段,必须出现在GROUP BY里。违反这条会报错。
八、HAVING —— 分组后过滤
**用途:**对GROUP BY分组后的结果进行筛选。WHERE过滤行,HAVING过滤组。
-- ============================================
-- 8. HAVING 分组后过滤
-- 公主号:船长Talk
-- ============================================
-- 查消费总额超过10000的客户
SELECT
customer AS '客户',
SUM(total_amount) AS '总消费'
FROM orders
WHERE status != '已取消'
GROUP BY customer
HAVING 总消费 > 10000;
-- 查订单数超过1个的客户
SELECT
customer AS '客户',
COUNT(*) AS '订单数'
FROM orders
GROUP BY customer
HAVING 订单数 > 1;
-- WHERE + HAVING 组合使用
-- 先过滤掉已取消订单(WHERE),再找出消费过万的客户(HAVING)
SELECT
customer AS '客户',
COUNT(*) AS '有效订单数',
SUM(total_amount) AS '有效消费总额'
FROM orders
WHERE status != '已取消' -- 第一步:过滤行(原始数据)
GROUP BY customer
HAVING 有效消费总额 > 10000; -- 第二步:过滤组(聚合结果)
关键区别:
-
WHERE在分组之前过滤,作用于原始行 -
HAVING在分组之后过滤,作用于聚合结果 -
能用WHERE的就用WHERE,WHERE过滤效率更高(先减少数据量再分组)
九、CASE WHEN —— 条件判断
**用途:**实现类似Excel中IF函数的效果,根据条件返回不同值。
-- ============================================
-- 9. CASE WHEN 条件判断
-- 公主号:船长Talk
-- ============================================
-- 给订单金额分级:大单/中单/小单
SELECT
customer AS '客户',
product AS '商品',
total_amount AS '金额',
CASE
WHEN total_amount >= 10000 THEN '大单'
WHEN total_amount >= 5000 THEN '中单'
ELSE '小单'
END AS '订单等级'
FROM orders;
-- 根据状态标记订单完成情况
SELECT
order_id AS '订单号',
status AS '原始状态',
CASE status
WHEN '已完成' THEN '✅ 已完成'
WHEN '已发货' THEN '📦 运输中'
WHEN '待发货' THEN '⏳ 处理中'
WHEN '已取消' THEN '❌ 已取消'
ELSE '未知状态'
END AS '状态说明'
FROM orders;
-- CASE WHEN + 聚合:统计各等级订单数量
SELECT
CASE
WHEN total_amount >= 10000 THEN '大单(>=1万)'
WHEN total_amount >= 5000 THEN '中单(5千-1万)'
ELSE '小单(= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
-- 查两个日期之间的天数差
SELECT
DATEDIFF('2026-04-06', '2026-04-01') AS '天数差'; -- 结果:5
-- 按星期几统计(周末促销分析)
SELECT
DAYNAME(order_date) AS '星期',
COUNT(*) AS '订单数',
SUM(total_amount) AS '销售额'
FROM orders
GROUP BY DAYNAME(order_date);
常用日期函数速查:
-
YEAR(日期)/MONTH(日期)/DAY(日期)— 提取年/月/日 -
DATE_FORMAT(日期, 格式)— 格式化日期 -
DATE_SUB(日期, INTERVAL n DAY/MONTH)— 日期减法 -
DATE_ADD(日期, INTERVAL n DAY/MONTH)— 日期加法 -
DATEDIFF(日期1, 日期2)— 两个日期差几天 -
DAYNAME(日期)— 星期几
十一、综合实战:电商运营日报
把前面10个语句组合起来,写一个完整的电商运营日报查询。
-- ============================================
-- 综合实战:电商运营日报
-- 公主号:船长Talk
-- ============================================
-- 1. 今日概览指标
SELECT
COUNT(*) AS '今日订单量',
COUNT(DISTINCT customer) AS '今日客户数',
SUM(total_amount) AS '今日销售额',
ROUND(AVG(total_amount), 2) AS '平均客单价'
FROM orders
WHERE order_date = CURDATE()
AND status != '已取消';
-- 2. 各品类销售排名
SELECT
category AS '品类',
COUNT(*) AS '订单数',
SUM(total_amount) AS '销售额',
ROUND(SUM(total_amount) /
(SELECT SUM(total_amount) FROM orders WHERE status != '已取消') * 100, 2
) AS '销售额占比%'
FROM orders
WHERE status != '已取消'
GROUP BY category
ORDER BY 销售额 DESC;
-- 3. 客户消费分层
SELECT
customer AS '客户',
COUNT(*) AS '订单数',
SUM(total_amount) AS '累计消费',
CASE
WHEN SUM(total_amount) >= 20000 THEN '👑 VIP客户'
WHEN SUM(total_amount) >= 10000 THEN '⭐ 高价值客户'
WHEN SUM(total_amount) >= 5000 THEN '🌟 普通客户'
ELSE '🌱 新客'
END AS '客户等级'
FROM orders
WHERE status != '已取消'
GROUP BY customer
ORDER BY 累计消费 DESC;
十二、总结:10个语句速查表
语句
用途
使用频率
`SELECT`
查询指定列
⭐⭐⭐⭐⭐ 每条查询必用
`WHERE`
条件筛选
⭐⭐⭐⭐⭐ 几乎每条都有
`ORDER BY`
排序
⭐⭐⭐⭐⭐ 非常频繁
`LIMIT`
限制数量/分页
⭐⭐⭐⭐ 经常用
`DISTINCT`
去重
⭐⭐⭐⭐ 去重统计
`聚合函数`
COUNT/SUM/AVG/MAX/MIN
⭐⭐⭐⭐⭐ 数据分析核心
`GROUP BY`
分组统计
⭐⭐⭐⭐⭐ 分组分析核心
`HAVING`
分组后过滤
⭐⭐⭐ 配合GROUP BY
`CASE WHEN`
条件判断
⭐⭐⭐⭐ 分层/分级
`日期函数`
时间维度分析
⭐⭐⭐⭐⭐ 日报/月报必用
SQL执行顺序(记住这个顺序,写复杂查询不会乱):
-- SQL语句的执行顺序(不是书写顺序)
-- 1. FROM → 先确定数据来源(从哪张表)
-- 2. WHERE → 过滤行(原始数据筛选)
-- 3. GROUP BY → 分组
-- 4. HAVING → 过滤组(聚合结果筛选)
-- 5. SELECT → 选择输出列
-- 6. ORDER BY → 排序
-- 7. LIMIT → 限制数量
写在最后
10个语句,覆盖80%的日常查询需求。这不是夸张,是我近10年数据分析经验的真实总结。
下一步建议:
-
**动手实践:**建一张表,把上面每段代码都跑一遍
-
**进阶学习:**JOIN多表查询(下周更新)、子查询、窗口函数
-
**面试准备:**SQL面试50题(关注公主号,持续更新)
-- 公主号:船长Talk
-- 更多数据分析干货(SQL/Python/机器学习),持续更新
-- 有问题欢迎评论区留言,船长看到都会回复
觉得有用的话,点赞收藏,转给身边学SQL的朋友。数据分析这条路,越早入门,越早受益。