课程:B站大学
记录学习数仓开发,进阶数据分析和数据处理
sql语言基础
- [数据分析SQL基础入门笔记 | 从零基础到掌握核心查询语句](#数据分析SQL基础入门笔记 | 从零基础到掌握核心查询语句)
-
- 目录
- 一、SQL简介与工具安装
-
- [1.1 什么是SQL?](#1.1 什么是SQL?)
- [1.2 为什么数据分析师要学SQL?](#1.2 为什么数据分析师要学SQL?)
- [1.3 常用SQL工具介绍](#1.3 常用SQL工具介绍)
- 二、SQL语言基础语法
-
- [2.1 第一条SQL语句](#2.1 第一条SQL语句)
- [2.2 实际操作:查看表结构](#2.2 实际操作:查看表结构)
- [2.3 指定字段查询](#2.3 指定字段查询)
- [三、WHERE条件筛选与ORDER BY排序](#三、WHERE条件筛选与ORDER BY排序)
-
- [3.1 user表结构介绍](#3.1 user表结构介绍)
- [3.2 WHERE条件筛选](#3.2 WHERE条件筛选)
- [3.3 ORDER BY结果排序](#3.3 ORDER BY结果排序)
- [四、GROUP BY分组聚合与HAVING筛选](#四、GROUP BY分组聚合与HAVING筛选)
-
- [4.1 从Excel透视表理解SQL分组](#4.1 从Excel透视表理解SQL分组)
- [4.2 常用聚合函数](#4.2 常用聚合函数)
- [4.3 GROUP BY基本用法](#4.3 GROUP BY基本用法)
- [4.4 多字段分组](#4.4 多字段分组)
- [4.5 HAVING ------ 分组后的筛选](#4.5 HAVING —— 分组后的筛选)
- [4.6 SQL语句的执行顺序](#4.6 SQL语句的执行顺序)
- 五、SQL基础练习实战
-
- [5.1 练习题1:用户年龄分布统计](#5.1 练习题1:用户年龄分布统计)
- [5.2 练习题2:年龄分段统计](#5.2 练习题2:年龄分段统计)
- [5.3 练习题3:每日订单金额汇总](#5.3 练习题3:每日订单金额汇总)
- [5.4 练习题4:高价值订单筛选](#5.4 练习题4:高价值订单筛选)
- 六、学习总结与技巧
-
- [6.1 必背核心语法](#6.1 必背核心语法)
- [6.2 新手常见错误](#6.2 新手常见错误)
数据分析SQL基础入门笔记 | 从零基础到掌握核心查询语句
作为一名数据分析测试工程师,最近在系统学习SQL语言。这篇博客是我跟着B站数据分析课程(BV1AdeT6mEDS 第18-22集)整理的学习笔记,涵盖SQL入门、基础语法、条件筛选、分组聚合等核心知识点,有图有示例,适合零基础的小伙伴参考学习。
目录
- 一、SQL简介与工具安装
- 二、SQL语言基础语法
- [三、WHERE条件筛选与ORDER BY排序](#三、WHERE条件筛选与ORDER BY排序)
- [四、GROUP BY分组聚合与HAVING筛选](#四、GROUP BY分组聚合与HAVING筛选)
- 五、SQL基础练习实战
- 六、学习总结与技巧
一、SQL简介与工具安装
1.1 什么是SQL?
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库的标准编程语言。对于数据分析师来说,SQL是最核心的技能之一,主要用于:
- 数据提取:从数据库中查询所需的数据
- 数据清洗:过滤、转换、清洗原始数据
- 数据分析:聚合、分组、统计计算
- 数据报表:为可视化和报表提供数据支撑
1.2 为什么数据分析师要学SQL?
在实际工作中,数据通常存储在数据库或数据仓库中,而不是Excel里。作为数据分析师:
- 效率更高:相比Excel处理百万级数据,SQL查询速度快几个数量级
- 可复用:写好的SQL语句可以反复运行、自动化
- 行业标准:几乎所有互联网公司的数据分析岗位都要求掌握SQL
- 业务价值:直接从数据源取数,更接近业务本质
1.3 常用SQL工具介绍
课程中使用的是 Navicat 作为SQL客户端工具,这是一款非常流行的数据库管理工具,支持MySQL、PostgreSQL、Oracle等多种数据库。
Navicat基本操作流程:
- 连接到数据库服务器
- 选择目标数据库(课程中使用的是
learning数据库) - 点击"新建查询"打开SQL编辑器
- 编写SQL语句
- 按
Ctrl + R运行查询
二、SQL语言基础语法
2.1 第一条SQL语句
学习任何编程语言,都是从"Hello World"开始。SQL的第一条语句就是:查询整张表的数据。
sql
-- 查询order表的所有字段、所有行
SELECT * FROM `order`;
语法解析:
| 关键字 | 作用 |
|---|---|
SELECT |
指定要查询哪些字段 |
* |
代表表中的所有字段 |
FROM |
指定从哪张表查询数据 |
表名 |
用反引号包裹表名,避免和关键字冲突 |
; |
语句结束的标志,每条SQL语句末尾必须加分号 |
2.2 实际操作:查看表结构
在写复杂查询之前,首先要知道表里有哪些字段。课程中教了一个非常实用的技巧:先用 LIMIT 10 查看表的前10行数据。
sql
-- 先查看user表的前10行,了解表结构
SELECT * FROM `user` LIMIT 10;

为什么要用LIMIT?
- 直接
SELECT * FROM user会返回全表数据,可能有几百万行,非常慢 - 加上
LIMIT 10只返回前10行,既能看清表结构,又能快速执行
2.3 指定字段查询
知道了表结构后,就可以只查询需要的字段,而不是全部字段:
sql
-- 只查询user_id和city两个字段
SELECT user_id, city FROM `user`;
实战示例:
sql
-- 查询order表的order_id、order_date、sku、amount字段
SELECT order_id, order_date, sku, amount
FROM `order`;
三、WHERE条件筛选与ORDER BY排序
3.1 user表结构介绍
课程中使用了两张示例表:order(订单表)和 user(用户表)。
user表包含以下字段:
| 字段名 | 含义 | 示例 |
|---|---|---|
| user_id | 用户ID(主键) | 1001 |
| age | 用户年龄 | 25 |
| gender | 性别 | 男/女 |
| city | 所在城市 | 北京 |
| register_date | 注册日期 | 2023-01-15 |
| gold | 金币数量 | 100 |
| orders | 订单数 | 5 |
| amount | 消费金额 | 500.00 |
3.2 WHERE条件筛选
WHERE子句用于过滤数据,只返回满足条件的行。
基本语法:
sql
SELECT 字段1, 字段2
FROM 表名
WHERE 条件;
示例1:查询北京的用户
sql
-- 筛选city等于'北京'的用户
SELECT user_id, city
FROM `user`
WHERE city = '北京';
⚠️ 注意 :字符串类型的值需要用单引号包裹,而且要注意中英文输入法切换,避免用了中文引号导致报错。
示例2:IN操作符 ------ 查询多个城市的用户
sql
-- 查询北京、上海、广州的用户
SELECT user_id, city
FROM `user`
WHERE city IN ('北京', '上海', '广州');
示例3:NOT IN操作符 ------ 排除某些城市
sql
-- 查询不在北京、上海的用户
SELECT user_id, city
FROM `user`
WHERE city NOT IN ('北京', '上海');
示例4:比较运算符 ------ 筛选金额大于100的订单
sql
SELECT order_id, sku, amount
FROM `order`
WHERE amount > 100;
常用比较运算符:
| 运算符 | 含义 | 示例 |
|---|---|---|
= |
等于 | city = '北京' |
!= 或 <> |
不等于 | age != 18 |
> |
大于 | amount > 100 |
< |
小于 | amount < 50 |
>= |
大于等于 | age >= 18 |
<= |
小于等于 | age <= 30 |
3.3 ORDER BY结果排序
ORDER BY用于对查询结果进行排序,让数据按照我们想要的顺序展示。
基本语法:
sql
SELECT 字段列表
FROM 表名
WHERE 条件
ORDER BY 字段 [ASC|DESC];
ASC:升序(从小到大),默认值DESC:降序(从大到小)

示例1:单字段排序 ------ 按SKU升序排列
sql
SELECT order_id, order_date, sku, amount
FROM `order`
WHERE (sku >= 2 AND amount > 100)
OR (sku = 1 AND amount < 100)
ORDER BY sku; -- 默认升序
示例2:多字段排序 ------ 先按SKU升序,再按金额升序
sql
SELECT order_id, order_date, sku, amount
FROM `order`
WHERE (sku >= 2 AND amount > 100)
OR (sku = 1 AND amount < 100)
ORDER BY sku, amount; -- 多字段排序,依次排序
示例3:多字段不同排序方式 ------ SKU升序,金额降序
sql
SELECT order_id, order_date, sku, amount
FROM `order`
WHERE (sku >= 2 AND amount > 100)
OR (sku = 1 AND amount < 100)
ORDER BY sku ASC, amount DESC; -- ASC可省略,DESC必须写
💡 小技巧:ORDER BY后面可以跟多个字段,先用第一个字段排序,如果第一个字段相同,再用第二个字段排序。每个字段可以单独指定升序或降序。
四、GROUP BY分组聚合与HAVING筛选
4.1 从Excel透视表理解SQL分组
如果你用过Excel的数据透视表,那GROUP BY就很好理解了:
- Excel透视表:把明细数据按维度拖到行/列,自动汇总求和、计数、平均值
- SQL GROUP BY:按指定字段分组,然后用聚合函数统计每组的数据

4.2 常用聚合函数
SQL提供了丰富的聚合函数,比Excel透视表更强大:
| 聚合函数 | 作用 | 类比Excel |
|---|---|---|
COUNT() |
计数(行数) | COUNTIF |
SUM() |
求和 | SUM |
AVG() |
平均值 | AVERAGE |
MAX() |
最大值 | MAX |
MIN() |
最小值 | MIN |
COUNT(DISTINCT 字段) |
去重计数 | Excel没有直接对应 |
🚀 SQL的优势 :
COUNT(DISTINCT user_id)这种去重计数在Excel里操作比较麻烦,但在SQL里一行代码就搞定了。
4.3 GROUP BY基本用法
基本语法:
sql
SELECT 分组字段, 聚合函数(统计字段)
FROM 表名
WHERE 条件
GROUP BY 分组字段;
示例1:统计每个城市有多少用户
sql
-- 按city分组,统计每个城市的用户数
SELECT city, COUNT(user_id) AS user_count
FROM `user`
GROUP BY city;
示例2:统计每天的订单总金额
sql
-- 按order_date分组,计算每天的订单总金额
SELECT order_date, SUM(amount) AS daily_amount
FROM `order`
GROUP BY order_date;
4.4 多字段分组
GROUP BY后面也可以跟多个字段,实现更细粒度的分组:
示例:每个城市里不同年龄有多少人
sql
-- 先按城市分组,再按年龄分组
SELECT city, age, COUNT(user_id) AS user_count
FROM `user`
GROUP BY city, age;
4.5 HAVING ------ 分组后的筛选
WHERE是在分组前过滤行,HAVING是在分组后过滤组。这是初学者最容易混淆的地方!
WHERE vs HAVING 的区别:
| WHERE | HAVING | |
|---|---|---|
| 执行时机 | 分组前 | 分组后 |
| 作用对象 | 行数据 | 分组结果 |
| 能否用聚合函数 | ❌ 不能 | ✅ 能 |
| 位置 | FROM之后 | GROUP BY之后 |
示例:统计用户数大于100人的城市
sql
SELECT city, COUNT(user_id) AS user_count
FROM `user`
GROUP BY city
HAVING COUNT(user_id) > 100; -- 分组后筛选
对比:
- ❌ 错误写法:
WHERE COUNT(user_id) > 100------ WHERE不能用聚合函数 - ✅ 正确写法:
HAVING COUNT(user_id) > 100------ HAVING专门用于分组后筛选
4.6 SQL语句的执行顺序
理解SQL的执行顺序对写好SQL非常重要:
sql
-- 书写顺序
SELECT 字段, 聚合函数
FROM 表名
WHERE 行条件
GROUP BY 分组字段
HAVING 组条件
ORDER BY 排序字段;
-- 执行顺序
1. FROM → 确定从哪张表取数
2. WHERE → 过滤掉不符合条件的行
3. GROUP BY → 按字段分组
4. 聚合函数 → 计算每组的统计值
5. HAVING → 过滤掉不符合条件的组
6. SELECT → 选择要返回的字段
7. ORDER BY → 对结果排序
五、SQL基础练习实战
5.1 练习题1:用户年龄分布统计
需求: 统计2010年之后注册的用户,各年龄的用户数量,并按年龄排序。
sql
-- 先查看表结构(好习惯)
SELECT * FROM `user` LIMIT 10;
-- 统计2010年后注册的用户年龄分布
SELECT age, COUNT(user_id) AS user_count
FROM `user`
WHERE register_date >= '2010-01-01' -- 分组前过滤:只看2010年后注册的
GROUP BY age -- 按年龄分组
ORDER BY age; -- 按年龄升序排列
5.2 练习题2:年龄分段统计
问题: 按单一年龄统计的结果太零散了,每个年龄可能只有几个人,参考价值不高。
优化思路: 把年龄分成几个区间,按区间统计:
- 20-24岁
- 25-30岁
- 30岁以上
实现方式: 用CASE WHEN做分段(进阶内容,先了解概念)
sql
SELECT
CASE
WHEN age BETWEEN 20 AND 24 THEN '20-24岁'
WHEN age BETWEEN 25 AND 30 THEN '25-30岁'
WHEN age > 30 THEN '30岁以上'
ELSE '其他'
END AS age_group,
COUNT(user_id) AS user_count
FROM `user`
WHERE register_date >= '2010-01-01'
GROUP BY age_group
ORDER BY age_group;
5.3 练习题3:每日订单金额汇总
需求: 统计每天的订单总量和总金额。
sql
SELECT
order_date,
COUNT(order_id) AS order_count, -- 订单数
SUM(amount) AS total_amount, -- 总金额
AVG(amount) AS avg_amount -- 平均客单价
FROM `order`
GROUP BY order_date
ORDER BY order_date;
5.4 练习题4:高价值订单筛选
需求: 找出每个SKU类别中,金额大于100的订单,并按SKU和金额排序。
sql
SELECT
order_id,
order_date,
sku,
amount
FROM `order`
WHERE amount > 100
ORDER BY sku ASC, amount DESC;
六、学习总结与技巧
6.1 必背核心语法
sql
-- 完整的SQL查询模板
SELECT 字段1, 字段2, 聚合函数(字段3) AS 别名
FROM 表名
WHERE 行级筛选条件
GROUP BY 分组字段
HAVING 组级筛选条件
ORDER BY 排序字段 [ASC|DESC]
LIMIT 10;
6.2 新手常见错误
| 错误 | 原因 | 解决方法 |
|---|---|---|
| 中文引号/逗号 | 输入法没切换到英文 | 写SQL前切换英文输入法 |
| 漏写FROM | 初学者常犯 | 写完SELECT后马上写FROM |
| 表名/字段名拼错 | 不熟悉表结构 | 先 SELECT * FROM 表 LIMIT 10 查看 |
| WHERE用聚合函数 | 混淆WHERE和HAVING | 分组后的筛选用HAVING |
| 字符串没加单引号 | 数字不用,字符串要 | 文本类型的值用单引号包裹 |
SQL的核心思想其实就是:你想从哪里取数(FROM)→ 要哪些数据(SELECT)→ 筛选什么条件(WHERE/GROUP BY/HAVING)→ 怎么展示(ORDER BY)。想清楚这几个问题,SQL就写对了一半。