京公网安备 11010802034615号
经营许可证编号:京B2-20210330
你有没有想过,手机里点外卖、刷社交软件、转一笔账,背后到底是谁在替你"记着账"?
答案其实很简单:数据库,以及跟它对话的那门语言——SQL。
这篇文章就是为完全没接触过数据库的你写的。跟着读下去,你会明白 SQL 到底是什么、为什么它和 Python、JavaScript 不一样、最常用的几条命令怎么写,以及怎样用 4 周时间从零基础练到能应付大多数技术面试。
SQL(Structured Query Language,结构化查询语言)是用来和数据库"说话"的语言。
几乎所有存数据的应用,背后都跑着 SQL——社交平台、银行系统,甚至是你中午用来点午餐的那个 App。
和大多数编程语言不同,SQL 不负责画界面,也不负责写算法。它的使命很纯粹:向数据提问,并得到精确的答案。
只要你能用中文把问题说清楚,你就能学会用 SQL 把它"翻译"出来。
如果你学过 JavaScript 或 Python,刚接触 SQL 会觉得它"怪怪的"。但恰恰是这种"怪",对初学者非常友好。
SQL 是声明式的语言:你描述"想要什么",而不是"怎么得到它"。
在 JavaScript 里,你可能会写一个循环去过滤数组;在 SQL 里,你只要写一句 WHERE 条件,剩下的"怎么高效找到这些行"交给数据库自己去操心。
这让 SQL 在很多方面都更好学。基本操作都很直观,语法读起来几乎像英语:
SELECT name, email
FROM users
WHERE age > 25
ORDER BY name;
就算你完全不懂 SQL,大概也能猜出这句在干嘛:把 25 岁以上用户的姓名和邮箱取出来,按字母顺序排列。
你这辈子会写到的每一条 SQL 查询,几乎都是由下面这五个操作搭出来的。把它们练熟,绝大多数数据问题你都能答上来。
SELECT 用来指定你想看哪些列。
-- 取出所有列
SELECT * FROM products;
-- 只取特定列
SELECT name, price FROM products;
-- 给输出列改个名字
SELECT name AS product_name,
price AS unit_price
FROM products;
WHERE 把结果缩小到符合某个条件的行。
-- 精确匹配
SELECT * FROM users WHERE city = 'New York';
-- 大小比较
SELECT * FROM products WHERE price > 50;
-- 多个条件
SELECT * FROM users
WHERE age >= 18 AND city = 'London';
-- 模糊匹配
SELECT * FROM users
WHERE email LIKE '%@gmail.com';
-- 列表匹配
SELECT * FROM orders
WHERE status IN ('pending', 'processing');
真实的数据库会把数据分散在多张表里,JOIN 负责把它们合到一起。
想象有两张表:users(id, name, email)和 orders(id, user_id, total, date)。想看"谁买了什么":
SELECT users.name, orders.total, orders.date
FROM users
JOIN orders ON users.id = orders.user_id;
上面这是 INNER JOIN(内连接),只显示至少下过一单的用户。如果你想看到所有用户、包括没下过单的:
SELECT users.name, orders.total
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
没有订单的用户,在 total 这一列会显示 NULL。
GROUP BY 把行"折叠"成一个个分组,让你能计算聚合结果。
-- 统计每个城市的用户数
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city;
-- 每个客户的平均订单金额
SELECT user_id, AVG(total) AS avg_order
FROM orders
GROUP BY user_id;
-- 每个月的营收总额
SELECT DATE_TRUNC('month', date) AS month,
SUM(total) AS revenue
FROM orders
GROUP BY DATE_TRUNC('month', date)
ORDER BY month;
ORDER BY 负责安排输出的顺序。
-- 按字母排
SELECT * FROM users ORDER BY name;
-- 价格从高到低
SELECT * FROM products ORDER BY price DESC;
-- 多个排序键
SELECT * FROM users ORDER BY city, name;
-- 只取前 10 条
SELECT * FROM products
ORDER BY price DESC
LIMIT 10;
初学者最容易犯的错,就是想一口气写出一条超复杂的查询。正确的做法,是一层一层往上叠:
问题:"2025 年总营收最高的前 5 个城市是哪些?"
第 1 步:先看原始数据。
SELECT * FROM orders;
第 2 步:筛出 2025 年的。
SELECT * FROM orders
WHERE date >= '2025-01-01' AND date < '2026-01-01';
第 3 步:连上 users 表,拿到城市信息。
SELECT users.city, orders.total
FROM orders
JOIN users ON orders.user_id = users.id
WHERE orders.date >= '2025-01-01'
AND orders.date < '2026-01-01';
第 4 步:按城市分组,把金额加起来。
SELECT users.city, SUM(orders.total) AS revenue
FROM orders
JOIN users ON orders.user_id = users.id
WHERE orders.date >= '2025-01-01'
AND orders.date < '2026-01-01'
GROUP BY users.city;
第 5 步:排序并取前 5。
SELECT users.city, SUM(orders.total) AS revenue
FROM orders
JOIN users ON orders.user_id = users.id
WHERE orders.date >= '2025-01-01'
AND orders.date < '2026-01-01'
GROUP BY users.city
ORDER BY revenue DESC
LIMIT 5;
每一步都能单独运行、验证结果是否合理,再往上加下一层。这种"搭积木"的写法,比憋大招稳得多。
WHERE 是在分组之前过滤单行;HAVING 是在分组之后过滤分组。
-- 错:WHERE 不能直接用聚合函数
SELECT city, COUNT(*) FROM users
WHERE COUNT(*) > 10
GROUP BY city;
-- 对:用 HAVING 在 GROUP BY 之后过滤
SELECT city, COUNT(*) FROM users
GROUP BY city
HAVING COUNT(*) > 10;
NULL 不等于 0,也不等于空字符串。它表示"未知"或"缺失"。
-- 这样查不到 phone 为 NULL 的行(错误!)
SELECT * FROM users WHERE phone = NULL;
-- 正确写法
SELECT * FROM users WHERE phone IS NULL;
两张表都有同名列时,必须指明你指的是哪张表的列。
-- 有歧义(到底是哪个 id?)
SELECT id, name FROM users JOIN orders ON users.id = orders.user_id;
-- 写清楚
SELECT users.id, users.name FROM users JOIN orders ON users.id = orders.user_id;
别名让查询更短、更易读,尤其在 JOIN 多张表时。
-- 不用别名(啰嗦)
SELECT users.name, orders.total
FROM users
JOIN orders ON users.id = orders.user_id;
-- 用别名(清爽)
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id;
同样是 SQL,不同岗位用起来侧重点不一样。
数据分析师主要用 SQL 来:
核心技能:复杂的 JOIN、窗口函数、CTE(公用表表达式)、日期处理、聚合。
后端开发主要用 SQL 来:
不管你走哪条路,基本功都是一样的。把 SELECT、WHERE、JOIN、GROUP BY、ORDER BY 学透,两条路的地基就都打好了。
第 1 周:SELECT 和 WHERE
第 2 周:JOIN
第 3 周:聚合
第 4 周:子查询与进阶

