SQL零基础入门:这10个语句解决80%的数据查询问题(详细代码注释)

张开发
2026/4/13 10:20:05 15 分钟阅读

分享文章

SQL零基础入门:这10个语句解决80%的数据查询问题(详细代码注释)
前言船长在数据分析这行干了快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用LIMITSQL Server用TOP NOracle用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(*)统计所有行含NULLCOUNT(字段名)只统计该字段非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的就用WHEREWHERE过滤效率更高先减少数据量再分组九、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 BYCASE 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的朋友。数据分析这条路越早入门越早受益。

更多文章