【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监控 创建内部域…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...