- 关于 TiDB
- 主要概念
- 操作指南
- 快速上手
- 部署
- 配置
- 安全
- 安全传输层协议 (TLS)
- 生成自签名证书
- 监控
- 迁移
- 运维
- 扩容缩容
- 升级
- 故障诊断
- 参考手册
- SQL
- 与 MySQL 兼容性对比
- SQL 语言结构
- 数据类型
- 函数与操作符
- SQL 语句
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ALTER DATABASE
ALTER TABLE
ALTER USER
ANALYZE TABLE
BEGIN
CHANGE COLUMN
COMMIT
CREATE DATABASE
CREATE INDEX
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP TABLE
DROP USER
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RENAME INDEX
RENAME TABLE
REPLACE
REVOKE <privileges>
ROLLBACK
SELECT
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CREATE TABLE
SHOW DATABASES
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEXES [FROM|IN]
SHOW INDEX [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW SCHEMAS
SHOW STATUS
SHOW [FULL] TABLES
SHOW TABLE STATUS
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
START TRANSACTION
TRACE
TRUNCATE
UPDATE
USE
- 约束
- 生成列
- 字符集
- 配置
- tidb-server
- pd-server
- tikv-server
- 安全
- 事务
- 系统数据库
- 错误码
- 支持的连接器和 API
- 垃圾回收 (GC)
- 性能调优
- 监控指标
- 报警规则
- 最佳实践
- TiSpark 使用指南
- TiDB Binlog
- 周边工具
- 常见问题 (FAQ)
- 技术支持
- 贡献
- 版本发布历史
- 术语表
你正在查看 TiDB 数据库的较旧版本 (TiDB v2.1) 的文档。
GROUP BY 聚合函数
本文将详细介绍 TiDB 支持的聚合函数。
TiDB 支持的聚合函数
TiDB 支持的 MySQL GROUP BY
聚合函数如下所示:
函数名 | 功能描述 |
---|---|
COUNT() | 返回检索到的行的数目 |
COUNT(DISTINCT) | 返回不同值的数目 |
SUM() | 返回和 |
AVG() | 返回平均值 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
GROUP_CONCAT() | 返回连接的字符串 |
- 除非另有说明,否则聚合函数默认忽略
NULL
值。 - 如果在不包含
GROUP BY
子句的语句中使用聚合函数,则相当于对所有行进行分组。
GROUP BY 修饰符
TiDB 目前不支持 GROUP BY
修饰符,例如 WITH ROLLUP
,将来会提供支持。详情参阅 #4250。
对 SQL 模式的支持
TiDB 支持 SQL 模式 ONLY_FULL_GROUP_BY
,当启用该模式时,TiDB 拒绝不明确的非聚合列的查询。例如,以下查询在启用 ONLY_FULL_GROUP_BY
时是不合规的,因为 SELECT
列表中的非聚合列 "b" 在 GROUP BY
语句中不显示:
drop table if exists t;
create table t(a bigint, b bigint, c bigint);
insert into t values(1, 2, 3), (2, 2, 3), (3, 2, 3);
mysql> select a, b, sum(c) from t group by a;
+------+------+--------+
| a | b | sum(c) |
+------+------+--------+
| 1 | 2 | 3 |
| 2 | 2 | 3 |
| 3 | 2 | 3 |
+------+------+--------+
3 rows in set (0.01 sec)
mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
mysql> select a, b, sum(c) from t group by a;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'b' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
目前,TiDB 默认开启 SQL 模式 ONLY_FULL_GROUP_BY
。
与 MySQL 的区别
TiDB 目前实现的 ONLY_FULL_GROUP_BY
没有 MySQL 5.7 严格。例如,假设我们执行以下查询,希望结果按 "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
列表中的一个。 - 表达式引用并属于查询选择表的所有列都是
SELECT
列表的元素。
但是在 TiDB 中,上述查询是合规的,详情参阅 #4254。
TiDB 中另一个标准 SQL 的扩展允许 HAVING
子句中的引用使用 SELECT
列表中的别名表达式。例如:以下查询返回在 orders
中只出现一次的 name
值:
select name, count(name) from orders
group by name
having count(name) = 1;
这个 TiDB 扩展允许在聚合列的 HAVING
子句中使用别名:
select name, count(name) as c from orders
group by name
having c = 1;
标准 SQL 只支持 GROUP BY
子句中的列表达式,以下语句不合规,因为 FLOOR(value/100)
是一个非列表达式:
select id, floor(value/100)
from tbl_name
group by id, floor(value/100);
TiDB 对标准 SQL 的扩展支持 GROUP BY
子句中非列表达式,认为上述语句合规。
标准 SQL 也不支持 GROUP BY
子句中使用别名。TiDB 对标准 SQL 的扩展支持使用别名,查询的另一种写法如下:
select id, floor(value/100) as val
from tbl_name
group by id, val;
TiDB 不支持的聚合函数
TiDB 目前不支持的聚合函数如下所示,相关进展参阅 TiDB #7623。
STD
,STDDEV
,STDDEV_POP
STDDEV_SAMP
VARIANCE
,VAR_POP
VAR_SAMP
JSON_ARRAYAGG
JSON_OBJECTAGG