MySQL8.0新特性join lateral 派生子查询关联

news2024/9/21 2:35:36

在 MySQL 8.0 及更高版本中,LATERAL 是一个用于派生表(derived tables)的关键字,它允许派生表中的查询引用包含该派生表的 FROM 子句中的表。这在执行某些复杂的查询时特别有用,尤其是当需要在子查询中引用外部查询的列时。

以下是关于 MySQL 8.0 中 LATERAL 的几个关键点:

1、定义与用途:

  • LATERAL 允许派生表(子查询)引用外部查询的列。
  • 在 MySQL 8.0 之前,这通常需要使用其他技术(如变量或临时表)来实现。

2、基本语法:

SELECT ...  
FROM outer_table  
JOIN LATERAL (  
    SELECT ...  
    FROM inner_table  
    WHERE inner_table.column = outer_table.column  
    -- 可以使用更多条件和逻辑  
) AS subquery_alias  
ON some_condition;

3、使用场景:

  • 当你需要在子查询中使用外部查询的列作为过滤条件时。
  • 当你需要在子查询中计算每个外部查询行的某些聚合或窗口函数时。

4、示例

4.1、测试表及数据准备

CREATE TABLE t_city_list(
id bigint auto_increment primary key,
country  varchar(64),
city varchar(64)
);
INSERT INTO t_city_list(country,city) VALUES ('中国','北京'),('中国','广州'),('中国','深圳'),('中国','香港'),('中国','上海'),('日本','东京'),('日本','大阪');

--查询数据
select * from t_city_list;
mysql> select * from t_city_list;
+----+---------+--------+
| id | country | city   |
+----+---------+--------+
|  1 | 中国    | 北京   |
|  2 | 中国    | 广州   |
|  3 | 中国    | 深圳   |
|  4 | 中国    | 香港   |
|  5 | 中国    | 上海   |
|  6 | 日本    | 东京   |
|  7 | 日本    | 大阪   |
+----+---------+--------+
7 rows in set (0.00 sec)

4.2、Group_concat(MySQL分组函数)

语法:

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
分组后,把合并字段的值,合并于一个字段中,默认,分隔 通过设置SEPARATOR修改分隔符

select country,group_concat(city) from t_city_list group by country;

+---------+------------------------------------+
| country | group_concat(city)                 |
+---------+------------------------------------+
| 中国    | 北京,广州,深圳,香港,上海           |
| 日本    | 东京,大阪                          |
+---------+------------------------------------+

4.3、join lateral 派生子查询关联t_city_list 显示完成信息

-- on some_condition
select * from t_city_list t1
join lateral (select country,
                       group_concat(city separator'-') as city_list 
                     from t_city_list 
                     where country=t1.country) t2
on t2.country=t1.country;

-- on true
select * from t_city_list t1
join lateral (select country,
                       group_concat(city separator'-') as city_list 
                     from t_city_list 
                     where country=t1.country) t2
on true;

在这里插入图片描述

5、 MySQL5.7版本实现相同的需求

在MySQL5.7版本实现相同的需求,则需要子查询分组Group_concat,之后依据关联字段进行join

mysql> select t1.* ,t2.group_concat_city
    -> from t_city_list t1
    -> join(select country,group_concat(city) as group_concat_city
    ->      from t_city_list
    ->      group by country) t2
    -> on t2.country=t1.country;
+----+---------+--------+------------------------------------+
| id | country | city   | group_concat_city                  |
+----+---------+--------+------------------------------------+
|  1 | 中国    | 北京   | 北京,广州,深圳,香港,上海           |
|  2 | 中国    | 广州   | 北京,广州,深圳,香港,上海           |
|  3 | 中国    | 深圳   | 北京,广州,深圳,香港,上海           |
|  4 | 中国    | 香港   | 北京,广州,深圳,香港,上海           |
|  5 | 中国    | 上海   | 北京,广州,深圳,香港,上海           |
|  6 | 日本    | 东京   | 东京,大阪                          |
|  7 | 日本    | 大阪   | 东京,大阪                          |
+----+---------+--------+------------------------------------+
7 rows in set (0.00 sec)

