当前位置: 首页 > news >正文

第5节-连接表-Full-join

摘要:在本教程中,你将学习如何使用 PostgreSQLFULL JOIN 来合并两个表中的行。

PostgreSQL FULL JOIN 语句简介

FULL JOIN 会合并两个表中的行,并返回两个表中的所有行。此外,FULL JOIN 会对没有匹配行的表的每个列使用 NULL 值。

换句话说,FULL JOIN 结合了 左连接(LEFT JOIN) 和 右连接 (RIGHT JOIN) 的结果集。

以下是 FULL JOIN 表的语法:

SELECTtable1.column1,table2.column2,...
FROMtable1FULL JOIN table2 ON table2.column1 = table1.column1;

在以下语法中:

  • 首先,在 FROM 子句中指定第一个表 (table1) 的名称。
  • 其次,在 FULL JOIN 子句中提供你要执行全连接的第二个表 (table2) 的名称。
  • 第三,在 ON 子句中使用条件来匹配两个表中的行。该条件通过比较 table1column1 的值与 table2column1 的值来匹配行。
  • 最后,在 SELECT 子句中指定你想要检索数据的列。

FULL OUTER JOINFULL JOIN 的替代语法:

SELECTtable1.column1,table2.column2,...
FROMtable1FULL OUTER JOIN table2 ON table2.column1 = table1.column1;

请注意,OUTER 关键字是可选的

PostgreSQLFULL JOIN 是如何工作的:

  • 首先,FROM 子句返回 table1 中的所有行。
  • 其次,FULL JOIN 通过比较两个表中 column1 的值,将 table1 中的每一行与 table2 中的每一行进行匹配。如果匹配,FULL JOIN 会将两行合并为一行。否则,它会为没有匹配项的表的行的列填充 NULLs,并与另一个表的行合并。
  • 第三,返回一个包含在 SELECT 子句中指定的列的结果集。

了解 PostgreSQL 全连接

假设你想要使用全连接合并来自 X 表和 Y 表的行:

  • X 表有两列:id (键) 和 x
  • Y 表也有两列:id (键) 和 y

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全外连接返回的结果集包含两个表中的行,无论这些行在另一个表中是否有匹配的行。对于在另一个表中没有匹配行的表中的行,其列会填充 NULLs

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以下维恩图是另一种描述全连接工作原理的方式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置示例表

首先,创建一个新表,名为 warehouses,并添加一些示例数据:

CREATE TABLE brands (brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name VARCHAR(255) NOT NULL
);

其次,向 brands 表中插入三行数据:

INSERT INTObrands (name)
VALUES('Apple'),('Samsung'),('Google') RETURNING *;

输出:

 brand_id |  name
----------+---------1 | Apple2 | Samsung3 | Google

第三,创建一个新表,名为 products

CREATE TABLE products (product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name VARCHAR(100) NOT NULL,price DECIMAL(10, 2) NOT NULL,brand_id INT,FOREIGN KEY (brand_id) REFERENCES brands (brand_id)
);

最后,向 products 表中插入四行数据:

INSERT INTOproducts (name, price, brand_id)
VALUES('iPhone 14 Pro', 999.99, 1),('iPhone 15 Pro', 1199.99, 1),('Galaxy S23 Ultra', 1149.47, 2),('Oppo Find Flip', 499.99, NULL) 
RETURNING *;

输出:

 product_id |       name       |  price  | brand_id
------------+------------------+---------+----------1 | iPhone 14 Pro    |  999.99 |        12 | iPhone 15 Pro    | 1199.99 |        13 | Galaxy S23 Ultra | 1149.47 |        24 | Oppo Find Flip   |  499.99 |     NULL

PostgreSQL 全连接示例

以下语句使用 FULL JOIN 来合并来自 products 表和 brands 表的行:

SELECTp.name as product_name,p.price,b.name brand_name
FROMproducts pFULL JOIN brands b ON b.brand_id = p.brand_id;

输出:

   product_name   |  price  | brand_name
------------------+---------+------------iPhone 14 Pro    |  999.99 | AppleiPhone 15 Pro    | 1199.99 | AppleGalaxy S23 Ultra | 1149.47 | SamsungOppo Find Flip   |  499.99 | NULLNULL             |    NULL | Google

工作原理。

首先,FROM 子句返回 products 表中的所有行。
其次,FULL JOIN 子句通过比较 brand_id 列中的值,将 products 表中的每一行与 brands 表中的每一行进行匹配。
如果存在匹配项,FULL JOIN 会将两个表中的行合并为一行。
如果没有匹配项,FULL JOIN 会将表中没有匹配项的行的每一列都填充为 NULL ,并与另一个表中的行合并。
product_id1 的行与 products 表中 brand_id1 的行在 brands 表中相匹配:

product_idnamepricebrand_idbrand_idname
1iPhone 14 Pro999.9911Apple

product_id2 的行与 products 表中 brand_id1 的行在 brands 表中匹配:

product_idnamepricebrand_idbrand_idname
1iPhone 14 Pro999.9911Apple
2iPhone 15 Pro1299.9911Apple

product_id3 的行与 products 表中 brand_id2 的行在 brands 表中相匹配:

