前言
船长在数据分析这行干了快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 '小单(<5千)' END AS '订单等级', COUNT(*) AS '订单数', SUM(total_amount) AS '总金额' FROM orders WHERE status != '已取消' GROUP BY 订单等级 ORDER BY 总金额 DESC;实战场景:用户分层(新客/老客/VIP)、金额分级、状态翻译。CASE WHEN是SQL中最灵活的工具之一。
十、日期函数 —— 时间维度分析
用途:按时间维度拆解数据,做同比、环比、日/周/月报。
-- ============================================ -- 10. 日期函数(MySQL) -- 公主号:船长Talk -- ============================================ -- 获取当前日期和时间 SELECT CURDATE() AS '当前日期', -- 2026-04-13 CURTIME() AS '当前时间', -- 02:44:00 NOW() AS '当前日期时间'; -- 2026-04-13 02:44:00 -- 日期格式化 -- 常用格式:%Y年 %m月 %d日 SELECT order_date, DATE_FORMAT(order_date, '%Y年%m月') AS '年月', DATE_FORMAT(order_date, '%Y-%m-%d') AS '格式化日期' FROM orders GROUP BY DATE_FORMAT(order_date, '%Y年%m月'); -- 按月统计销售额(月报场景) SELECT DATE_FORMAT(order_date, '%Y年%m月') AS '月份', COUNT(*) AS '订单数', SUM(total_amount) AS '月销售额' FROM orders WHERE status != '已取消' GROUP BY 月份 ORDER BY 月份; -- 日期计算 -- 查最近7天的订单 SELECT * FROM orders WHERE order_date >= 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的朋友。数据分析这条路,越早入门,越早受益。