首页 > 数据库 >MySQL 默认 only_full_group_by

MySQL 默认 only_full_group_by

时间:2024-09-29 16:52:09浏览次数:7  
标签:full GROUP ONLY id only FULL group 查询 order

ONLY_FULL_GROUP_BY是MySQL中的一个SQL模式,它要求在使用GROUP BY语句时,SELECT列表、HAVING条件或ORDER BY列表中的每个列,要么是聚合函数的一部分(如COUNT(), SUM(), AVG()等),要么必须在GROUP BY子句中明确指定。这个模式的设计初衷是增强查询的准确性和可预测性,避免因为列的不明确引用而导致的数据错误或不一致。

以下是ONLY_FULL_GROUP_BY模式的具体举例:

示例 1:正确使用 ONLY_FULL_GROUP_BY

假设有一个orders表,包含customer_idorder_dateorder_amount字段,我们想要查询每个客户的订单数和订单总额。在ONLY_FULL_GROUP_BY模式下,正确的查询应该是这样的:

SELECT customer_id, COUNT(order_id) AS order_count, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id;

在这个查询中,customer_id列在GROUP BY子句中明确指定,而其他列(order_idorder_amount)则通过聚合函数COUNT()SUM()进行处理。

示例 2:违反 ONLY_FULL_GROUP_BY 规则的查询

如果我们尝试运行以下查询(在ONLY_FULL_GROUP_BY启用时):

SELECT customer_id, order_date, COUNT(order_id) AS order_count, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id;

这个查询会因为order_date列没有在GROUP BY子句中声明,且不是聚合函数的一部分,而引发错误。MySQL会要求你明确这个字段的处理方式。

解决方法

  1. 修改查询

    • order_date列添加到GROUP BY子句中,但这通常不符合查询的意图,因为这样做会按每个客户的每个订单日期分组,而不是按客户分组。
    • 使用聚合函数处理order_date列(如MIN(), MAX()等),但这通常不是想要的结果。
    • 使用ANY_VALUE()函数(如果MySQL版本支持),这个函数可以返回组内的任意一个值,但需要注意这可能会引入不确定性。
  2. 修改SQL模式

    • 临时禁用ONLY_FULL_GROUP_BY模式,通过执行如SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));的命令(注意,这种方法在当前会话有效,重启数据库后恢复)。
    • 永久禁用ONLY_FULL_GROUP_BY模式,通过修改MySQL的配置文件(如my.cnfmy.ini),在[mysqld]部分设置sql_mode,去掉ONLY_FULL_GROUP_BY,然后重启MySQL服务。

示例 3:使用 ANY_VALUE() 函数

如果MySQL版本支持ANY_VALUE()函数,你可以这样修改查询:

SELECT customer_id, ANY_VALUE(order_date), COUNT(order_id) AS order_count, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id;

这样,order_date列将不会引发错误,但需要注意返回的是组内任意一个订单的日期。

总的来说,ONLY_FULL_GROUP_BY模式有助于确保SQL查询的准确性和一致性,但在某些情况下可能需要调整查询或SQL模式以满足特定的查询需求。

标签:full,GROUP,ONLY,id,only,FULL,group,查询,order
From: https://www.cnblogs.com/del88/p/18440348

相关文章

  • WPF FlowDocument List ListItem Paragraph BlockUIContainer Table TableRowGr
    <Windowx:Class="WpfApp419.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • show processlist和show full processlist说明
    showprocesslist和showfullprocesslistprocesslist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。如果是root帐号,能看到所有用户的当前连接。如果是其他普通帐号,则只能看到自己占用的连接。showp......
  • 【Moveit2】move_group_interface_tutorial中文注释
    move_group_interface_tutorial#include<moveit/move_group_interface/move_group_interface.h>//包含MoveIt的移动组接口#include<moveit/planning_scene_interface/planning_scene_interface.h>//包含规划场景接口#include<moveit_msgs/msg/display_robot_stat......
  • 关于RESTfull
    目录关于RESTful资源资源表现总结关于RESTfulREST的全称是RepresentationalStateTransfer中文含义表现层状态转化。符合REST规范的设计,我们称为RESTful设计。它的设计哲学主要是将服务器提供的内容实体看作一个资源,并表现在URL上。资源如下地址,这个地址代表了一个资源......
  • MySQL GROUP BY 分区大小写问题解析
    在数据库操作中,GROUPBY是一个常用的SQL语句,用于根据一个或多个列的值对结果集进行分组。然而,在使用MySQL时,你可能会遇到一个常见问题:大小写敏感性。本文将探讨MySQL中GROUPBY的大小写敏感性问题,并提供一些解决方案。什么是大小写敏感性?在计算机科学中,大小写敏感性是指......
  • 华为Flexus云服务器搭建OnlyOffice私有化在线办公套件
    一、引言在当今数字化办公的时代,在线办公套件的需求日益增长。华为Flexus云服务器凭借其强大的性能和稳定性,为搭建OnlyOffice私有化在线办公套件提供了理想的平台。在2024年9月14日这个充满探索精神的日子里,我们开启利用华为Flexus云服务器搭建OnlyOffice的旅程。二、华为Flexus云......
  • WPF window fill the full screen and overlap on the taskbar
    WindowState="Maximized"WindowStyle="None"   <Windowx:Class="WpfApp409.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsof......
  • InvalidDataAccessApiUsageException 和 Write operations are not allowed in read-o
    InvalidDataAccessApiUsageException和Writeoperationsarenotallowedinread-onlymode解决方法2016年04月07日12:35:02阅读数:14221这些天写webservice,一直在测接口,get方法都没问题,就从昨晚开始测save方法的时候出现了这个错误Writeoperationsarenotallo......
  • 从源码角度,深度解读 MySQL 优化器的 GROUP BY 优化策略
    本文分享自华为云社区《【华为云MySQL技术专栏】MySQL优化器中GROUPBY优化策略介绍》,作者:GaussDB数据库。1.背景介绍在MySQL中,GROUPBY功能至关重要,它允许用户依据一个或多个列的值对结果集进行分组,通常与聚合函数(如COUNT,SUM,AVG等)结合使用。在日常查询中,包含GROUP......
  • cgroup技术概述
    cgroup全称是controlgroup,顾名思义,它是用来做“控制”的。控制什么东西呢?当然是资源的使用了。cgroup定义了下面的一系列子系统,每个子系统用于控制某一类资源。CPU子系统,主要限制进程的CPU使用率。cpuacct子系统,可以统计cgroup中的进程的CPU使用报告。cpuset子系统,可......