product_idnamepricebrand_idbrand_idname
1iPhone 14 Pro999.9911Apple
2iPhone 15 Pro1299.9911Apple
3Galaxy S23 Ultra1149.4722Samsung

来自 products 表中 product_id4 的行在 brands 表中没有任何匹配的行,FULL JOIN 会用 NULL 填充来自 brands 表的 brand_idname 列:

product_idnamepricebrand_idbrand_idname
1iPhone 14 Pro999.9911Apple
2iPhone 15 Pro1299.9911Apple
3Galaxy S23 Ultra1149.4722Samsung
4Oppo Find Flip499.99NULLNULLNULL

来自 brand_id3brands 表中的行在 products 表中没有任何匹配的行, FULL JOIN 会用 NULL 填充来自 products 表的行的列:

product_idnamepricebrand_idbrand_idname
product_idnamepricebrand_idbrand_idname
1iPhone 14 Pro999.9911Apple
2iPhone 15 Pro1299.9911Apple
3Galaxy S23 Ultra1149.4722Samsung
4Oppo Find Flip499.99NULLNULLNULL
5NULLNULLNULL3Google

第三,返回 SELECT 子句中指定的列,并为这些列分配列别名:

product_namepricebrand_name
iPhone 14 Pro999.99Apple
iPhone 15 Pro1299.99Apple
Galaxy S23 Ultra1149.47Samsung
Oppo Find Flip499.99NULL
NULLNULLGoogle

总结

  • 使用 PostgreSQLFULL JOIN 来合并两个表中的行,并返回两个表中的行,包括匹配的行和不匹配的行。
  • FULL OUTER JOINFULL JOIN 的替代语法。

文章转载自:

http://Bjgxn8xO.csdgt.cn
http://7zGKugIB.csdgt.cn
http://OvUoF1Kh.csdgt.cn
http://RTrLC0HO.csdgt.cn
http://b51VjZwi.csdgt.cn
http://rhHHAp2k.csdgt.cn
http://H80BFiQW.csdgt.cn
http://M0XR0UfE.csdgt.cn
http://zZtwjsVv.csdgt.cn
http://4LzhcvLx.csdgt.cn
http://Er2usuhe.csdgt.cn
http://fppKBonD.csdgt.cn
http://puJGJ8RK.csdgt.cn
http://eaUOB03a.csdgt.cn
http://ubf3HKnh.csdgt.cn
http://vITEJniy.csdgt.cn
http://WAGSfQDU.csdgt.cn
http://eTAQZ31H.csdgt.cn
http://vmUmrBrf.csdgt.cn
http://6v0Iddfc.csdgt.cn
http://s6ur2Ljd.csdgt.cn
http://KZbWc6aS.csdgt.cn
http://wxnzRyuu.csdgt.cn
http://ohoxO0Cw.csdgt.cn
http://Mwmy0ekW.csdgt.cn
http://ByDFNfK5.csdgt.cn
http://fvwedCxK.csdgt.cn
http://bk94ywgr.csdgt.cn
http://o0jopgh8.csdgt.cn
http://fOWnuHft.csdgt.cn
http://www.dtcms.com/a/381624.html

相关文章:

  • Java多线程(二)
  • STM32 单片机开发 - SPI 总线
  • 【笔记】Windows 安装 TensorRT 10.13.3.9(适配 CUDA 13.0,附跨版本 CUDA 调用维护方案)
  • 基于PHP的鲜花网站设计与实现
  • 如果系统里没有cmake怎么办? 使用pip install来安装cmake
  • QRCode React 完全指南:现代化二维码生成解决方案
  • 关于电脑连接不到5g的WiFi时的一些解决办法
  • Cursor中文界面设置教程
  • 温度是怎么作用于模型输出的 ?
  • 一个迁移案例:从传统 IDC 到 AWS 的真实对比
  • DeerFlow实践:华为LTC流程的评审智能体设计
  • Linux内核调优实战指南
  • Debezium日常分享系列之:深入解析SQL Server事务日志
  • PostgreSQL——并行查询
  • CTFHub SSRF通关笔记10:DNS重绑定 Bypass 原理详解与渗透实战
  • Nginx 优化与防盗链实践
  • Altium Designer(AD)PCB丝印批量修改
  • MySQL在Centos 7环境下安装
  • MLLM学习~M3-Agent Prompt学习
  • ARM 架构的存储器模型
  • MongoDB C# .NetCore 驱动程序 序列化忽略属性
  • 【个人项目】【前端实用工具】OpenAPI到TypeScript转换工具 - 技术指南
  • 简单了解一下GraphRAG
  • 系统架构设计师——【2024年上半年案例题】真题模拟与解析(一)
  • LINUX中USB驱动架构—USB驱动程序框架
  • 【Web】ImaginaryCTF 2025 wp
  • [Windows] (思源笔记首发ai辅助工具)叶归 AI 辅助精美笔记工具
  • 多线程详解
  • ArcGIS(Pro)在线地图服务被禁?提示感叹号?应急方案来了——重新正常显示
  • 《PyTorch 携手 Unity:基于云原生架构化解 AI 游戏系统显存危机》