MySQL 衍生表(Derived Tables)

在SQL的查询语句select …. from …中,跟在from子句后面的通常是一张拥有定义的实体表,而有的时候我们会用子查询来扮演实体表的角色,这个在from子句中的子查询会返回一个结果集,这个结果集可以像普通的实体表一样查询、连接,这个子查询的结果集就叫做衍生表。

文章目录

  • 一、衍生表简介
    • 1.1 衍生表基本用法
    • 1.2 自定义列名
    • 1.3 衍生表的局限

一、衍生表简介

衍生表常用在需要对数据进行临时处理的场景,即对表直接查询无法得出结果,需要对数据进行加工,然后在加工基础上与原数据再次进行连接,才能得出结果。

示例数据准备
例如下面一的张考试成绩表,subject_id代表不同的科目,score代表分数:

create table exam(
id int not null auto_increment primary key,
subject_id int,
student varchar(12),
score int);insert into exam values(null,1,'小红',89), (null,1,'小橙',76), (null,1,'小黄',89),(null,1,'小绿',95), (null,2,'小青',77), (null,2,'小蓝',83), (null,2,'小紫',99);select * from exam;

在这里插入图片描述

1.1 衍生表基本用法

现要求:找出每个科目得分最高那条记录,这个问题需要拆分成2步完成:

第一步:找出每个科目的最高分

select subject_id, max(score) score from exam group by subject_id;

在这里插入图片描述
第二步:将上一步的结果与exam表进行连接,找出具体的记录:

select e.* from exam e, (select subject_id, max(score) score from exam group by subject_id) d 
where d.subject_id=e.subject_id and d.score=e.score;

在这里插入图片描述
• 这里将第一步的查询放在括号中,并取一个别名d。
• 通过别名d,MySQL可以像引用实体表一样引用子查询的结果集(衍生表)。

1.2 自定义列名

在给衍生表定义别名时,可以同时定义列名,方法是在别名后的括号内列出列名,要注意列名的数量要和子查询返回的列数量相同:

select a, b, d from (select 1,2,3,4) d(a,b,c,d);

在这里插入图片描述

1.3 衍生表的局限

衍生表目前的局限是它是一个独立的子查询,在生成结果集之前无法和from表中的其他表产生关联,如果产生衍生表的子查询成本非常高,而最后与其他表连接后只使用了一小部分数据,那么这个性能浪费是非常严重的。

例如上面的例子中,如果表中有10万个科目,而我最终结果只涉及2个科目,那么在衍生表中对10万个科目进行group by显然是没有必要的,这种情况我们需要提前将外层谓语条件(where)传入衍生表中,避免处理不必要的数据,但这也意味着谓语条件在外层写了一遍,必须在衍生表中再写一遍,增加了SQL复杂度。

在MySQL 8.0.14版本后,通过横向衍生表(lateral关键字),可以在衍生表中引用from子句中之前出现的表,可以完美解决上述局限。
MySQL 横向衍生表(Lateral Derived Tables)

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

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

相关文章

Electron使用WebAssembly实现CRC-16 MAXIM校验

Electron使用WebAssembly实现CRC-16 MAXIM校验 将C/C语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-16 MAXIM格式校验的方式。 CRC-16 MAXIM校验函数WebAssembly源文件 C语言实…

HTB 学习笔记 【中/英】《前端 vs. 后端》P3

📌 这篇文章讲了什么? 介绍了 前端(客户端) 和 后端(服务器端) 的区别。解释了 全栈开发(Full Stack Development),即前端后端开发。介绍了 前端和后端常用的技术。讨论…

SpringBoot集成ElasticSearch实现支持错别字检索和关键字高亮的模糊查询

文章目录 一、背景二、环境准备1.es8集群2.Kibana3.Canal 三、集成到SpringBoot1.新增依赖2.es配置类3.建立索引4.修改查询方法 四、修改前端 一、背景 我们在开发项目的搜索引擎的时候,如果当数据量庞大、同时又需要支持全文检索模糊查询,甚至你想做到…

麒麟系统使用-安装 SQL Developer

文章目录 前言一、基础准备1.基本环境2.相关包下载 二、进行相关配置1.配置JAVA2.配置SQL Developer 总结 前言 作为我国自主研发的操作系统,麒麟系统在使用时需要考虑安装相应的app。尽管麒麟系统是基于linux开发,可由于版本的一些差异,麒麟…

PrimeTime:timing_report_unconstrained_paths变量

相关阅读 PrimeTimehttps://blog.csdn.net/weixin_45791458/category_12900271.html?spm1001.2014.3001.5482 PrimeTime自Q-2019.12版本起引入了timing_report_unconstrained_paths变量(默认值为false),该变量控制是否在使用report_timing命…

洛谷 P1115 最大子段和(前缀和详解)c++

