首页
学习
活动
专区
圈层
工具
发布

'group by'适用于MySQL,但不适用于Oracle

MySQL与Oracle中GROUP BY的差异解析

基础概念

GROUP BY是SQL中用于对结果集进行分组的子句,通常与聚合函数(如COUNT, SUM, AVG等)一起使用。它根据一个或多个列对结果集进行分组,然后对每个组应用聚合函数。

MySQL与Oracle中GROUP BY的主要差异

1. 标准SQL合规性

  • Oracle:严格遵循SQL标准,要求SELECT列表中的非聚合列必须出现在GROUP BY子句中
  • MySQL:默认情况下(非ONLY_FULL_GROUP_BY模式)允许SELECT列表包含非聚合列而不在GROUP BY中

2. 行为差异示例

MySQL示例(默认模式下):

代码语言:txt
复制
SELECT department_id, employee_name, AVG(salary)
FROM employees
GROUP BY department_id;

在MySQL中这可能执行成功,即使employee_name不在GROUP BY中

Oracle示例:

代码语言:txt
复制
SELECT department_id, employee_name, AVG(salary)
FROM employees
GROUP BY department_id;

这会报错,因为employee_name不在GROUP BY中

原因分析

MySQL的这种行为源于其历史设计选择,目的是简化某些查询的编写。但在严格模式下(ONLY_FULL_GROUP_BY),MySQL也会像Oracle一样要求完全符合SQL标准。

解决方案

1. 在MySQL中使行为与Oracle一致

代码语言:txt
复制
-- 设置SQL模式为ONLY_FULL_GROUP_BY
SET sql_mode = 'ONLY_FULL_GROUP_BY';

-- 或修改my.cnf/my.ini文件永久生效
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2. 编写兼容的SQL语句

代码语言:txt
复制
-- 正确写法(两者都兼容)
SELECT department_id, MAX(employee_name) as employee_name, AVG(salary)
FROM employees
GROUP BY department_id;

-- 或
SELECT e.department_id, e.employee_name, e.salary
FROM employees e
JOIN (
    SELECT department_id, AVG(salary) as avg_salary
    FROM employees
    GROUP BY department_id
) dept_avg ON e.department_id = dept_avg.department_id;

应用场景

  1. 报表生成:需要按部门/地区等维度汇总数据
  2. 数据分析:计算各类指标的平均值、总和等
  3. 数据去重:结合GROUP BY和HAVING子句进行数据筛选

最佳实践

  1. 始终在GROUP BY中包含SELECT列表中的所有非聚合列
  2. 在MySQL开发中启用ONLY_FULL_GROUP_BY模式以保证SQL可移植性
  3. 对于复杂分组需求,考虑使用窗口函数(MySQL 8.0+和Oracle都支持)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL安装『适用于 CentOS 7』

注意: 为了避免权限不足的问题,建议切换至 root 用户进行安装 1.MySQL 的清理与安装 1.1查看是否存在 MySQL 服务 在安装 MySQL 前,需要先看看自己的服务器中是否存在 MySQL...:适用于 CentOS 7.6 否则可以去官方提供的网站中寻找与自己版本相匹配的 yum 源:官方提供的下载网站 将后缀为 .rpm 的文件下载好后,可以通过文件上传工具将文件传至服务器,比如 rz rz...list | grep mysql-community* 出现很多 mysql 相关的安装包,就证明可以成功工作 1.4.下载 MySQL 服务 yum install -y mysql-community-server...2.2.登录 MySQL 登录 MySQL 默认是需要密码,当前版本的 MySQL 刚开始会设置一个临时密码,可以通过指令获取,如果获取失败,可以跳转至本文最后一部分 [3.2无法登录 MySQL]...https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 3.2.无法登录 MySQL 如果无法登录 MySQL(即便是密码忘记了),可以直接修改配置文件 打开 my.cnf

