沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • 基础

  • Mysql

    • MySQL基础小结
    • 索引篇
    • 讲讲回表查询
    • 讲讲索引失效问题
    • 思维导图
    • 数据库优化
    • 临时表
    • 聊聊分库分表
    • 实战篇

      • 日常小记
      • JOIN 解析
        • 五种 JOIN 的含义
        • 逗号 JOIN 的问题
        • 单独一个 JOIN 是怎么样的?
        • JOIN 的底层原理⭐️
      • 执行计划解析
      • 内置函数小记
      • JSON字段处理
      • 时间字段的处理
      • 一文教你如何删除重复记录
      • exists语法解析
      • SQL语句优化
    • 读高性能MySQL笔记

  • Redis

  • 达梦数据库

  • 数据库
  • Mysql
  • 实战篇
沉梦听雨
2024-07-13
目录

JOIN 解析

# JOIN 解析

# 五种 JOIN 的含义

  1. INNER JOIN: 内连接,返回两个表中都存在的匹配记录,即只返回满足连接条件的数据。
  2. LEFT JOIN:左连接,返回左表中的所有记录,即使右表中没有匹配的记录。
  3. RIGHT JOIN:右连接,返回右表中的所有记录,即使左表中没有匹配的记录。
  4. FULL JOIN:全连接,返回左右两个表中的所有记录,无论是否有匹配的记录。(并集)
  5. comma-style JOIN:也被称为交叉 JOIN 或逗号 JOIN,只返回满足连接条件的数据。(交集)

# 逗号 JOIN 的问题

这是 SQL 中一种早期的 JOIN 语法形式。在 FROM 子句中,通过在两个或多个表名之间使用逗号来表示 JOIN 操作。

例如:

SELECT ...
FROM table1, table2, table3
1
2

这种语法形式实际上执行的是一个 Cartesian product(笛卡尔积)操作,即所有表中的行两两组合。然后,WHERE 子句用于筛选出满足特定条件的组合。

显然,这种语法形式有以下几个问题:

  1. 可读性较差:相比于现代的 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 等语法,comma-style JOIN 的语义不那么直观。
  2. 性能问题:由于它首先生成了所有可能的行组合,然后再进行筛选,因此在处理大型数据集时可能会非常慢。
  3. 筛选条件限制:所有的连接条件必须在 WHERE 子句中指定,这可能会导致一些优化器无法充分利用索引。

所以,笔者推荐使用明确的 JOIN 语句(如 INNER JOIN、LEFT JOIN 等)来代替 comma-style JOIN,因为它们更清晰、可读性和性能通常更好,并且允许在 ON 子句中指定连接条件,这还可能有利于查询优化。

# 单独一个 JOIN 是怎么样的?

单独的 JOIN 语句没有指定具体的连接类型,因此默认情况下会执行 INNER JOIN。如果需要执行其他类型的连接,需要在 JOIN 语句中指定相应的关键字。

# JOIN 的底层原理⭐️

JOIN 操作的底层原理涉及到【连接算法】,其中包括以下几种常见的连接方法:

  1. 嵌套循环连接(Nested Loop Join):
    • 这是最简单的连接算法。对于每一行左表的记录,都在右表中进行一次循环,找到匹配的记录。这个方法适用于其中一个表很小,另一个表很大的情况。
  2. 哈希连接(Hash Join):
    • 对于大表和小表之间的连接,可以对小表进行哈希运算,然后使用哈希表来加速查找匹配的行。
  3. 排序合并连接(Merge Join):
    • 当连接的两个表都已经按连接条件排序时,可以通过同时扫描两个表,并逐行匹配连接条件来完成连接操作。
  4. 索引连接(Index Join):
    • 如果连接的条件涉及到了索引,数据库引擎可以使用索引来加速连接操作。
  5. 自连接(Self Join):
    • 自连接是指表与自身进行连接。在这种情况下,可能使用上述任何一种连接方法。

实际使用的连接方法取决于数据库引擎的优化器,它会根据统计信息、表的大小、索引的情况等因素选择最优的连接方式。

在理解 JOIN 的底层原理时,重要的是要明白连接算法、连接顺序和连接类型的影响,以便优化查询性能。

上次更新: 2024/12/20 18:14:13
日常小记
执行计划解析

← 日常小记 执行计划解析→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式