一个神奇的SQL聚合查询案例

今天给大家分享一个 SQL 案例,假如存在以下两个表:

CREATE TABLE t1 (val1 INT);
INSERT INTO t1 VALUES (1), (2), (3);CREATE TABLE t2 (val2 INT);
INSERT INTO t2 VALUES (10), (20), (30);

每个表包含 3 条数据。请问,以下查询返回结果是什么?

SELECT (SELECT sum(val1) FROM t2 LIMIT 1) res
FROM t1;

不同数据库对于上面的查询实现并不一致,大体可以分为两种。

实现方法一

对于 MySQL、SQL Server、PostgreSQL 以及 SQLite 而言,查询结果如下:

res|
---+6|

它们的实现逻辑如下:

SELECT (SELECT sum_aFROM t2LIMIT 1)FROM (SELECT sum(val1) AS sum_aFROM t1) tmp;

也就是说,子查询中的 sum(val1) 是外部查询的结果。先执行以下外部查询:

SELECT sum(val1) AS sum_val1
FROM t1;sum_val1|
--------+6|

然后执行以下子查询:

SELECT 6 res
FROM t2
LIMIT 1;

所以查询最终返回了一个 6。

如果我们把子查询中的 LIMIT 去掉,将会返回以下错误:

SQL 错误 [1242] [21000]: Subquery returns more than 1 row

这也说明了 sum 函数是在外部查询中执行,因为以下聚合函数不会返回多条数据:

SELECT sum(expression) 
FROM t2

实现方法二

对于另外一些数据库而言,例如 Oracle,查询结果如下:

SELECT (SELECT sum(val1) FROM t2FETCH FIRST 1 ROWS ONLY) res
FROM t1;RES|
---+3|6|9|

它的实现逻辑是先执行外部查询 t1,返回 3 条数据(1,2,3)。然后将结果传递给子查询,计算 sum,最终返回了 3 条数据。

查询中的 FETCH FIRST 1 ROWS ONLY 可以省略,因为聚合查询只会返回一条数据。

另外一个查询语句

我们再考虑一种情况,以下查询语句应该返回什么结果:

SELECT (SELECT sum(val1+val2) FROM t2 LIMIT 1) res
FROM t1;

子查询中的 sum 函数同时使用了 t1 和 t2 的字段。

此时,MySQL、Oracle、PostgreSQL 以及 SQLite 都会返回 3 条记录:

res|
---+63|66|69|

它们的实现逻辑回到了先执行外部查询 t1,返回 3 条数据(1,2,3)。然后将结果传递给子查询,计算 sum,最终返回了 3 条数据。此时,我们可以将语句中的 LIMIT 去掉,不会影响结果。

对于 SQL Server,以上语句回返回错误:

SQL 错误 [8124] [S0001]: 在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。

也就是说,它不支持聚合函数既引用内部表,又引用外部表。

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

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

相关文章

在C++中控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。

文章目录 在C中,控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。这种方法提供了一种灵活的方式来包含或排除调试代码,而无需对代码本身进行大量修改…

【昕宝爸爸小模块】深入浅出之Java 8中的 Stream

深入浅出之Java 8中的 Stream 一、🟢典型解析1.1 🟠Java 8中的Stream 都能做什么1.2 🟠Stream的创建 二、✅ Stream中间操作2.1 🟠Filter2.2 🟠Map2.3 🟠limit / skip2.4 🟠sorted2.5 &#x1…

CCF模拟题 202309-1 坐标变换(其一)

问题描述 试题编号: 202309-1 试题名称: 坐标变换(其一) 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 对于平面直角坐标系上的坐标(x,y),小P定义了一个包含…

props传值问题

父组件和子组件同时展现 同步任务无需添加额外的代码&#xff0c;正常写&#xff0c;而异步任务需要添加下面的解决方案&#xff0c;因为异步任务需要等待响应才能进行赋值。 父组件&#xff1a; <div><UploadFile ref"child" :data"tableData"…

【C#】当重复使用一段代码倒计时时,使用普通类和静态方法,实现简单的封装性、可扩展性、可维护性

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

程序员找不到工作原因以及解决办法

程序员找不到工作原因以及解决办法 程序员当前就业环境真的很差&#xff0c;所以找工作跳槽一定要讲究方式方法&#xff0c;接下来我讲一下你找不着工作的原因以及解决办法&#xff0c;大家先点赞收藏&#xff0c;内容敏感我怕你刷不到 沟通200个全是未读那就是你的城市没有招聘…