题目链接:P1115 最大子段和 - 洛谷 1.题目分析 2.算法原理 解法:利用前缀和 思考:如何求出以a[i]为结尾的所有子区间中最大的子段和 假设 i 等于5,以 a[ i ] 为结尾的区间一共是五段(黑色线条部分)&#…

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具,但从 2024.02 版本起,JetBrains 调整了试用政策,新用户不再享有默认的 30 天免费试用…

【数据分析】数据筛选与访问行列元素3

访问元素 .loc属性可以通过传入index的值访问行数据。 .loc属性允许传入两个参数,分别是index的值和columns的值,参数间用“逗号”隔开,这样便可以访问数据中的元素。 1. 访问单个元素 访问单个元素比较简单,只需要通过它的in…

C++ std::list超详细指南:基础实践(手搓list)

目录 一.核心特性 1.双向循环链表结构 2.头文件:#include 3.时间复杂度 4.内存特性 二.构造函数 三.list iterator的使用 1.学习list iterator之前我们要知道iterator的区分 ​编辑 2.begin()end() 3.rbegin()rend() 四.list关键接口 1.empty() 2. size…

【免费】2004-2017年各地级市进出口总额数据

2004-2017年各地级市进出口总额数据 1、时间:2004-2017年 2、来源:城市年鉴 3、指标:进出口贸易总额 4、范围:286个地级市 5、指标说明:进出口总额是指一个国家在特定时期内(通常为一年)所…

谈谈 undefined 和 null

*** 补充 null 和 ‘’

【第15届蓝桥杯】软件赛CB组省赛

个人主页:Guiat 归属专栏:算法竞赛真题题解 文章目录 A. 握手问题(填空题)B. 小球反弹(填空题)C. 好数D. R格式E. 宝石组合F. 数字接龙G. 爬山H. 拔河 正文 总共8道题。 A. 握手问题(填空题&…

【计算机视觉】工业表计读数(2)--表计检测

1. 简介 工业表计(如压力表、电表、气表等)在工控系统、能源管理等领域具有重要应用。然而,传统人工抄表不仅工作量大、效率低,而且容易产生数据误差。近年来,基于深度学习的目标检测方法在工业检测中展现出极大优势&…

提示词工程(Prompt Engineering)

https://www.bilibili.com/video/BV1PX9iYQEry 一、懂原理,要知道 为什么有的指令有效,有的指令无效为什么同样的指令有时有效,又是无效怎么提升指令有效的概率 大模型应用架构师想什么? 怎样能更准确?答&#xff1…

从Instagram到画廊:社交平台如何改变艺术家的展示方式

从Instagram到画廊:社交平台如何改变艺术家的展示方式 在数字时代,艺术家的展示方式正在经历一场革命。社交平台,尤其是Instagram,已经成为艺术家展示作品、与观众互动和建立品牌的重要渠道。本文将探讨社交平台如何改变艺术家的…

Typora 使用教程(标题,段落,字体,列表,区块,代码,脚注,插入图片,表格,目录)

标题 一个#是一级标题, 2个#是二级标题, 以此类推, 最多可达六级标题 示例 输入#号和标题后回车即可 注意: #和标题内容之间需要存在空格(一个或多个均可), 没有空格就会变成普通文字 标题快捷键 Ctrl数字 1-6 可以快速调成对应级别的标题 (选中文本/把光标放在标题上再按…

关于deepseek R1模型分布式推理效率分析

1、引言 DeepSeek R1 采用了混合专家(Mixture of Experts,MoE)架构,包含多个专家子网络,并通过一个门控机制动态地激活最相关的专家来处理特定的任务 。DeepSeek R1 总共有 6710 亿个参数,但在每个前向传播…

力扣hot100二刷——二叉树

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路,编程也很流利⭐⭐Basically 基本掌握需要稍作思考,或者看到提示方法后能解答⭐⭐⭐Sl…

网络安全 --- 基于网络安全的 Linux 最敏感目录及文件利用指南

目录 基于网络安全的 Linux 最敏感目录及文件利用指南 Linux 中最敏感的目录及文件 1. /etc 2. /root 3. /var/log 4. /proc 5. /tmp 6. /home 7. /boot 8. /dev 如何利用这些敏感文件 你可能没想到的知识点 总结 Linux 中最敏感的目录及文件 1. /etc 存放内容&a…

深入浅出:Java实现斐波那契数列的七种武器与性能调优指南

​​​ 引言:当数学之美邂逅算法之力 斐波那契数列——这个诞生于13世纪的数学瑰宝,在计算机科学中焕发出新的生命力。作为递归与动态规划的经典案例,它不仅是算法入门的必修课,更是性能优化的试金石。本文将带您深入探索Java实现斐波那契数列的七种核心方法,并揭秘不同…