在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
《java 专栏》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


默语博客:解决SQL中的"Expression #1 of SELECT list is not in GROUP BY clause"错误 🙋‍♂️

大家好,默语:Java高级工程师、自媒体博主,北京城市开发者社区的主理人。喜欢记录工作中的技术心得,创作文章,全网10余万粉丝,总阅读量超过700万。活跃于CSDN、掘金、阿里云和51CTO等平台,是CSDN博客专家、阿里云专家博主和掘金博客专家,曾获博客专家、优秀社区主理人等多项荣誉,并在2023年度博客之星评选中名列前50。目前就职于国企并担任技术经理,拥有丰富的项目开发经验和产品设计能力。希望在不断的学习过程中,可以帮助到更多的人,结交更多的朋友。


摘要 📄

在日常开发中,我们经常会遇到SQL查询中的一些错误,尤其是在处理复杂的查询时。今天,默语将带大家一起深入探讨并解决一个常见的SQL错误:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column”。通过这篇文章,您将了解该错误的原因及其解决方案,提升您的SQL技能。

引言 🌟

SQL是数据库管理的重要工具,但在使用过程中,尤其是编写复杂查询时,难免会遇到各种各样的错误。其中,“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column” 是比较常见的一个。这个错误主要是由于SELECT列表中的列没有在GROUP BY子句中进行分组。本文将详细讲解该错误的成因,并提供有效的解决方案。

正文内容(详细介绍) 📝

1. 错误的成因 🤔

在SQL查询中,GROUP BY子句用于将结果集按一个或多个列进行分组。而SELECT列表中的每一列都必须是一个聚合函数或出现在GROUP BY子句中,否则SQL引擎无法确定如何对这些列进行分组,从而导致错误。

2. 示例代码演示 💻

2.1 错误示例

以下是一个导致错误的SQL查询示例:

SELECT id, name, COUNT(*)
FROM employees
GROUP BY name;

执行以上查询会报如下错误:

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'employees.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
2.2 错误分析

该错误发生的原因是id列没有在GROUP BY子句中进行分组,同时它也不是一个聚合函数,SQL引擎无法知道如何处理该列的数据。

3. 解决方法 🔧

3.1 方法一:将所有非聚合列包含在GROUP BY子句中

我们可以通过将所有非聚合列包含在GROUP BY子句中来解决该问题:

SELECT id, name, COUNT(*)
FROM employees
GROUP BY id, name;

通过这种方式,SQL引擎能够确定如何对每一列进行分组,从而避免错误。

3.2 方法二:使用聚合函数

另一种解决方法是使用聚合函数来处理非分组列,例如使用MAX函数:

SELECT MAX(id), name, COUNT(*)
FROM employees
GROUP BY name;

这种方法可以确保SELECT列表中的每一列都能够正确处理。

3.3 方法三:修改MySQL配置文件

在某些情况下,您可能希望通过修改MySQL配置文件来关闭ONLY_FULL_GROUP_BY模式:

  1. 打开MySQL配置文件:

    vim /etc/mysql/conf.d/mysql.cnf
    
  2. 在配置文件my.cnf中找到sql_mode设置。MySQL的默认配置是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。可以把ONLY_FULL_GROUP_BY去掉,也可以去掉所有选项设置成sql_mode=,如果您确信其他选项不会造成影响的话。

  3. 复制并粘贴以下内容,如有[mysqld],则放到[mysqld]最后,如没有则放到配置文件最下方即可:

    [mysqld]
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    
  4. 重启MySQL服务以使更改生效:

    systemctl restart mysql
    

4. 更深入的理解 🧐

为了更深入理解这个错误,我们需要了解SQL标准中的一些关键概念:

  • 功能依赖性:当一组列决定另一列的值时,这些列被称为功能依赖。
  • ONLY_FULL_GROUP_BY:这是MySQL中的一个模式,它严格要求SELECT列表中的每一列都必须在GROUP BY子句中或是聚合函数的一部分。

通过理解这些概念,我们可以更好地避免和解决类似的SQL错误。

QA环节 💬

Q: 什么是功能依赖性?
A: 功能依赖性指的是当一组列决定另一列的值时,这些列被称为功能依赖。例如,如果A列决定了B列的值,那么B列就依赖于A列。

Q: 为什么会出现ONLY_FULL_GROUP_BY模式的错误?
A: ONLY_FULL_GROUP_BY模式严格要求SELECT列表中的每一列都必须在GROUP BY子句中或是聚合函数的一部分,否则会报错。

小结 ✅

在本文中,我们深入探讨了"Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column"错误的成因,并提供了三种有效的解决方案。希望通过本文的讲解,大家能够更好地理解和解决这一常见的SQL错误,提升自己的SQL技能。

未来展望 🚀

未来,我们将继续探讨更多SQL相关的技术问题和解决方案。希望通过不断的学习和分享,帮助大家更好地掌握SQL,提升技术水平。

参考资料 📚

  1. MySQL Documentation: GROUP BY
  2. W3Schools: SQL GROUP BY
  3. Stack Overflow: Understanding GROUP BY
  4. CSDN: 解决SQL错误

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

更多推荐