摘要:
记录MySQL零碎知识。
1. MySQL语句执行顺序
顺口溜:
哪里
WHERE
组队GROUP BY
有HAVING
顺序ORDER BY
限制LIMIT
从一个非常聪明的小伙伴那里学来,可以说是非常绝绝子了。
注意包括但不仅限于 FROM
ON
JOIN
这种虚表创建的基础语句当然优先级最高。
2. 对 GROUP BY 的理解
GROUP BY 单个字段
对于每条记录合并分组,确保该字段每组值唯一,构建虚表。
对于虚表中的每条记录,该字段对应值是唯一的,而其他所有字段值则分别构成容器(不去重)。因为其他字段可能存在重复,所以使用 SELECT 查询虚表时,只能使用聚合函数如 SUM
, AVG
等等对容器进行操作。
举例:对于数据库 name_table
id | name |
---|---|
1 | a |
2 | b |
3 | b |
执行 GROUP BY name
后形成虚表 name_table_virtual
id | name |
---|---|
1 | a |
2, 3 | b |
对虚表执行 SELECT
筛选操作:SELECT COUNT(id) as cnt, name from name_table GROUP BY name WHERE name = 'b';
结果:
cnt | name |
---|---|
2 | b |
注意,这里如果执行 COUNT(name)
数量依旧是 2
,因为虽然被 GROUP BY
的字段在虚表中值唯一,但是记录依然是两条。COUNT
计算的是记录数量而不是值数量。
GROUP BY 多个字段
对于每条记录合并分组,确保该多个字段看成一个整体后每组值唯一,构建虚表。
对于虚表中的每条记录,改多个字段构成一个整体后,值唯一。而其他所有字段值则分别构成容器(不去重)。因为其他字段可能存在重复,所以使用 SELECT
查询虚表时,只能使用聚合函数如 SUM
, AVG
等等对容器进行操作。
举例:对于数据库 info_table
id | name | title |
---|---|---|
1 | a | m |
2 | b | n |
3 | a | m |
执行 GROUP BY name, title
后形成虚表 info_table_virtual
id | name | title |
---|---|---|
1,3 | a | m |
2 | b | n |
对虚表执行 SELECT
筛选操作:SELECT COUNT(id) as cnt, name, title from info_table GROUP BY name, title;
结果:
cnt | name | title |
---|---|---|
2 | a | m |
1 | b | n |