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

第5节-连接表-Natural-Join

摘要:在本教程中,你将学习如何使用 PostgreSQLNATURAL JOIN 基于具有相同名称的列来连接表。

深入了解 PostgreSQL NATURAL JOIN 连接

PostgreSQL 中,NATURAL JOIN 允许你基于两个表中名称相同的列来连接表。

SELECT select_list
FROM table1
NATURAL [INNER, LEFT, RIGHT, FULL] JOIN table2;

在该语法中:

  • NATURAL JOIN 用于连接两个表,即 table1table2。这些表需要有相同的列名以及可兼容的匹配类型。
  • NATURAL JOIN 可以是 INNER JOINLEFT JOINRIGHT JOINFULL JOIN
  • 如果你在 NATURAL 关键字后没有指定连接类型,PostgreSQL 会默认使用 INNER JOIN 。如果 table1table2 没有共同的列,NATURAL JOIN 的行为就像 CROSS JOIN

设置示例表

首先,创建一个名为 brands 的新表:

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

其次,向 brands 表中插入行:

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

输出:

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

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

CREATE TABLE products (product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,product_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 (product_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 |   product_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 NATURAL JOIN 连接示例

我们将使用 NATURAL JOIN 来连接 brandsproducts 表。

INNER JOIN

以下语句使用 NATURAL JOINproducts 表和 brands 表之间执行 INNER JOIN

SELECTproduct_name,price,brand_name
FROMproductsNATURAL INNER JOIN brands;

输出:

   product_name   |  price  | brand_name
------------------+---------+------------iPhone 14 Pro    |  999.99 | AppleiPhone 15 Pro    | 1199.99 | AppleGalaxy S23 Ultra | 1149.47 | Samsung

LEFT JOIN

以下示例使用 NATURAL JOIN 通过 LEFT JOIN 来连接产品表和品牌表:

SELECTproduct_name,price,brand_name
FROMproductsNATURAL LEFT JOIN brands;

输出:

   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 | NULL

RIGHT JOIN

以下语句使用 NATURAL JOIN 通过 RIGHT JOIN 来连接 products 表和 brands 表:

SELECTproduct_name,price,brand_name
FROMproductsNATURAL RIGHT JOIN brands;

输出:

   product_name   |  price  | brand_name
------------------+---------+------------iPhone 14 Pro    |  999.99 | AppleiPhone 15 Pro    | 1199.99 | AppleGalaxy S23 Ultra | 1149.47 | SamsungNULL             |    NULL | Google

FULL JOIN

以下示例使用 NATURAL JOIN 通过 FULL JOIN 来连接 products 表和 brands

SELECTproduct_name,price,brand_name
FROMproductsNATURAL FULL JOIN brands;

输出:

   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

PostgreSQL NATURAL JOIN 注意事项

PostgreSQLNATURAL JOIN 依赖相同的列名来匹配行。如果更改表结构,查询的运行结果可能会与预期不同。例如:

DROP TABLE products, brands;CREATE TABLE brands (brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name VARCHAR(255) NOT NULL
);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)
);INSERT INTObrands (name)
VALUES('Apple'),('Samsung'),('Google') 
RETURNING *;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 *;

我们期望以下查询使用 brand_id 列来连接这两个表:

SELECTp.name product_name,p.price,b.name brand_name
FROMproducts pNATURAL INNER JOIN brands b;

然而,它返回一个空集:

 product_name | price | brand_name
--------------+-------+------------

原因是 products 表和 brands 表具有相同的 brand_idname 列。

在这种情况下,NATURAL JOIN 会使用 brand_idname 两列的值来匹配行。NATURAL JOIN 的行为类似于以下查询:

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

由于产品名称与品牌名称不同,连接条件为假,这导致查询返回空集。

总结

  • PostgreSQLNATURAL JOIN 使用共同的列名,基于共同列来连接两个表。
  • 谨慎使用 NATURAL JOIN

文章转载自:

http://7YE3bxxn.mjzgg.cn
http://5oYU8TtQ.mjzgg.cn
http://kkSSJ5Hq.mjzgg.cn
http://6w3KnTvn.mjzgg.cn
http://8Ammx1PA.mjzgg.cn
http://q4gT1eUR.mjzgg.cn
http://Csvnbk0E.mjzgg.cn
http://LZ2UzNzd.mjzgg.cn
http://QuVLN9QF.mjzgg.cn
http://47JYqHxz.mjzgg.cn
http://qopLAicM.mjzgg.cn
http://9UOQuyRJ.mjzgg.cn
http://kJRMtJbW.mjzgg.cn
http://pqHcdk21.mjzgg.cn
http://e3xRjZhz.mjzgg.cn
http://GSQVD039.mjzgg.cn
http://xRZ7lHbQ.mjzgg.cn
http://OpY6Qy4o.mjzgg.cn
http://vw9R9V78.mjzgg.cn
http://H17QiKs9.mjzgg.cn
http://XozDGB93.mjzgg.cn
http://pzBsXmXl.mjzgg.cn
http://SZXlcFEF.mjzgg.cn
http://XOGSQ9Zv.mjzgg.cn
http://ih6LvvPj.mjzgg.cn
http://lr1KEiRT.mjzgg.cn
http://jCkgfLbl.mjzgg.cn
http://rYea3Uc9.mjzgg.cn
http://7ssBnAFZ.mjzgg.cn
http://4SgsdiNP.mjzgg.cn
http://www.dtcms.com/a/383299.html

相关文章:

  • CentOS Docker 环境下安装 HertzBeat 并配置 VictoriaMetrics 时序数据库指南
  • 【Linux】 存储分级的秘密
  • GitAgent-面壁智能联合清华大学发布的大模型智能体应用框架
  • 《基于国产Linux的机房终端安全重构方案》
  • JavaWeb-Servlet总结及JSP
  • 《黑神话:悟空》Xbox版本性能模式画质分析
  • 支持向量机:从理论到实践
  • 软件体系结构——发展脉络
  • 【C++】队列queue的使用
  • 对网络通信领域的“活化石”与“瑞士军刀”—— `telnet`
  • 迭代器和生成器的区别与联系
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘numpy’ 问题
  • ffplay数据结构分析
  • 我爱学算法之—— 位运算(上)
  • LeetCode 分类刷题:2187. 完成旅途的最少时间
  • Redis持久化之AOF:日志记录的艺术,数据安全保障详解
  • 应急响应-事件处理学习大纲(1)
  • 基于「YOLO目标检测 + 多模态AI分析」的遥感影像目标检测分析系统(vue+flask+数据集+模型训练)
  • 【Android】Viewpager2实现无限轮播图
  • 【前端教程】从基础到优化:一个登录页面的完善过程
  • 一文入门python中的进程、线程和协程
  • Tempus Fugit: 3靶场
  • XXL-JOB-Admin后台手动执行任务传参过长被截断问题解决
  • 【AI推理部署】Docker篇02—Docker 快速入手
  • 【C语言描述】《数据结构和算法》一 绪论与时间、空间复杂度
  • 服务器 - 从一台服务器切换至另一台服务器(损失数十条访客记录)
  • 【Android】View 交互的事件处理机制
  • 软考中级信息安全与病毒防护知识点
  • 贪心算法应用:量子密钥路径选择问题详解
  • 【算法】【链表】160.相交链表--通俗讲解