2. SQL基础回顾(一):SELECT、FROM、WHERE、DISTINCT、ORDER BY、LIMIT,以及MySQL/PostgreSQL环境准备
在构建KPI指标看板之前,必须掌握SQL查询的核心基础。本章将系统回顾最常用的6个查询子句,并完成MySQL与PostgreSQL两种主流数据库的环境搭建。这些知识是后续所有看板数据查询的基石。
2.1 环境准备:MySQL与PostgreSQL安装与验证
本课程支持两种数据库环境,你可以根据项目需要选择其一。以下为快速安装与验证步骤:
| 步骤 | MySQL (8.0+) | PostgreSQL (15+) |
|---|---|---|
| 1. 下载安装 | 官网下载MySQL Installer,选择Developer Default | 官网下载PostgreSQL安装包,勾选pgAdmin |
| 2. 启动服务 | net start mysql80 (Windows) / systemctl start mysqld (Linux) |
pg_ctl start (Windows) / systemctl start postgresql (Linux) |
| 3. 登录验证 | mysql -u root -p |
psql -U postgres |
| 4. 创建测试库 | CREATE DATABASE kpi_dashboard; |
CREATE DATABASE kpi_dashboard; |
| 5. 查看版本 | SELECT VERSION(); |
SELECT VERSION(); |
提示: 本课程所有SQL示例均兼容MySQL与PostgreSQL,仅在分页语法(LIMIT / FETCH)和字符串函数上存在细微差异,我们会单独标注。
2.2 SELECT 与 FROM:数据检索的起点
SELECT 指定要查询的列,FROM 指定数据来源表。这是最基础的查询结构。
-- 查询所有列
SELECT * FROM orders;
-- 查询指定列
SELECT order_id, customer_name, order_amount FROM orders;
-- 查询时使用别名(AS)
SELECT order_id AS "订单编号", order_amount AS "订单金额" FROM orders;
看板应用场景: 在KPI看板中,
SELECT 用于从销售表、用户表、流量表中提取指标原始字段,如 SELECT revenue, user_count, page_views FROM daily_stats。
2.3 WHERE:精确过滤数据行
WHERE 子句用于按条件筛选行,支持比较运算符、逻辑运算符和范围判断。
-- 单条件过滤
SELECT * FROM orders WHERE order_amount > 1000;
-- 多条件组合(AND / OR)
SELECT * FROM orders
WHERE order_status = '已完成'
AND order_date >= '2024-01-01';
-- 范围查询(BETWEEN)
SELECT * FROM orders
WHERE order_amount BETWEEN 500 AND 2000;
-- 集合匹配(IN)
SELECT * FROM customers
WHERE city IN ('北京', '上海', '广州');
2.4 DISTINCT:消除重复行
DISTINCT 用于返回唯一不同的值,常用于统计不重复的用户数、品类数等KPI。
-- 查询所有不重复的城市
SELECT DISTINCT city FROM customers;
-- 多列去重:组合值唯一
SELECT DISTINCT city, region FROM customers;
-- 统计不重复用户数(配合COUNT)
SELECT COUNT(DISTINCT user_id) AS unique_users FROM page_views;
注意:
DISTINCT 作用于所有选中的列,不是只作用于第一列。多列去重时,只有当所有列的组合完全相同时才视为重复。
2.5 ORDER BY:排序结果集
ORDER BY 按指定列对结果排序,ASC 升序(默认),DESC 降序。排序是看板中“Top N”和“趋势图”的基础。
-- 单列降序排序
SELECT product_name, sales_amount
FROM products
ORDER BY sales_amount DESC;
-- 多列排序:先按销售额降序,再按产品名称升序
SELECT product_name, sales_amount, category
FROM products
ORDER BY sales_amount DESC, product_name ASC;
-- 按表达式排序
SELECT product_name, (price * quantity) AS total_revenue
FROM order_details
ORDER BY total_revenue DESC;
2.6 LIMIT:限制返回行数
LIMIT 用于限制查询返回的行数,在分页和Top KPI指标提取中高频使用。
-- MySQL / PostgreSQL 通用语法
SELECT * FROM products ORDER BY sales_amount DESC LIMIT 10;
-- 带偏移量的分页查询(MySQL)
SELECT * FROM products ORDER BY product_id LIMIT 10 OFFSET 20;
-- PostgreSQL 专用分页语法(FETCH)
SELECT * FROM products ORDER BY product_id
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
看板应用: “销售额Top 10产品”、“最近7天新增用户”、“页面访问量前5的渠道”等KPI卡片,均依赖
ORDER BY + LIMIT 组合。
2.7 六种子句执行顺序与组合示例
理解SQL子句的逻辑执行顺序,是写出高效查询的关键。以下为完整执行流程:
SQL执行顺序: FROM → WHERE → SELECT → DISTINCT → ORDER BY → LIMIT
-- 完整组合示例:查询2024年销售额最高的5个产品
SELECT DISTINCT product_name, SUM(sales_amount) AS total_sales
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY product_name
ORDER BY total_sales DESC
LIMIT 5;
(注:GROUP BY 将在下一章详细讲解,此处仅展示完整查询结构。)
2.8 核心子句对比速查表
| 子句 | 作用 | 必填/可选 | 执行顺序 | 看板典型用途 |
|---|---|---|---|---|
| SELECT | 指定返回列 | 必填 | 3 | 提取指标字段(销售额、用户数) |
| FROM | 指定数据源表 | 必填 | 1 | 指定KPI数据表 |
| WHERE | 行级过滤 | 可选 | 2 | 按时间、地区、状态过滤 |
| DISTINCT | 去重 | 可选 | 4 | 统计不重复用户/产品数 |
| ORDER BY | 排序 | 可选 | 5 | Top N排名、趋势排序 |
| LIMIT | 限制行数 | 可选 | 6 | 分页、Top KPI卡片 |
2.9 SQL查询执行流程SVG图
下图展示了从SQL语句编写到结果返回的完整执行链路,以及各子句在其中的位置:
2.10 常见错误与避坑指南
- SELECT * 滥用: 在生产看板中应明确指定列名,避免返回不必要字段影响性能。
- WHERE 与 HAVING 混淆: WHERE 过滤行,HAVING 过滤分组后的结果,两者不可互换。
- DISTINCT 与 ORDER BY 冲突: 当 DISTINCT 和 ORDER BY 同时使用时,ORDER BY 的列必须在 SELECT 列表中。
- LIMIT 与 OFFSET 性能: 大偏移量分页时(如 OFFSET 100000),数据库仍需扫描大量行,建议使用游标或键集分页。
- NULL 值排序: 默认 NULL 在升序中排在最前,降序中排在最后。可使用
ORDER BY col NULLS LAST(PostgreSQL)调整。
课后练习: 在已创建的
1. 查询金额大于100的订单,按金额降序排列,只取前3条。
2. 查询不重复的产品名称。
3. 查询2024年1月1日之后的订单,按日期升序排列。
kpi_dashboard 数据库中,创建一张 sales 表(包含 order_id, product_name, amount, order_date 字段),插入5条测试数据,然后编写查询:1. 查询金额大于100的订单,按金额降序排列,只取前3条。
2. 查询不重复的产品名称。
3. 查询2024年1月1日之后的订单,按日期升序排列。