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语句编写到结果返回的完整执行链路,以及各子句在其中的位置:

SQL查询执行流程与子句对应关系 SQL查询执行流程与子句对应关系 ① FROM 定位数据表 ② WHERE 行级过滤 ③ SELECT 选择列/计算 ④ DISTINCT 去重处理 ⑤ ORDER BY 排序结果 ⑥ LIMIT 限制行数 结果集 💡 执行顺序说明: • 数据库先读取 FROM 指定的表,再通过 WHERE 过滤行,然后执行 SELECT 投影。 • DISTINCT 在 SELECT 之后对结果去重,ORDER BY 在去重后排序,LIMIT 最后截取。 • 理解此顺序有助于优化查询性能,避免不必要的全表扫描。

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)调整。
课后练习: 在已创建的 kpi_dashboard 数据库中,创建一张 sales 表(包含 order_id, product_name, amount, order_date 字段),插入5条测试数据,然后编写查询:
1. 查询金额大于100的订单,按金额降序排列,只取前3条。
2. 查询不重复的产品名称。
3. 查询2024年1月1日之后的订单,按日期升序排列。