【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL

news/2025/3/2 1:10:06/文章来源:https://www.cnblogs.com/YashanDB/p/18604238

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7610112.html?templateId=1718516

问题现象

以下SQL在MYSQL下均能执行成功,在崖山下执行报错。

SELECT Sname,Ssex, min(Sage) FROM Student group by Ssex;SELECT Sname,count(0) AS counts FROM Student;selectmin(st.Sage) ,SC.CId,min(st.SId),min(SC.score)from Student st LEFT JOIN SC ON st.SId = SC.SIdgroup by SC.CIdorder by st.Sage;

MYSQL执行成功:

崖山上执行报错:YAS-04316 not a single-group group function

原因

SQL-92 和更早版本不允许选择列表、HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的非聚合列的查询。例如,此查询在标准 SQL-92 中是非法的,因为name选择列表中的非聚合列未出现在GROUP BY:

SELECT Sname,Ssex, min(Sage) FROM Student group by Ssex;

为了使查询在 SQL-92 中合法,Sname 必须从选择列表中去掉该列,或在 GROUP BY子句中命名该列。

SQL:1999 及更高版本允许这样的非聚合列出现在选择列中。

崖山和ORACLE在这个点都是及SQL-92为准。所以在崖上执行会报错。

解决办法

1、对于非聚合列出现在选择列中,MySQL是任取一行记录,改成用聚合函数来取最小或最大一行。

SELECT min(Sname),Ssex, min(Sage) FROM Student group by Ssex;SELECT max(Sname),count(0) AS counts FROM Student;

2、对于MySQL中group by 加 order by,可拆分2层,里面一层是group by,外面一层是order by

SELECT*from (selectSC.CId,min(st.Sage) as mage,min(st.SId),min(SC.score)from Student st LEFT JOIN SC ON st.SId = SC.SIdgroup by SC.CId)order by mage;

总结

SQL-92 要求非group by 列不能单独出来在选择列中,比SQL:1999允许出现任选一行出现在选择列中,更严谨合理。

任选一行对于应用开发会造成疑惑,Oracle、PostgreSQL、崖山都是以SQL-92为准。MySQL 在5.7 及8.0之后的版本

默认也是以SQL-92为准, SQL_MODE默认设置为ONLY_FULL_GROUP_BY即SQL-92方式。

参考资料:

https://dev.mysql.com/doc/refman/8.4/en/group-by-handling.html

https://dev.mysql.com/doc/refman/8.4/en/group-by-modifiers.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851785.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析

蒙特卡洛模拟是一种基于重复随机抽样获取数值结果的计算算法。该方法的核心原理在于利用随机性解决本质上可能具有确定性的问题。其命名源自摩纳哥的蒙特卡洛赌场,这体现了该方法中固有的随机性特征。在金融与交易等多个领域,该方法被广泛应用于不确定性场景的建模和风险影响…

HTML5 微数据规范

​ HTML5 微数据规范 简介 微数据是一种内置于 HTML 中的结构化数据格式。它允许网页作者定义页面上的特定内容类型,例如文章、事件或人物。这有助于机器(例如搜索引擎)理解和解释网页内容。 微数据的基本概念项目(Items):一个微数据项代表页面上的某个对象或实体,例如一…

JMeter如何对文件上传功能进行测试

一、使用背景 1、在网页中发布的内容,需要添加文件一起发布或上传 2、在创建Jmeter脚本之前,首先获取文件上传/下载接口需求(接口文档)或者通过抓包的方式来获取,明确请求链接、请求方法、请求头、请求体、返回数据等信息。 二、操作步骤 1、获取接口信息 使用Fiddler和ba…

bass使用方法

1 注册获取key http://www.bass.radio42.com/bass_register.html 然后得到key 2 项目引用BASS.NET 3 下载bass包 https://www.un4seen.com/files/bass24.zip 解压将bass.dll 放到项目生成的目录下,一般是Debug 4 代码using Un4seen.Bass;//添加引用BassNet.Registration("…

java session默认过期时间

session 过期时间配置 默认在 tomcat安装包下/conf/web.xml文件里 默认30 分钟

httpsok-v1.18.0-SSL证书自动续期

🔥httpsok-v1.18.0-SSL证书自动续期 介绍 httpsok 是一个便捷的 HTTPS 证书自动续期工具,基于全新的设计理念,专为 Nginx 、OpenResty、Apache 等服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞定SSL证书自动续期 v1.18.0版本新特性🌐 支持…

网站底部的内容修改不了,解决网站底部信息无法更新的问题

如果遇到网站底部的内容无法修改的问题,可以按照以下步骤进行排查和解决:检查权限:确保您拥有足够的权限来编辑网站底部信息。通常需要管理员账户。 检查缓存:清除浏览器缓存或服务器端缓存,确保看到的是最新的内容。 检查模板文件:如果网站使用的是自定义模板,检查模板…

后台怎么修改网站顶部内容,轻松更新网站顶部信息

修改网站顶部的内容是一个常见的维护任务,通常涉及网站后台管理系统的操作。以下是详细的步骤:登录后台管理系统:使用管理员账户登录网站的后台管理系统。 找到网站设置或页面管理:在后台管理系统中,找到“网站设置”、“页面管理”或类似的选项。这些地方通常包含网站的基…

内外网文件传输新突破:操作简便,速度飞快,安全无忧!

伴随着全球数字化转型的持续深入,数字经济的蓬勃发展,数据资产已成为非常重要的生产要素。为了确保内部核心资产的安全性,很多企业和机构都会选择将网络进行隔离划分,比如内外网隔离,但网络隔离后,在日常工作中,仍存在用户需求把文件数据从内网到外网的文件摆渡业务需求…

飞驰云联如何加速供应链协同,保护核心数据资产?

供应链协同是指供应链全链条的各环节(包括上下游各企业及企业内各部门)实现协同运行的一系列活动或最终效果,即供应链全链条各节点确立共同目标,在互利共赢的基础上,深入合作、风险共担、信息共享、流程互通、共同创造客户价值的过程。以医疗设备制造企业为例,在生产过程…

HTB之Unified(JNDI注入+MongoDB+生成哈希)

Unified 1. 扫描结果 6789端口:IBM DB2管理,运行着IBM DB2 Admin 服务。IBM DB2 是一种数据库管理系统,这个端口可能用于访问 DB2 数据库的管理界面。8443端口:管理平台,根据相关搜索得知应该是网络设备管理平台,或者监控管理平台。UniFi Network 是 Ubiquiti Networks 提…

uniappios首次安装没有网络

处理思路 https://blog.51cto.com/u_16213344/8459072逻辑图相关代码复制 uni.getNetworkType({success: function (res) {// 获取网络类型const networkType = res.networkTypeif (networkType === none) {// 当前无网络连接,展示无网络页面uni.redirectTo({url: /pages/no-n…