静态长效代理IP和动态短效代理IP有哪些用途?分别适用场景是什么?

静态长效代理IP和动态短效代理IP是两种常见的代理IP类型&#xff0c;它们在用途和适用场景上存在一定的差异。了解它们的特性以及使用场景有助于我们更好地利用代理IP&#xff0c;提高网络访问的效率和安全性。 一、静态长效代理IP 1. 用途 静态长效代理IP是指长期保持稳定的代…

安全强化学习笔记

这里写自定义目录标题 参考资料环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学习路线图&#xff08;Safe RL…

JVM相关问题及答案(2024)

1、什么是JVM&#xff0c;它是如何工作的&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它是一个虚拟机器&#xff0c;用于执行Java字节码。JVM的主要任务是将Java字节码翻译成特定平台的机器码&#xff0c;并在特定平台上运行…

Java的NIO

Java NIO&#xff08;New I/O&#xff0c;新 I/O&#xff09;是 Java 1.4 版本引入的一组用于进行非阻塞 I/O 操作的 API。相比于传统的 Java I/O&#xff08;或称为 IOStream&#xff09;&#xff0c;Java NIO 提供了更为灵活、可扩展和高性能的 I/O 处理方式。 Java NIO 的核…

Python-动态烟花【附完整源码】

烟花代码 运行效果&#xff1a;Python动态烟花代码 import pygame from random import randint from random import uniform from random import choice import math vector pygame.math.Vector2 # 重力变量 gravity vector(0, 0.3) # 控制窗口的大小 DISPLAY_WIDTH DISP…

C#核心--实践小项目(贪吃蛇)

C#核心实践小项目 -- 贪吃蛇 必备知识点--多脚本文件 &#xff08;可观看CSharp核心--52集进行了解&#xff09; 必备知识点--UML类图 必备知识点--七大原则 贪吃蛇 项目展示 控制方向的是&#xff1a;WSAD 确定键是&#xff1a;J 需求分析&#xff08;UML类图&#xff09…

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求&#xff1a; 一&#xff0c;TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名&#xff0c;多以它总应该弹出一个文件选择对话框&#xff0c;这也…

【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】

实验二、数论基础&#xff08;中&#xff09; 一、实验内容 1、扩展欧几里得算法&#xff08;Extended Euclid’s Algorithm&#xff09; &#xff08;1&#xff09;、算法原理 已知整数 a , b ,扩展的欧几里得算法可以在求得 a , b 的最大公约数的同时&#xff0c;找到一对…

Python如何连接RabbitMQ并编写简单的生产者和消费者代码?有录播直播和私教视频教程

更简单的获取连接的方式 get_connection方法 这个方法的签名如下&#xff1a; def get_connection(host127.0.0.1,port5672,username"zhangdapeng",password"zhangdapeng520",virtual_host/, ):"""获取RabbitMQ客户端连接对象:param hos…

LeetCode[105] 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] …

Linux计划任务管理

之前已经学习了一些Linux的基础知识和关机方式与文件系统简介&#xff0c;今天来学习下Linux下的计划任务&#xff0c;因为这个功能自己搭建服务器还是用得上的&#xff0c;比如定期清理垃圾缓存、定期备份数据库和网站等等。 系统环境&#xff1a;Centos8 一、什么是计划任务 …

c语言中负数的读取

自记&#xff1a; 1.以字节为例&#xff0c;其取值范围是 -128 ~ 127&#xff0c;即-2E7 ~ 2E7-1, 用最高位表示其符号&#xff0c;0表示正数&#xff0c;1表示负数。数值以补码形式存储。正数的补码就是该正数本身&#xff0c;负数的补码需要转化&#xff0c;如下: 1>.对负…

【flink番外篇】13、Broadcast State 模式示例-广播维表(2)

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

自定义Flink SourceFunction定时读取数据库

文章目录 前言一、自定义Flink SourceFunction定时读取数据库二、java代码实现总结 前言 Source 是Flink获取数据输入的地方&#xff0c;可以用StreamExecutionEnvironment.addSource(sourceFunction) 将一个 source 关联到你的程序。Flink 自带了许多预先实现的 source funct…