GROUP BY 聚合函数
TiDB 目前不支持任何 GROUP BY
修饰符,将来会提供支持,详情参阅 #4250。
当 SQL 模式 被禁用时,TiDB 与 MySQL 等效:允许 SELECT
列表、HAVING
条件或 ORDER BY
列表引用非聚合列,即使这些列在功能上不依赖于 GROUP BY
列。
例如,在 MySQL 5.7.5 中使用 的查询是不合规的,因为 SELECT
列表中的非聚合列 “b” 在 GROUP BY
中不显示:
假设我们执行以下查询,希望结果按 c
排序:
drop table if exists t;
create table t(a bigint, b bigint, c bigint);
insert into t values(1, 2, 1), (1, 2, 2), (1, 3, 1), (1, 3, 2);
select distinct a, b from t order by c;
要对结果进行排序,必须先清除重复。但选择保留哪一行会影响 c
的保留值,也会影响排序,并使其具有任意性。
在 MySQL 中,ORDER BY
表达式需至少满足以下条件之一,否则 DISTINCT
和 ORDER BY
查询将因不合规而被拒绝:
- 表达式等同于
SELECT
列表中的一个。
但是在 TiDB 中,上述查询是合规的,详情参阅 #4254。
这个 TiDB 扩展允许在聚合列的 HAVING
子句中使用别名:
select name, count(name) as c from orders
group by name
having c = 1;
标准 SQL 只支持 GROUP BY
子句中的列表达式,以下语句不合规,因为 FLOOR(value/100)
是一个非列表达式:
TiDB 对标准 SQL 的扩展支持 GROUP BY
子句中非列表达式,认为上述语句合规。
标准 SQL 也不支持 GROUP BY
子句中使用别名。TiDB 对标准 SQL 的扩展支持使用别名,查询的另一种写法如下:
select id, floor(value/100) as val
from tbl_name