记住一个点: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 产品数。

两条红线(最容易错,记住):

    1. WHERE 里不能写聚合函数。WHERE COUNT(prod_id) >= 2 是错的 —— 因为 WHERE 是分组前逐行过滤,此时还没统计。聚合条件的归宿是 HAVING。
    1. 聚合函数和普通列混用时,普通列必须出现在 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 把结果摆出来”。