news 2026/4/29 9:25:55

SQL入门必学:10大基础语句完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL入门必学:10大基础语句完整指南

前言

船长在数据分析这行干了快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的朋友。数据分析这条路,越早入门,越早受益。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 15:03:13

斑马打印机状态监控进阶:不用SDK也能获取打印状态的3种野路子

斑马打印机状态监控进阶&#xff1a;不用SDK也能获取打印状态的3种野路子 在工业自动化、物流仓储等场景中&#xff0c;斑马打印机&#xff08;Zebra Printer&#xff09;的稳定运行至关重要。然而&#xff0c;当遇到老旧系统无法安装官方SDK、网络环境受限或需要快速应急处理时…

作者头像 李华
网站建设 2026/4/16 15:00:14

ZYNQ7000 uboot SPL引导与FPGA动态加载实战解析

1. ZYNQ7000启动流程与传统方案的痛点 第一次接触ZYNQ7000时&#xff0c;我被官方推荐的启动流程绕晕了——每次修改uboot或FPGA程序都要重新生成BOOT.BIN&#xff0c;就像每次换灯泡都得重装整个电路系统。这种设计在快速迭代的开发阶段简直让人抓狂。后来发现用uboot SPL替代…

作者头像 李华
网站建设 2026/4/16 14:53:31

雀魂Mod Plus:免费解锁全角色皮肤的终极指南

雀魂Mod Plus&#xff1a;免费解锁全角色皮肤的终极指南 【免费下载链接】majsoul_mod_plus 雀魂解锁全角色、皮肤、装扮等&#xff0c;支持全部服务器。 项目地址: https://gitcode.com/gh_mirrors/ma/majsoul_mod_plus 还在为无法获得心仪的雀魂角色而烦恼吗&#xff…

作者头像 李华
网站建设 2026/4/16 14:51:12

Adobe Source Sans 3:现代UI设计的终极免费字体解决方案

Adobe Source Sans 3&#xff1a;现代UI设计的终极免费字体解决方案 【免费下载链接】source-sans Sans serif font family for user interface environments 项目地址: https://gitcode.com/gh_mirrors/so/source-sans Adobe Source Sans 3是专为数字界面环境优化的开源…

作者头像 李华
网站建设 2026/4/16 14:49:47

如何在Windows上快速搭建虚拟游戏手柄系统:vJoy完整配置教程

如何在Windows上快速搭建虚拟游戏手柄系统&#xff1a;vJoy完整配置教程 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 想要在Windows系统上模拟专业游戏控制器&#xff0c;却不想购买昂贵的硬件设备&#xff1f;vJoy虚拟摇…

作者头像 李华
网站建设 2026/4/16 14:47:27

Elcomsoft Quick Triage: Windows 10/11 事件日志的取证分析

数字取证与事件响应这门学科从根本上依赖于合法用户和恶意行为者留下的持久性、系统性的痕迹。Windows 事件日志系统作为操作系统活动的主要时序记录&#xff0c;捕获安全事件、应用程序行为、服务和驱动程序活动以及用户身份验证遥测数据。由于 Windows 10 和 Windows 11 产生…

作者头像 李华