PostgreSQL教程

PostgreSQL CROSS JOIN

在本节中,我们将了解 PostgreSQL交叉联接的工作原理,该工作原理使我们能够创建的笛卡尔乘积两个或多个表中的行。我们还学习了如何使用表别名,WHERE子句以及如何在 PostgreSQL交叉联接子句的帮助下联接多个表。

什么是PostgreSQL交叉联接?

PostgreSQL交叉联接用于组合多个表的所有可能性并返回输出,其中包含所有选定行的每一行表。 CROSS JOIN ,又称为 CARTESIAN JOIN ,它使我们能够生成所有相关表的笛卡尔积。
笛卡尔积可以描述为第一个表中的所有现有行乘以第二个表中的所有行。它与 INNER Join (其中此子句不存在连接条件。
下面的维恩图显示了 PostgreSQL交叉连接我们可以很容易地理解 Cross Join 返回 Table1和Table2 中的所有记录,并且每一行都是来自两个表的行的分组。
PostgreSQL Cross Join

PostgreSQL Cross Join语法

Cross-Join 关键字与 SELECT命令一起使用,并且必须写在 FROM 关键字。以下语法用于从两个关联表中获取所有数据:
语法1
SELECT column-lists  
FROM Table1  
CROSS JOIN Table2;  
语法2
下面的语法类似于上面的语法,因为我们没有使用Cross Join关键字:
SELECT [column_list|*]
FROM Table1, Table2;
语法3
在这里,我们可以使用INNER JOIN子句,并且始终对交叉连接的精确重复进行分析:
SELECT *
FROM Table1
INNER JOIN Table2 ON true;
在上述语法中,我们具有以下参数:
参数 说明
列列表 column-list用于指定我们要返回的列或字段的名称。
表1和表2 这些是我们从中获取记录的表名。

PostgreSQL交叉连接示例

让我们看一个示例来了解 PostgreSQL交叉连接的工作原理:

使用PostgreSQL交叉连接来连接两个表

为此,我们将使用 Summer_fruits和Winter_fruits 表,我们在 PostgreSQL教程的PostgreSQL完全连接部分中创建。
表1: Summer_fruits
要查看 Summer_fruits 表的记录,我们将使用 SELECT 命令,如下所示以下命令:
Select * from Summer_fruits;
输出
执行上述命令后,我们将从 Summer_fruits 表中获取数据:
PostgreSQL交叉联接
表2: Winter_fruits
要查看 Winter_fruits 表中的记录,我们将使用SELECT命令,如以下命令所示:
Select * from Winter_fruits;
输出
执行上述命令后,我们将从 Winter_fruits 表中获取数据:
PostgreSQL交叉联接
我们将执行以下命令从两个表中获取所有记录( 夏季水果和冬季水果 ):
SELECT *
FROM Summer_fruits 
CROSS JOIN Winter_fruits ;
输出
在执行上述命令时,我们将获得以下输出:
PostgreSQL Cross Join
执行 CROSS-JOIN 命令时,我们将看到它显示42行,这意味着 6 Summer_fruites 表中的行乘以 Winter_fruits 中的 7 行strong>表。
注意: 建议在SELECT *命令的位置使用单独的列名,以避免两次重复列的输出。

PostgreSQL交叉联接中的不确定列问题

有时,我们需要从两个以上的表中获取选定的列记录。这些表可以具有一些匹配的列名。
让我们看一个示例来了解这种情况,假设 Summer_fruits和Winter_fruits 表包含一个类似的列,即: fruit_id ,如下面的命令所示:
SELECT fruit_id, SF_ID, Summer_fruits_name, WF_ID, Winter_fruits_name
FROM Summer_fruits 
CROSS JOIN Winter_fruits;
输出
在执行上述命令时,PostgreSQL CROSS JOIN命令将引发错误,即列名不明确,并且这意味着两个表中都存在该列的名称。 PostgreSQL不清楚我们要显示哪一列。
PostgreSQL Cross Join
因此,要解决上面的错误,我们将在列名之前指定表名,如下面的命令所示:
SELECT Summer_fruits.fruit_id, Summer_fruits.SF_ID, Summer_fruits.Summer_fruits_name, 
Winter_fruits.WF_ID, Winter_fruits.Winter_fruits_name
FROM Summer_fruits 
CROSS JOIN Winter_fruits ;
输出
执行上述命令后,我们将得到以下结果:
PostgreSQL Cross Join

使用PostgreSQL Cross Join的表别名

通常,我们要联接的表将具有相似的列名称,例如 fruit_id 列。
我们可以使用表别名代替连接表的完整名称,从而为联接表分配短名称,以使命令更容易理解。有时,编写完整表名是一个繁琐的过程。
因此,我们将使用表别名,并返回与上述类似的结果。如下面的命令所示:
SELECT s.fruit_id, s.SF_ID, s.Summer_fruits_name, w.WF_ID,
w.Winter_fruits_name
FROM Summer_fruits s
CROSS JOIN Winter_fruits w;
输出
一旦执行上述命令,我们将获得以下输出:
PostgreSQL交叉联接

使用WHERE子句的PostgreSQL交叉联接

如果我们要从表1中标识行( Summer_fruits )在表2中没有任何匹配的行( Winter_fruits ),我们可以使用 WHERE条件和交叉加入。
如下面的命令所示,我们正在从两个表中选择行: Summer_fruits和Winter_fruits ,其中 Summer_fruits_name 等于西瓜,而 Winter_fruits_name 不等于菠萝。
SELECT Summer_fruits.fruit_id, Summer_fruits.SF_ID, 
Summer_fruits.Summer_fruits_name, Winter_fruits.WF_ID,
Winter_fruits.Winter_fruits_name
FROM Summer_fruits 
CROSS JOIN Winter_fruits  
WHERE Summer_fruits_name ='Watermelon' 
AND Winter_fruits_name != 'Pineapple';
输出
在执行上述命令时,我们将得到以下结果:
PostgreSQL Cross Join

使用PostgreSQL Cross JOIN连接多个表

在上一节中,我们有两个表为现在,如果我们要联接两个以上的表并从该特定表中获取记录,请 Summer_fruits和Winter_fruits 。在这种情况下,我们将使用交叉联接。
例如,我们将通过使用创建子句来创建 Fruite_sales 表,如我们在以下命令:
CREATE TABLE Fruit_sales (
Fruit_id int primary key, 
Sales_id int,
Fruits_name varchar not null
);
要查看 Fruit_sales 表的值,我们将使用 SELECT 子句,如下所示:
一旦 Fruit_sales 表已成功创建,我们将在INSERT命令的帮助下向其中插入一些值,如以下命令所示:
INSERT INTO Fruit_sales (fruit_id, Sales_id, Fruits_name)
VALUES (1, 101,'Apple'),
(2, 102,'Banana'),
(3, 103,'Watermelon'),
(4, 104,'Mango'),
(5, 105,'Pineapple'),
(6, 105,'Grapes');
在 Fruit_sales 表中创建并插入值之后,执行以下命令将得到以下输出:
Select * from Fruit_sales;
表3: Fruit_sales
PostgreSQL交叉联接
现在,我们将在 PostgreSQL Cross Join 的帮助下,连接多个表,例如 Summer_fruits,Winter_fruits和Fruit_sales :
SELECT * FROM Summer_fruits  
LEFT JOIN (Winter_fruits CROSS JOIN Fruit_sales)  
ON Summer_fruits.fruit_id= Fruit_sales.fruit_id  
ORDER BY Fruits_name;  
输出
在执行上述命令时,我们将获得以下输出:
PostgreSQL Cross Join

概述

在PostgreSQL Cross Join部分中,我们学习了以下主题:
我们使用了 PostgreSQL交叉连接子句从两个表中选择数据,并了解了歧义列问题。 我们将PostgreSQL Full连接条件与表别名和WHERE子句一起使用,并从多个表中获取记录。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4