6、限制:

  • LATERAL 只能在 FROM 子句中使用。
  • 如果 LATERAL 派生表引用聚合函数,则聚合查询不能是包含 LATERAL 派生表的查询的 FROM 子句的一部分。
  • 如果 LATERAL 派生表位于联接子句的右操作数中,并且包含对左操作数的引用,则联接操作必须是 INNER JOIN、CROSS JOIN 或 LEFT JOIN。

7、与其他数据库系统的兼容性:

  • 并非所有数据库系统都支持 LATERAL 关键字。但在 PostgreSQL 和 SQL 标准中,它已被广泛使用。

通过 LATERAL,MySQL 8.0 提供了更强大和灵活的查询功能,特别是在处理涉及复杂逻辑和聚合的查询时

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

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

相关文章

服了这群人!已举报!

文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 服了这群人&#x…

生产订单工序新增BAPI:CO_SE_PRODORD_OPR_CREATE增强

背景: 创建生产订单工序时需要通过BAPI来维护圈起来的字段,但是BAPI不包含这些字段,所以对BAPI进行一些增强处理。 实现过程: 1.拷贝标准BAPI:CO_SE_PRODORD_OPR_CREATE至ZCO_SE_PRODORD_OPR_CREATE(最好放在新的自定…

结合Django和Vue.js构建现代Web应用

文章目录 1. 创建Django项目2. 配置Django后端3. 创建Vue.js前端4. 连接Django和Vue.js5. 构建和部署 在现代Web开发中,结合后端框架和前端框架是非常常见的,其中Django作为一种流行的Python后端框架,而Vue.js则是一种灵活强大的前端框架。本…

使用DoraCloud搭建研发办公云桌面,保障信息安全

一、背景 在信息化全面推进的今天,小型公司的数据安全和员工远程办公已成为亟待解决的重要问题。为了提高工作效率和数据安全性,公司决定引入云桌面技术,实现员工远程办公和数据安全保障。 云桌面(VDI),也…

如何自学制作电子画册,这个秘籍收藏好

随着数字技术的飞速发展,电子画册作为一种新兴的媒体展示形式,以其独特的魅力和丰富的表现手法,受到了越来越多人的喜爱。那么,如何自学制作电子画册呢? 1. 学习基础知识 首先,你需要了解电子画册的基本构…

python探索转义字符的奥秘

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、转义字符的定义与功能 案例解析:换行符与双引号 二、转义字符的应用场景 …

jQuery效果2

jQuery 一、属性操作1.内容2.列子,购物车模块-全选 二、内容文本值1.内容2.列子,增减商品和小记 三、元素操作(遍历,创建,删除,添加)1.遍历2.例子,购物车模块,计算总件数和总额3.创建…

什么是访问越界(C语言数组、指针、结构体成员访问越界)

在C语言中&#xff0c;访问越界&#xff08;Access Violation 或 Out-of-Bounds Access&#xff09;是指程序试图访问的内存位置超出了其合法或已分配的范围。这通常发生在数组、指针或其他内存结构的使用中。 案例&#xff1a; #include <stdio.h>//数组 //Visiting b…

您有一份课程日历待查收!2024高通边缘智能创新应用大赛公开课重磅开启

自2024高通边缘智能创新应用大赛启动以来&#xff0c;全国各地的开发者热情如潮&#xff0c;踊跃报名&#xff0c;其中不乏名企名校开发者&#xff0c;共赴这场科技狂欢盛宴&#xff01; 随着初赛赛程过半&#xff0c;我们陆续看到一些精彩的创意与技术构想。同时&#xff0c;…

韩语“再见” 怎么说,柯桥韩语培训

1.1 标准写法及读法 안녕 (annyeong) 音译&#xff1a; 安宁 罗马音&#xff1a; Annyeong 使用情境&#xff1a; 适用于朋友之间或非常熟悉的关系中&#xff0c;不分场合&#xff0c;可以用于打招呼或告别&#xff0c;表示“你好”或“再见”。 안녕히 가세요 (annyeonghi …

【FPGA】Verilog:2-bit 二进制比较器的实现(2-bit binary comparator)

解释 2-bit 二进制比较器仿真结果及过程说明(包括真值表和卡诺图) 真值表和卡洛图如下: 2-bit Binary Comparator A1 A2 B1

宝塔部署纯Vue项目,无后端

1.打包项目 生成一个dist文件夹 2.创建云服务器根目录 3.创建站点 4.上传文件 5.访问

vue测试环境打包文件不添加hash和生产环境打包不一致

npm run build:test npm run build:pro 测试环境打包出来文件和生产包有差异 .env.test-配置文件 打包出来文件有hash值&#xff0c;加上下面的配置&#xff0c;打包就和pro一致 NODE_ENV productionNODE_ENV只能设置production和development两个参数 开发环境是development&a…

Excel 取出每组最后一行

Excel的前两列是两层的分组列&#xff0c;后两列是明细 ABCD1CM11112CM12123CM13134CM14145CM25156CM26167BM11218BM12229BM232310AM113111AM323212AM333313AM3434 现在要取出每小组的最后一行&#xff1a; ABCD1CM14142CM26163BM12224BM23235AM11316AM3434 使用 SPL XLL sp…

产品经理-产品设计规范(六)

1. 设计规范 2. 七大定律 2.1 菲茨定律 2.1.1 概念 2.1.2 理解 2.1.3 启示 按钮等可点击对象需要合理的大小尺寸根据用户使用习惯合理设计按钮的相对和绝对位置屏幕的边和角很适合放置像菜单栏和按钮这样的元素 2.1.4 参考使用手机习惯 2.1.5 案例 2.2 席克定律 2.2.1 概念 …

JavaWeb_HTTP协议

HTTP&#xff1a; 概念&#xff1a; HTTP&#xff08;Hyper Text Transfer Protocal&#xff09;&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 特点&#xff1a; 1.基于TCP协议&#xff1a;面向连接&#xff0c;安全 2.基于请求-响应模型…

硬盘文件可以直接剪切到另一个盘吗?分享方法与注意事项

在数字化时代&#xff0c;硬盘成为了我们存储和管理文件的重要设备。随着数据量的不断增长&#xff0c;我们有时需要将文件从一个硬盘盘符转移到另一个盘符&#xff0c;以便更好地组织和利用存储空间。硬盘文件剪切操作就是实现这一目标的有效方式之一。本文将详细介绍如何直接…

中兴通讯携手AIS,助力泰国5G通信事业发展

前不久&#xff0c;中兴通讯携手泰国领先的移动运营商AIS&#xff0c;于泰国曼谷A-Z中心宣布商用部署中兴通讯最新一代的无线先锋产品。双方通力合作&#xff0c;将构建一个绿色、极简的智能5G通信网络&#xff0c;助力泰国5G通信事业发展。    新一代Super-N技术&#xff0c…

前端开发之xlsx的使用和实例,并导出多个sheet

前端开发之xlsx的使用和实例 前言效果图1、安装2、在页面中引用3、封装工具类(excel.js)4、在vue中使用前言 在实现业务功能中导出是必不可少的功能,接下来为大家演示在导出xlsx的时候的操作 效果图 1、安装 npm install xlsx -S npm install file-saver2、在页面中引用 值…

CentOS7 部署单机版 ElasticSearch + Logstash + Kibana

一、部署ElasticSearh 参考下面文章&#xff1a; CentOS7 部署单机版 ElasticSearch Logstash-CSDN博客文章浏览阅读83次&#xff0c;点赞2次&#xff0c;收藏2次。通过logstash收集信息&#xff0c;发送给elasticsearch处理。https://blog.csdn.net/weixin_44295677/articl…