1.2K41
  • 数据库面试速记指南|附思维导图

    MS MySQL AB-->SUN-->Oracle Oracle:运行稳定,可移植性高,功能齐全,性能超群!...适用于大型企业领域。 DB2:速度快、可靠性好,适于海量数据,恢复性极强。适用于大中型企业领域。 SQL Server:全面,效率高,界面友好,操作容易,但是不跨平台。适用于于中小型企业领域。...MySQL:开源,体积小,速度快。适用于于中小型企业领域。 SQL:结构化查询语言(Structured Query Language)。 是关系型数据库标准语言。 特点:简单,灵活,功能强大。...保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。...下面是mysql数据库常见的面试点 ?

    83530

    MySQL数据表索引选择与优化方法

    常见索引的类型在MySQL数据库管理系统中,普遍采用的索引种类主要有B-Tree索引、全文索引以及哈希索引等。其中B-Tree索引是最常用的索引类型,适用于全键值、键值范围或键值排序的查询。...空间数据查询:R-Tree索引适用于对空间数据进行范围查询、最邻近查询等操作。其他索引类型MySQL还支持其他索引类型,如空间索引、位图索引等,这些索引类型针对特定的数据类型和查询需求进行优化。...Oracle' IN BOOLEAN MODE);这个查询将返回包含“MySQL”但不包含“Oracle”的文章。...它适用于精确匹配和范围查询,但不适用于文本搜索。全文索引:全文索引优化了基于文本的搜索操作,可以快速找到包含特定关键词的文档。它适用于文本搜索,但不适用于精确匹配和范围查询。...排序和分组列:在ORDER BY或GROUP BY子句中使用的列,经常用于排序或分组,创建索引可以显著提高操作的效率。

    56321

    高级SQL优化之HAVING条件下推

    本文所使用的执行计划可视化工具为 PawSQL Explain Visualizer , 支持MySQL、PostgreSQL、openGauss、Oracle等数据库。...考虑下面的例子, select o_custkey, count(*) from orders group by o_custkey having o_custkey < 100 重写后的SQL为, select...o_custkey, count(*) from orders where o_custkey group by o_custkey 适用条件 候选条件是单独的HAVING子句或是由AND...数据库优化器对HAVING条件下推的支持 PostgreSQL优化器 Oracle优化器 我们可以看到,MySQL、PostgreSQL、Oracle数据库的优化器都没有对HAVING条件下推重写优化的支持...,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员, PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip

    20310

    PawSQL周更新 | 新增6个SQL审查重写规则

    显式禁止结果排序 在MySQL的早期版本中,即使没有order by子句,group by默认也会按分组字段排序,这就可能导致不必要的文件排序,影响SQL的查询性能。...譬如下面的例子中 SELECT l_orderkey, sum(l_quantity) FROM lineitem GROUP BY l_orderkey; 在MySQL 5.x版本中,group by...SELECT l_orderkey, sum(l_quantity) FROM lineitem GROUP BY l_orderkey ORDER BY NULL; 触发条件 MySQL数据库,版本低于...8.0 存在分组字段,且无排序字段 数据库类型 MySQL 关于PawSQL PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,openGauss,Oracle等,提供的...插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。

    39910

    比较PostgreSQL与MySQL两大开源关系数据库管理系统

    PostgreSQL是由 PostgreSQL Global Development Group 开发的高级开源 RDBMS,它最初于 1996 年 7 月 8 日发布,于 1986 年作为 POSTGRES...什么是 MySQL? MySQL是由 Oracle Corporation 开发的开源 RDBMS。MySQL 最初由瑞典公司 MySQL AB 开发,最初于 1995 年 5 月 23 日发布。...MySQL 适用于多种系统平台,包括 Linux、Windows、macOS、FreeBSD、AIX、HP-UX、ArcaOS、BSDi、eComStation、OpenBSD、IBM i、IRIX、Oracle...[202112210929478.png] MySQL 是最稳定的数据库管理系统之一,一些云平台将其“作为服务”提供,基于云的 MySQL 服务包括: Oracle MySQL Cloud Service...MySQL 在某些 BI 应用程序中表现良好且可靠,尤其是对于读取密集型应用程序,当需要快速读取速度时,它也适用于 OLAP/OLTP 系统,MySQL 和 InnoDB 一起为 OLTP 场景提供了非常好的读

    1.9K00

    oracle,postgre和mysql数据库JOIN操作深度解析学习

    JOIN类型支持与语法差异 特性 Oracle PostgreSQL MySQL 基础JOIN类型 支持INNER/LEFT/RIGHT/FULL OUTER 同Oracle,且支持CROSS JOIN...✅ 支持 ✅ 8.0+支持物化优化 EXISTS子查询 ✅ 通常比IN更快 ✅ 同Oracle ✅ 性能优于IN 示例:关联子查询优化(Oracle vs MySQL) -- Oracle自动优化...CTE(公共表表达式) Oracle/PostgreSQL: 支持递归CTE,适用于层次化查询(如组织架构树)。...快速开发 MySQL 轻量级、易部署 实时分析+窗口函数 PostgreSQL/Oracle 功能全面,支持动态窗口 常见问题解答 为什么MySQL的JOIN性能较差?...代码可读性:CTE更清晰;性能:Oracle/PostgreSQL中CTE可缓存,MySQL中可能被多次执行。

    19710

    ORACLE 最终会把 MySQL 弄死对吗?原因是什么! (译)

    大约 15 年前,当 Oracle 收购 Sun 公司,从而也获得了 MySQL 时,互联网上充斥着关于 Oracle 何时会“扼杀 MySQL”的各种言论。...在那段时间里,我经常发现自己需要为 Oracle 辩护,以反驳许多人认为 Oracle 正在恶意对待 MySQL 的观点,仅仅因为……他们是 Oracle。...这段话主要讲述了 Oracle 收购 MySQL 后,并没有像许多人预期的那样扼杀 MySQL,反而对其进行了很好的管理和发展。...然而,近年来,随着“MySQL Heatwave”(Oracle 的 MySQL 云数据库)的推出,情况发生了变化。...这不仅适用于来自分析应用程序的查询,也适用于在操作应用程序中常见的简单“group by”查询。 注意:MySQL 8 对 DDL 有一些并行化支持,但对查询没有。

    16110

    GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause

    模式会影响 MySQL 支持的 SQL 语法以及它执行的 数据验证检查,这使得在不同环境中使用MySQL以及将MySQL与其他数据库服务器一起使用变得更加容易。...,会报 Unknown column ‘’ in field list 这样的语法错误 PIPES_AS_CONCAT 将 || 视为字符串的连接操作符而非 或 运算符,这和Oracle数据库是一样的,...设置该选项后就与oracle操作类似,授权之前必须先建立用户 数据检查类    NO_ZERO_DATE 认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关 1、如果设置了严格模式...强行将适用于个体的属性套用于团体之上,纯粹是一种分类错误;而 GROUP BY 的作用是将一个个元素划分成若干个子集,使用 GROUP BY 聚合之后,SQL 的操作对象便由 0 阶的"行"变为了 1...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    3.5K50

    【YashanDB知识库】oracle dblink varchar类型查询报错记录

    ● long类型不能在where、group by、order by中使用。...## 问题复现**组图1**:mysql中的表类型:oracle中的表类型:查询正常:**组图2**:mysql中的表类型:oracle中的表类型:查询报错:## oracle long类型限制- LONG...- LONG类型列不能用在Select的以下子句中:where、group by、order by,以及带有distinct的select语句中。- LONG类型列不能用于分布查询。...char适用于长度比较固定的,一般不含中文的情况。**varchar/varchar2**1、varchar是长度不固定的。...它是oracle自己定义的一个非工业标准varchar,不同在于,varchar2用null代替varchar的空字符串。varchar/varchar2适用于长度不固定的,一般不含中文的情况。

    27410

    SQL性能优化秘籍:如何避免计算导致索引失效

    适用于MySQL、PostgreSQL、Oracle等各种数据库的优化技巧 问题剖析 设想我们为customer表的c_acctbal列创建了一个B树索引c_acctbal_idx,以加速相关查询。...这不仅适用于算术运算,也适用于函数调用和其他所有索引列上的计算。 解决方案 面对这一问题,我们有两种解决策略: 重写查询,将计算从索引列移至其他位置,以便查询能够利用现有的索引。...例如: CREATE INDEX phone_func_idx ON customer(LEFT(c_phone, 3)) 注意:函数索引仅适用于与索引定义完全一致的条件,譬如LEFT(c_phone,...支持的内置运算符 PawSQL的自动重写优化支持以下算术运算符及其组合在条件上的运算: 乘法 (*) 加法 (+) 减法 (-) 除法 (/) 一元负号 (-) 支持的内置函数 PawSQL智能重写多种MySQL...8.0内置函数,包括但不限于: 日期时间函数:ADDDATE(), DATE_ADD(), DATE_SUB(), SUBDATE(), DATEDIFF()等 时间计算函数:ADDTIME(), SUBTIME

    23910

    为什么 GROUP BY 之后不能直接引用原表中的列

    模式会影响 MySQL 支持的 SQL 语法以及它执行的 数据验证检查,这使得在不同环境中使用MySQL以及将MySQL与其他数据库服务器一起使用变得更加容易。...MySQL 版本不同,内容会略有不同(包括默认值),查阅的时候注意与自身的 MySQL 版本保持一致。   ...设置该选项后就与oracle操作类似,授权之前必须先建立用户   数据检查类        NO_ZERO_DATE       认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关...强行将适用于个体的属性套用于团体之上,纯粹是一种分类错误;而 GROUP BY 的作用是将一个个元素划分成若干个子集,使用 GROUP BY 聚合之后,SQL 的操作对象便由 0 阶的"行"变为了 1...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    2.4K10

    神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

    模式会影响 MySQL 支持的 SQL 语法以及它执行的 数据验证检查,这使得在不同环境中使用MySQL以及将MySQL与其他数据库服务器一起使用变得更加容易。...,会报 Unknown column ‘’ in field list 这样的语法错误     PIPES_AS_CONCAT       将 || 视为字符串的连接操作符而非 或 运算符,这和Oracle...设置该选项后就与oracle操作类似,授权之前必须先建立用户   数据检查类        NO_ZERO_DATE       认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关...强行将适用于个体的属性套用于团体之上,纯粹是一种分类错误;而 GROUP BY 的作用是将一个个元素划分成若干个子集,使用 GROUP BY 聚合之后,SQL 的操作对象便由 0 阶的"行"变为了 1...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    2.7K20

    数据库索引优化

    所有 MySQL 数据类型都可以建立索引。尽管为查询中可能使用的每个列创建索引可能很诱人,但不必要的索引会浪费空间,并且会浪费 MySQL 确定要使用哪些索引的时间。...关注WHERE、JOIN、ORDER BY、GROUP BY中涉及的字段。选择合适的索引类型单列索引: 适用于单个字段的查询。复合索引: 适用于多个字段的联合查询。...全文索引: 适用于大文本字段的模糊查询。空间索引: 适用于地理位置信息的查询。优化索引结构尽量使用前缀索引,减少索引占用空间。合理设置索引列的顺序,满足查询需求。...数据量很大的情况基本上MySQL的数据量达到了500万,就达到了一个瓶颈期。普通的索引可能已经无法对其进行一个实质性的提升。需要考虑一个业务优化。对于索引的特殊性,它加快了查询,但是拖慢了一些增删改。...引用https://dev.mysql.com/doc/refman/8.4/en/optimization-indexes.html

    35410
    领券