数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
CDA数据分析师 出品 作者:李诗怡 基础与单表查询 四大类语言 · 数据库基础 · DQL 单表查询 ” 一、SQL 四大类语言与数据 ...
2026-11-13核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-13核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-13一、问题从哪来 财务分析里算增长率,常规公式所有人都会写: 增长率本年数上年数上年数 这个公式在"上年为正"时完全成立。但一 ...
2026-11-12一、什么是加权聚类 普通聚类默认"每个样本、每个指标都同等重要":距离公式里每个样本权重都是 1,每个指标在距离计算里占比相 ...
2026-11-12“纲举目张,执本末从。”若想在数据分析领域有所收获,一套合适的学习教材至关重要。一套优质且契合需求的学习教材无疑是那关键 ...
2026-11-12一、需求从哪来 做 Excel 报表时,"从一个透视表取数据"这个需求通常有三种来源: 汇总页引用:明细透视表在另一个 sheet,汇总 ...
2026-11-11一、透视表的价值在哪 一句话概括:数据透视表把"写公式汇总"变成了"拖字段看结果"。 传统做法要写 SUMIFS、COUNTIFS,改一个维 ...
2026-11-11核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-11一、回归分析到底在解决什么问题 很多人学回归分析,是从公式开始的:最小二乘法、残差平方和、R²、t 检验。公式记住了,但一到 ...
2026-11-10一、等级聚类法是什么 等级聚类法(Hierarchical Clustering),中文也叫系统聚类法、层次聚类法,是聚类分析里最经典的一类方法 ...
2026-11-10考试范围 PART 1 大数据基础理论 占比(8% ) a. 大数据分析基础(1%) b. Python 基础(5%) c. Linux & Ubuntu 操作系统基 ...
2026-11-10一、业务背景 在后台列表、管理系统、报表页面的分页需求里,前端通常需要两份数据:当前页的分页记录、符合筛选条件的数据总条 ...
2026-11-09一、需求看起来简单,实际坑不少 "把文本里所有中括号 [] 中间的内容提取出来"——这是文本清洗里最常见的需求之一。日志里的 [I ...
2026-11-09大数据分析师证书考什么 考试范围 PART 1 大数据基础理论 占比(8% ) a. 大数据分析基础(1%) b. Python 基础(5%) c. Li ...
2026-11-09CDA数据分析师 出品 作者:李诗怡 一、数据处理概述 定义: 在正式开展数据分析之前,对原始采集的数据进行整理、修正、加工和精 ...
2026-11-06一、为什么数据要先标准化 拿到一份数据,各列的量纲往往完全不同:年龄单位是"岁"(约 20~60),收入单位是"元"(几千到几万) ...
2026-11-06一、为什么 Python 成了统计分析的主流工具 十年前做统计分析,主流选择是 SPSS、SAS、Stata。现在越来越多的研究者、分析师转向 ...
2026-11-06核心资源推荐 CDA教材(2025):https://edu.cda.cn/goods/show/3151CDA模拟题(2025):https://edu.cda.cn/goods/show/2845CD ...
2026-11-06“大学生必备证书有哪些”最容易被答成一张越长越好的清单。但校招筛选的真实逻辑是:证书要对应你投的岗位任务,并且在校期间确 ...
2026-11-05