VIRTUALS

the virtual labs for the virtuals

0%

MySQL妙妙屋

摘要:
记录MySQL零碎知识。

1. MySQL语句执行顺序

顺口溜:

哪里 WHERE 组队 GROUP BYHAVING 顺序 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

3. TODO