【PostgreSQL】提高篇——深入了解不同类型的 JOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)应用操作
1. JOIN 的基础概念
在 SQL 中,JOIN 是用于从两个或多个表中组合行的操作。JOIN 允许我们根据某些条件将表中的数据关联在一起。常见的 JOIN 类型包括:
- INNER JOIN:仅返回两个表中满足连接条件的行。
- LEFT JOIN(或 LEFT OUTER JOIN):返回左表中的所有行,以及右表中满足条件的行;如果右表没有匹配,则结果为 NULL。
- RIGHT JOIN(或 RIGHT OUTER JOIN):返回右表中的所有行,以及左表中满足条件的行;如果左表没有匹配,则结果为 NULL。
- FULL JOIN(或 FULL OUTER JOIN):返回两个表中的所有行,如果没有匹配,则结果中对应的列为 NULL。
2. 各种 JOIN 的详细讲解
2.1 INNER JOIN
描述
INNER JOIN 是最常用的 JOIN 类型。它返回两个表中满足连接条件的行。只有在两个表中都有匹配的情况下,结果集才会包含该行。
语法
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
示例
假设有两个表:employees
(员工)和 departments
(部门)。
CREATE TABLE employees (employee_id INT,employee_name VARCHAR(100),department_id INT
);CREATE TABLE departments (department_id INT,department_name VARCHAR(100)
);-- INNER JOIN 示例
SELECT e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
在这个示例中,查询将返回所有有部门的员工及其对应的部门名称。
应用场景
- 当需要从多个表中获取只有在所有表中都有的匹配数据时使用 INNER JOIN。
- 适用于数据分析和报表生成,尤其是在需要汇总信息时。
性能考虑
- INNER JOIN 通常性能较好,因为它只返回匹配的行,减少了结果集的大小。
- 适合于大多数场景,尤其是当表中有索引时,性能表现更佳。
2.2 LEFT JOIN
描述
LEFT JOIN 返回左表中的所有行,以及右表中满足连接条件的行。如果右表没有匹配,则结果中对应的右表列为 NULL。
语法
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
示例
-- LEFT JOIN 示例
SELECT e.employee_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
在这个示例中,查询将返回所有员工的姓名,包括那些没有分配部门的员工(部门名称将为 NULL)。
应用场景
- 当需要获取左表中的所有数据,同时希望看到右表中匹配的数据(即使没有匹配)时使用 LEFT JOIN。
- 适用于需要分析所有记录的情况,比如获取所有客户及其订单(即使有些客户没有订单)。
性能考虑
- LEFT JOIN 的性能可能会受到左表大小的影响,因为它必须返回左表的所有行。
- 如果左表非常大,查询可能会变得较慢。
2.3 RIGHT JOIN
描述
RIGHT JOIN 返回右表中的所有行,以及左表中满足连接条件的行。如果左表没有匹配,则结果中对应的左表列为 NULL。
语法
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例
-- RIGHT JOIN 示例
SELECT e.employee_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
在这个示例中,查询将返回所有部门的名称,包括那些没有员工的部门(员工姓名将为 NULL)。
应用场景
- 当需要获取右表中的所有数据,同时希望看到左表中匹配的数据(即使没有匹配)时使用 RIGHT JOIN。
- 适用于分析所有类别的情况,比如获取所有产品及其供应商(即使有些产品没有供应商)。
性能考虑
- RIGHT JOIN 的性能与 LEFT JOIN 类似,主要取决于右表的大小。
- 使用 RIGHT JOIN 的场景相对较少,通常可以通过 LEFT JOIN 实现相同的结果。
2.4 FULL JOIN
描述
FULL JOIN 返回两个表中的所有行,如果没有匹配,则结果中对应的列为 NULL。
语法
SELECT columns
FROM table1
FULL JOIN table2 ON table1.column = table2.column;
示例
-- FULL JOIN 示例
SELECT e.employee_name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;
在这个示例中,查询将返回所有员工和所有部门的信息,包括没有部门的员工和没有员工的部门。
应用场景
- 当需要获取两个表中的所有数据,无论是否有匹配时使用 FULL JOIN。
- 适用于需要全面了解数据的情况,比如获取所有客户及其订单和所有订单的客户(即使某些订单没有客户)。
性能考虑
- FULL JOIN 通常性能较差,因为它需要返回两个表的所有行,可能导致结果集非常大。
- 在处理大数据集时,FULL JOIN 可能会导致内存和处理时间的显著增加。
3. 高级应用场景
3.1 自连接(Self Join)
自连接是将同一张表与自身进行 JOIN,常用于查找层级关系或比较同一表中的不同记录。
示例
SELECT a.employee_name AS Employee, b.employee_name AS Manager
FROM employees a
LEFT JOIN employees b ON a.manager_id = b.employee_id;
在这个示例中,查询将返回员工及其对应的经理。
3.2 复合条件 JOIN
可以在 JOIN 中使用多个条件,以实现更复杂的查询。
示例
SELECT e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id AND e.salary > 50000;
在这个示例中,查询将返回薪资高于 50000 的员工及其部门名称。
3.3 使用 JOIN 进行数据聚合
结合 GROUP BY 使用 JOIN,可以实现复杂的统计和分析。
示例
SELECT d.department_name, COUNT(e.employee_id) AS EmployeeCount
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_name;
在这个示例中,查询将返回每个部门的员工数量。
4. 性能考虑
4.1 索引
- 在连接的列上创建索引可以显著提高 JOIN 操作的性能,尤其是在大表之间进行 JOIN 时。
- 确保连接字段上有索引,能够加速查找和匹配过程。
4.2 数据量
- 大表之间的 JOIN 可能会导致性能问题,建议在可能的情况下先进行过滤(如使用 WHERE 子句)以减少参与 JOIN 的数据量。
- 通过在 JOIN 前进行数据预处理,可以显著提高查询性能。
4.3 查询计划
- 使用 EXPLAIN 语句分析查询计划,查看数据库如何执行 JOIN 操作,识别潜在的性能瓶颈。
- 了解查询的执行顺序,调整查询以优化性能。
4.4 避免不必要的 JOIN
- 只在必要时使用 JOIN,避免不必要的连接操作,以减少查询的复杂性和执行时间。
- 在设计数据库时,考虑表的结构和关系,尽量减少 JOIN 的使用。
5. 经验和技巧
5.1 使用别名
- 使用表别名可以提高查询的可读性,尤其是在涉及多个表和复杂条件时。
示例
SELECT e.employee_name, d.department_name
FROM employees AS e
INNER JOIN departments AS d ON e.department_id = d.department_id;
5.2 优化 JOIN 顺序
- 在某些数据库中,JOIN 的顺序可能影响性能,尝试不同的 JOIN 顺序以找到最佳性能。
- 数据库优化器通常会选择最佳的执行计划,但在某些情况下,手动调整 JOIN 顺序可以提高性能。
5.3 使用 EXISTS 和 IN
- 在某些情况下,使用 EXISTS 或 IN 子句可以替代 JOIN,从而提高性能,尤其是在只需要检查存在性时。
示例
SELECT employee_name
FROM employees e
WHERE EXISTS (SELECT 1FROM departments dWHERE e.department_id = d.department_id
);
5.4 使用 UNION 代替 FULL JOIN
- 如果只需要两个表的并集,可以考虑使用 UNION 而不是 FULL JOIN,尤其是在性能敏感的场合。
示例
SELECT employee_name, department_name
FROM employees
UNION
SELECT NULL, department_name
FROM departments;
5.5 定期审查和优化查询
- 定期审查和优化使用 JOIN 的查询,确保它们在数据量增加后仍然保持良好的性能。
- 监控查询性能,识别慢查询并进行优化。
总结
JOIN 是 SQL 中一个强大的功能,能够帮助我们从多个表中获取相关数据。理解不同类型的 JOIN 及其应用场景,有助于编写高效的查询。
通过合理使用 JOIN、优化性能和遵循最佳实践,可以显著提高数据库查询的效率和响应速度。希望以上介绍能够帮助你更好地理解和使用 SQL JOIN!
相关文章:
【PostgreSQL】提高篇——深入了解不同类型的 JOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)应用操作
1. JOIN 的基础概念 在 SQL 中,JOIN 是用于从两个或多个表中组合行的操作。JOIN 允许我们根据某些条件将表中的数据关联在一起。常见的 JOIN 类型包括: INNER JOIN:仅返回两个表中满足连接条件的行。LEFT JOIN(或 LEFT OUTER JO…...

师生健康信息管理:SpringBoot技术突破
第4章 系统设计 4.1 系统体系结构 师生健康信息管理系统的结构图4-1所示: 图4-1 系统结构 登录系统结构图,如图4-2所示: 图4-2 登录结构图 师生健康信息管理系统结构图,如图4-3所示。 图4-3 师生健康信息管理系统结构图 4.2…...

【完-网络安全】Windows注册表
文章目录 注册表启动项及常见作用五个根节点常见入侵方式 注册表 注册表在windows系统的配置和控制方面扮演了一个非常关键的角色,它既是系统全局设置的存储仓库,也是每个用户的设置信息的存储仓库。 启动项及常见作用 快捷键 WinR打开运行窗口&#x…...

车辆重识别(2021NIPS在图像合成方面,扩散模型打败了gans网络)论文阅读2024/10/01
本文在架构方面的创新: ①增加注意头数量: 使用32⇥32、16⇥16和8⇥8分辨率的注意力,而不是只使用16⇥16 ②使用BigGAN残差块 使用Big GAN残差块对激活进行上采样和下采样 ③自适应组归一化层 将经过组归一化操作后的时间步和类嵌入到每…...

掌控物体运动艺术:图扑 Easing 函数实践应用
现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用。在数字孪生领域,动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象…...

Python从入门到高手4.2节-掌握循环控制语句
目录 4.2.1 理解循环控制 4.2.2 for循环结构 4.2.3 循环结构的else语句 4.2.4 while循环结构 4.2.5 循环结构可以嵌套 4.2.6 国庆节吃好玩好 4.2.1 理解循环控制 我们先来搞清楚循环的含义。以下内容引自汉语词典: 循环意指往复回旋,指事物周而复始地运动或变…...
CSS 中的overscroll-behavior属性
overscroll-behavior 是 CSS 中的一个属性,它用于控制元素在发生滚动时,当滚动范围超出其边界时的行为。这个属性对于改善用户体验特别有用,尤其是在移动端设备上,当用户尝试滚动一个已经达到滚动极限的元素时,可以通过…...
GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。
目录 1,问: 1,答: 步骤概述 步骤 1:SPI 初始化 步骤 2:Flash 初始化(可选) 步骤 3:发送读取命令 示例:发送读取数据命令 步骤 4:读取数据…...
Pytorch基本知识
model.state_dict()、model.parameters()和model.named_parameters()的区别 parameters()只包含模块的参数,即weight和bias(包括BN的)。 named_parameters()返回包含模块名和模块的参数的列表,列表的每个元素均是包含layer name和layer param的元组。layer param就是param…...

vue3使用Teleport 控制台报警告:Invalid Teleport target on mount: null (object)
Failed to locate Teleport target with selector “.demon”. Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree main.…...

使用产品前的环境搭建
对于想学习编程的朋友们,使用本产品解决日常功能需求的同时会对自己编程能力具有较大帮助和提升。 目录 环境搭建 前言: 安装python 安装vscode 下载安装Anaconda 通过conda配置python环境 创建虚拟环境 查看环境是否创建成功 激活环境 安装pyt…...
JAVA基础语法 day07
一、final关键字 1.1final的基础知识 用来修饰类,方法,变量 final修饰类,该类被称为终极类,不能被继承了 final修饰方法,该方法称为终极方法,不能被重写了 final修饰变量,该变量仅能被赋值…...
ZLMediaKit编译运行
ZLMediaKit-github官网 快速开始 代码依赖与版权声明 MediaServer支持的HTTP MediaServer支持的HTTP HOOK API cd ZLMediaKit mkdir build cd build cmake … && make -j20 cd ZLMediaKit/release/linux/Debug ./MediaServer //./MediaServer -h 查看 //./MediaSe…...

AlmaLinux 9 安装mysql8.0.38
文件下载 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar 选择合适系统版本 下载后解压 tar -xvf mysql-8.0.39-linux-glibc2.12-x86_64.tar解压后里面有三个文件夹 使用mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz即可,…...
NLP任务之文本分类(情感分析)
目录 1 加载预训练模型对应的分词器 2 加载数据集 3 数据预处理 4 构建数据加载器DataLoader 5 定义下游任务模型 6 测试代码 7 训练代码 #做(中文与英文的)分类任务,Bert模型比较合适,用cls向下游任务传输数…...
MIMO 2T4R BBU RHUB AAU
MIMO(Multiple-Input Multiple-Output,多输入多输出)是一种无线通信技术,它通过在发射端和接收端使用多个天线来提高数据传输速率和信号质量。"2T4R"是MIMO技术中的一种配置,其中"2T"代表有两个发…...

图说数集相等定义表明“R各元x的对应x+0.0001的全体=R“是几百年重大错误
黄小宁 设集A{x}表A各元均由x代表,{x}中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标故x∈R变为实数yx1的几何意义可是:一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)沿“管道”g平移变为点y…...

只出现一次的数字|||(考察点为位操作符)
目录 一题目: 二思路汇总: 三代码解答: 一题目: leetcode原题链接:. - 力扣(LeetCode) 二思路汇总: 思路:如果直接对数组按位异或,那么最后得到的是a^b&a…...

PMP--三模--解题--81-90
文章目录 13.干系人管理--权力利益方格--基于干系人的职权级别(权力)、对项目成果的关心程度(利益)、对项目成果的影响能力(影响),或改变项目计划或执行的能力,每一种方格都可用于对…...
脚本自动化创建AWS EC2实例+安装ElasticSearch和Kibana+集成OpenTelemetry监控
文章目录 为什么要通过脚本来部署服务器?EC2实例类型硬件选择实例类型的选择内存CPU存储架构操作系统最终的选择 其他配置安全组配置网络配置IAM RoleKey Pair内部域名 书写自动化脚本属性文件EBS配置文件创建EC2实例命令user data 文件OpenTelemetry监控 创建内部域…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...

从0开始学习R语言--Day17--Cox回归
Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...