📌  相关文章
📜  ELECT 列表不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“schogdsw_db.SE.name”;这与 sql_mode=only_full_group_by 不兼容 - SQL (1)

📅  最后修改于: 2023-12-03 14:40:57.541000             🧑  作者: Mango

SQL兼容性问题

在使用SQL时,有时我们会遇到一些兼容性问题。例如,在进行GROUP BY操作时,如果SELECT语句中包含了非聚合列,而这些列又不在GROUP BY子句中,那么就会出现兼容性问题。在默认情况下,MySQL会忽略这些非聚合列,但在sql_mode=only_full_group_by的情况下,MySQL会抛出错误。

问题描述

在此例中,我们遇到了一个典型的兼容性问题。具体而言,在执行SQL时,MySQL会报出以下错误:

#1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'schogdsw_db.SE.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这段错误信息的含义是:SELECT列表中的第三列不在GROUP BY子句中,并且包含非聚合列'schogdsw_db.SE.name',而这些列与GROUP BY子句中的列不具有函数依赖关系。这与sql_mode=only_full_group_by不兼容。

问题原因

这个问题的原因在于,SELECT语句中的第三列非聚合列'schogdsw_db.SE.name'不在GROUP BY子句中。在MySQL中,需要将所有非聚合列都包含在GROUP BY子句中,或使用聚合函数计算它们的值。

在默认情况下,MySQL会忽略这些不在GROUP BY子句中的非聚合列,但在sql_mode=only_full_group_by的情况下,MySQL会强制执行这个要求,以避免因为忽略非聚合列而导致的数据不准确。

解决方案

要解决这个问题,我们需要将所有非聚合列都包含在GROUP BY子句中,或使用聚合函数重新计算它们的值。具体而言,在SELECT语句中,我们可以使用聚合函数SUM、COUNT、AVG等来对非聚合列进行计算,以获得正确的查询结果。

在本例中,我们可以尝试修改SQL语句,将非聚合列'schogdsw_db.SE.name'包含在GROUP BY子句中,如下所示:

SELECT E.department_id, E.job_id, SE.name, SUM(E.salary)
FROM employees E INNER JOIN departments D ON E.department_id = D.department_id
INNER JOIN locations L ON D.location_id = L.location_id
INNER JOIN countries C ON L.country_id = C.country_id
INNER JOIN regions R ON C.region_id = R.region_id
INNER JOIN jobs J ON E.job_id = J.job_id
INNER JOIN employees SE ON E.manager_id = SE.employee_id
GROUP BY E.department_id, E.job_id, SE.name
ORDER BY E.department_id, E.job_id, SE.name;

这样,我们就可以避免出现兼容性问题,并且获得正确的查询结果。

总结

在使用SQL时,我们需要时刻注意兼容性问题。对于类似于GROUP BY操作中的问题,我们需要将所有非聚合列都包含在GROUP BY子句中,或使用聚合函数重新计算它们的值,以避免数据不准确的情况。同时,在编写SQL时,我们也应该根据实际需求合理使用sql_mode选项,以确保查询结果的准确性和兼容性。