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

第5节-连接表-Inner-Join

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

PostgreSQL INNER JOIN 简介

PostgreSQL 中,一个数据库由多个相关的表组成。它们通过 外键 相互链接。

要从两个或多个表中选择数据,需使用 SELECT 语句的 INNER JOIN 子句。

以下是 INNER JOIN 语句的语法:

SELECTtable1.column1,table2.column2,...
FROMtable1INNER JOIN table2 ON table1.column1 = table2.column1

在该语法中:

  • 首先,在 FROM 子句中指定第一个表 (table1) 的名称。
  • 其次,提供你希望在 INNER JOIN 子句中与第一个表合并行的第二个表 (table2)的名称。
  • 第三,在 ON 子句中使用条件将第一个表 (table1) 中的行与第二个表 table2 中的行进行匹配。该条件通过比较 table1column1 的值与 table2column1 的值来匹配两个表中的行。请注意,该条件可以使用其他比较运算符。如果要使用多个条件,可以在 ON 子句中使用逻辑运算符AND 将它们组合起来。
  • 最后,在 SELECT 子句中列出两个表中要包含在最终结果集中的列。

PostgreSQL 先计算 FROM 子句,然后计算 INNER JOIN 子句,最后计算 SELECT 子句。

以下是 PostgreSQL 内连接的工作原理:

  • 首先,INNER JOIN 会比较两个表的 column1 中的值。
  • 其次,如果中间表中的匹配行相等,则将它们合并。
  • 第三,在最终结果集中选择 SELECT 子句中指定的列。

理解 PostgreSQL 内连接

假设你想使用内连接合并 X 表和 Y 表中的行:

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

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

内连接包含在 id 列中具有匹配值的行。结果集中不包含不匹配的行:

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

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

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

PostgreSQL 内连接示例

假设你有两个表:productsbrands

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 *;

products 表有一个外键列 brand_id ,它链接到 brands 表的 brand_id 主键列:

brands 表:

brand_idname
1Apple
2Samsung
3Google

products 表:

product_idnamepricebrand_id
1iPhone 14 Pro999.991
2iPhone 15 Pro1299.991
3Galaxy S23 Ultra1149.472
4Oppo Find Flip499.99NULL

以下语句使用 INNER JOINproducts 表中选择产品名称和价格,并从 brands 表中选择品牌名称:

SELECTproducts.name,products.price,brands.name
FROMproductsINNER JOIN brands ON brands.brand_id = products.brand_id;

输出:

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

查询的工作原理。

首先,FROM 子句会检查来自 products 表的每一行。

其次,INNER JOIN 子句会将 products 表中每行的 brand_idbrands 表中每行的brand_id 进行比较。由于它们具有相同的 brand_id ,该查询会将两个表中的行合并成一个虚拟表:

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

更详细地说:

  • products 表中 id12 的行与 brands 表中 id1 的行匹配。
  • products 表中 id3 的行与 brands 表中 id2 的行匹配。
  • products 表中 id4 的行与 brands 表中的任何行都不匹配。

第三,SELECT 子句从 products 表中选取 nameprice 列,以及从 brands 表中选取name 列:

namepricename
iPhone 14 Pro999.99Apple
iPhone 15 Pro1299.99Apple
Galaxy S23 Ultra1149.47Samsung

限定列名

由于表 products 和表 brands 都包含相同的 name 列和 brand_id 列,我们必须使用以下语法来引用它们:

table_name.column_name

如果不这样做,PostgreSQL 会抛出一个错误。例如:

SELECTname,price,name
FROMproductsINNER JOIN brands ON products.brand_id = products.brand_id;

错误:

column reference "name" is ambiguous

输出结果中有两列名称相同 (name) ;我们可以使用列别名使其更清晰:

SELECTproducts.name product_name,products.price,brands.name brand_name
FROMproductsINNER JOIN brands ON brands.brand_id = products.brand_id;

输出:

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

使用表别名连接表

为每一列输入相同的表名十分繁琐。PostgreSQL 支持在查询中使用表别名为表设置临时名称。

与列别名类似,您可以在查询执行期间使用以下语法为表临时分配一个别名:

table_name AS table_alias

由于 AS 关键字是可选的,因此你可以像这样忽略它:

