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

0 阅读11分钟

前言

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