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

在 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 提供了更强大和灵活的查询功能,特别是在处理涉及复杂逻辑和聚合的查询时

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 8.0 相对于 MySQL 5.7 有以下主要变化: 1. 改进的查询性能:MySQL 8.0 引入了许多新特性来提高查询性能,包括二进制日志速度改进、查询计划优化、临时表和排序优化等。 2. 更好的数据安全:MySQL 8.0 引入了更强的密码安全性检查、加密功能、更好的数据保护机制、以及新的安全特性,比如行级安全或规则级安全等。 3. 改进的 JSON 功能:MySQL 8.0 引入了更多的 JSON 功能,包括新的 JSON 函数、增强的 JSON 查询功能、原生 JSON 数据类型、以及 JSON 化简,这些都使得应用程序的开发更加容易。 4. 事务日志重做速度提升:MySQL 8.0 引入了一种新的集群架构,称为 InnoDB 集群,它通过并行化来加速事务日志的重做速度,这项技术对于高可用性和性能至关重要。 5. 更好的管理和监测特性:MySQL 8.0 引入了新的管理和监测特性,包括日志管理、故障诊断、在线结构变更、以及更好的性能监测和调整,这些都有助于提高管理员的生产力。 6. 更好的扩展性:MySQL 8.0 引入了新的特性,包括分区表的内部分区、多源复制,这些都有助于提高系统的扩展性。 7. 更好的开发者特性:MySQL 8.0 引入了新的 SQL 语句,比如 CTE、Window 函数、Lateral Join 等,这些都有助于提高开发者的生产力和程序的可读性。 总的来说,MySQL 8.0 相对于 MySQL 5.7 有更好的性能、更高的安全性、更好的可扩展性以及更好的开发者特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值