table_name table_alias

以下语句使用表别名将 products 表与 brands 表连接起来:

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

在这个示例中,我们将 p 指定为 products 表的表别名,将 b 指定为 brands 表的表别名。然后,我们使用这些表别名来引用两个表中的列名。

USING 语法

如果使用等于运算符 (=) 通过比较相同列名的值来连接两个表,可以使用 USING 子句语法:

SELECT table1.column1, table2.column2, ...
FROM table1
INNER JOIN table2 USING (column1);

在这种语法中,我们替换以下 ON 子句:

ON table1.column1 = table2.column1

使用 USING 子句:

USING (column1)

例如,以下语句使用 USING 子句将 products 表与 brands 表连接起来:

SELECTp.name product_name,p.price,b.name brand_name
FROMproducts pINNER JOIN brands b USING (brand_id);

在本语句中,我们不使用 AS 关键字作为表的别名,而是使用 USING 子句来替代 ON 子句。

总结

  • 使用 INNER JOIN 子句合并多个表中的行并选择匹配的行。
  • 表别名是查询执行期间的临时表名。
  • 当两个表具有相同的列名,且你希望基于这些列进行连接以简化语句时,请使用 USING 语法。

文章转载自:

http://KcBI2lcr.zkdmk.cn
http://0lYyKfpq.zkdmk.cn
http://uD3lWHjs.zkdmk.cn
http://RARkR4Re.zkdmk.cn
http://k9GvfeB0.zkdmk.cn
http://3ijNKJT7.zkdmk.cn
http://Cvu4zS2m.zkdmk.cn
http://NCblenln.zkdmk.cn
http://viQV8eSY.zkdmk.cn
http://YA7WiN2A.zkdmk.cn
http://cFgYLUrL.zkdmk.cn
http://aTeAxE41.zkdmk.cn
http://ni9BJNqC.zkdmk.cn
http://kG5jJ9po.zkdmk.cn
http://F59xJ65o.zkdmk.cn
http://06RFUIcK.zkdmk.cn
http://eKKhC5qa.zkdmk.cn
http://cFo4rXQu.zkdmk.cn
http://0COpXSTG.zkdmk.cn
http://O8FOgtii.zkdmk.cn
http://iPb3p4ld.zkdmk.cn
http://Ae9i4jas.zkdmk.cn
http://66QMRowS.zkdmk.cn
http://u9vd7lSM.zkdmk.cn
http://hECBZDcm.zkdmk.cn
http://f4GdlGZr.zkdmk.cn
http://9hmOVRJ3.zkdmk.cn
http://uTQ15X3q.zkdmk.cn
http://p4Ol1fAO.zkdmk.cn
http://pKsoQhfl.zkdmk.cn
http://www.dtcms.com/a/383438.html

相关文章:

  • 【Csp - S】 图的知识
  • 【图文详解】MCP、A2A的核心技术特点以及架构模式
  • Java基础 9.13
  • Shell 正则表达式完全指南
  • 玩转ClaudeCode:用Database-MCP实现自然语言操作数据库
  • 【Android】答题系统Web服务器APP应用开发流程详解
  • Web服务器VS应用服务器:核心差异解析
  • 分享一个vue2的tinymce配置
  • spring bean一共有几种作用域
  • Redie详细入门教程2
  • Maven入门_简介、安装与配置
  • Vue组件化开发介绍
  • ​new species of flying reptile1 discovered in Scotland​
  • Spring JDBC与KingbaseES深度集成:构建高性能国产数据库应用实战
  • 闪电科创 SCI专业辅导
  • 【数据结构与算法】图 Floyd算法
  • 代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
  • IDEA编译器设置代码注释模板
  • 10-鼠标操作的处理
  • efcore 对象内容相同 提交MSSQL后数据库没有更新
  • Docker 容器化
  • 玩转Docker | 使用Docker部署OmniTools自托管IT工具箱
  • 类的组合(对比继承)
  • python爬虫的逆向技术讲解
  • Cookie 和 Session
  • 【WebSocket✨】入门之旅(四):WebSocket 的性能优化
  • 40分钟的Docker实战攻略
  • JavaScript 运算符完全指南:从基础到位运算
  • visual studio快捷键
  • 第21课:成本优化与资源管理