记住一个点:SELECT 不是只能放列名,它能放 “一切你想让它显示出来的结果”—— 包括算出来的数字、统计出来的数字。
完整语法骨架(方括号 [ ] 表示 “可写可不写”,顺序固定):
SELECT [DISTINCT] 要显示的内容
FROM 表名
[WHERE 逐行过滤条件]
[GROUP BY 分组依据]
[HAVING 分组后的过滤条件]
[ORDER BY 排序依据 [ASC / DESC]]
[LIMIT 取前几行];
SELECT 那一行能放 4 类东西:
表格
-
类型|例子|说明
-
普通列|
prod_name|直接取字段 -
多列|
prod_id, prod_name|逗号分隔 -
计算表达式|
quantity * item_price|现场算出来的值 -
聚合函数|
COUNT(prod_id)、SUM(quantity)、AVG(prod_price)、MAX(prod_price)、MIN(prod_price)|对一组数据统计
以上都能用 AS 起别名,比如 COUNT(prod_id) AS 产品数。
两条红线(最容易错,记住):
-
WHERE里不能写聚合函数。WHERE COUNT(prod_id) >= 2是错的 —— 因为 WHERE 是分组前逐行过滤,此时还没统计。聚合条件的归宿是 HAVING。
-
- 聚合函数和普通列混用时,普通列必须出现在
GROUP BY里:
- 聚合函数和普通列混用时,普通列必须出现在
-
SELECT vend_id, COUNT(prod_id) FROM products GROUP BY vend_id✅ -
SELECT vend_id, COUNT(prod_id) FROM products❌(没分组却要按供应商统计,逻辑不成立)
例题:
统计每个供应商名下各有几种产品,只显示种类数 ≥ 2 的,按种类数从多到少排。
SELECT vend_id, COUNT(prod_id) AS 产品数
FROM products
GROUP BY vend_id
HAVING COUNT(prod_id) >= 2
ORDER BY COUNT(prod_id) DESC;
顺便理解执行顺序:SQL 虽然先写 SELECT,但内部执行顺序是 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。所以 “按供应商分组统计” 这种话,翻译成代码就是 “先 FROM 拿表,再 GROUP BY 分组,再 HAVING 筛组,最后 SELECT 把结果摆出来”。