---
title: OceanBase 与 MySQL 在 ONLY_FULL_GROUP_BY 模式下的行为差异及兼容处理指南-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于OceanBase 与 MySQL 在 ONLY_FULL_GROUP_BY 模式下的行为差异及兼容处理指南相关的常见问题和使用技巧，帮助您快速解决OceanBase 与 MySQL 在 ONLY_FULL_GROUP_BY 模式下的行为差异及兼容处理指南的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# OceanBase 与 MySQL 在 ONLY_FULL_GROUP_BY 模式下的行为差异及兼容处理指南

更新时间：2026-08-18 03:21

适用版本： V1.4.x、V2.1.x、V2.2.x、V3.1.x、V3.2.x、V3.3.x、V4.0.x、V4.1.x、V4.2.x、V4.3.x、V4.4.x 内容类型：TechNote  

## 摘要

本文档描述了 OceanBase 数据库在开启 `ONLY_FULL_GROUP_BY` 模式时，对无显式 `GROUP BY` 子句且包含 `ORDER BY` 的聚合查询的校验逻辑与 MySQL 数据库存在的差异，并提供了相应的解决方案。

## 问题现象

当 `sql_mode` 包含 `ONLY_FULL_GROUP_BY` 参数时，执行一个仅包含聚合函数（如 `COUNT(*)`）、无显式 `GROUP BY` 子句，但包含针对非聚合列进行 `ORDER BY` 排序的查询语句时，OceanBase 数据库会返回错误。

错误信息示例如下：

```plain
ErrorCode = 1140, SQLState = 42000, Details = Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

```

## 适用版本

OceanBase 数据库所有版本。

> **说明**
>  此行为是 OceanBase 数据库的预期设计，旨在严格遵循 SQL 标准，不会为了向下兼容 MySQL 而进行调整。

## 问题原因

在标准 SQL 规范中，当查询包含聚合函数且没有 `GROUP BY` 子句时，结果集应被视为一个单一的分组。此时，`SELECT` 列表中只能出现聚合函数或常量表达式。如果 `ORDER BY` 子句中引用了非聚合列，则该列的取值在逻辑上是不确定的，因为聚合操作会折叠多行数据。

OceanBase 数据库在 `ONLY_FULL_GROUP_BY` 模式下，严格遵循了这一标准，会拒绝此类语义模糊的查询，以确保数据输出的确定性。

MySQL 8.0 对此类非标准写法进行了特殊兼容处理，允许其执行，但这与 SQL 标准规范不符。

## 解决方案

要避免此错误，需要修改 SQL 语句的结构，使其符合 `ONLY_FULL_GROUP_BY` 模式下的语义要求。以下是两种可行的修改方法：

**方法一：移除 **`ORDER BY`** 子句**
 如果查询结果不需要排序，或排序逻辑不是必需的，可以直接移除 `ORDER BY` 子句。

**方法二：显式添加 **`GROUP BY`** 子句**
 如果确实需要基于某个（些）列进行排序，并且该列的值在逻辑上可以确定，则应在查询中显式添加 `GROUP BY` 子句。

例如，原问题查询为：

```sql
SELECT COUNT(*) AS total FROM demo_table WHERE (category='B') ORDER BY ID DESC;

```

修改方案：

1. **移除 **`ORDER BY`：

```sql
SELECT COUNT(*) AS total FROM demo_table WHERE (category='B');

```

2. **添加 **`GROUP BY`（假设按 `ID` 分组是业务逻辑所需）：

```sql
SELECT COUNT(*) AS total FROM demo_table WHERE (category='B') GROUP BY ID ORDER BY ID DESC;

```

## 完整示例

以下是一个完整的复现示例，用于演示问题现象：

```sql
-- 保存当前会话的 sql_mode
SET @old_sql_mode = @@SESSION.sql_mode;

-- 启用包含 ONLY_FULL_GROUP_BY 的严格模式
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- 显示当前 SQL mode
SELECT @@SESSION.sql_mode;

-- 创建测试表并插入数据
DROP TABLE IF EXISTS demo_table;
CREATE TABLE demo_table (
    id INT PRIMARY KEY,
    category VARCHAR(20),
    amount DECIMAL(10,2)
);
INSERT INTO demo_table VALUES
(1, 'A', 100.50),
(2, 'B', 200.75),
(3, 'A', 150.25),
(4, 'C', 300.00);

-- 执行会触发 1140 错误的查询
SELECT COUNT(*) AS total FROM demo_table WHERE (category='B') ORDER BY ID DESC;

-- 恢复原始 sql_mode (可选)
SET SESSION sql_mode = @old_sql_mode;

```

Previous

[如何解决使用 GROUP_CONCAT() 函数拼接字符串时被截断？](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003188052)

Next

[通过 OBProxy 在 OceanBase 数据库 V4.x 版本中执行 GET_LOCK 函数时会偶发性出现 -4007 异常报错信息的原因和解决方法](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003271551) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
