📜  PostgreSQL交叉连接

📅  最后修改于: 2020-11-30 09:24:47             🧑  作者: Mango

PostgreSQL交叉连接

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

什么是PostgreSQL Cross Join?

PostgreSQL交叉连接用于合并多个表的所有可能性,并返回输出,其中包含所有选定表的每一行。 CROSS JOIN ,也称为CARTESIAN JOIN ,它使我们能够生成所有相关表的笛卡尔乘积。

笛卡尔积可以描述为第一个表中的所有现有行乘以第二个表中的所有行。它与Inner Join并行,在该条件中此子句不存在连接条件。

下面的Venn图显示了PostgreSQL交叉连接,我们可以很容易地理解到交叉连接返回Table1和Table2的所有记录,并且每一行都是来自两个表的行的分组。

PostgreSQL交叉连接语法

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;

在以上语法中,我们具有以下参数:

Parameter Description
Column-lists The column-list is used to specify the name of the column or field, which we want to return.
Table1 and Table2 These are the table name from which we get the records.

PostgreSQL交叉连接的示例

让我们看一个示例,以了解PostgreSQL Cross join的工作方式:

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

为此,我们将使用在PostgreSQL教程的PostgreSQL完全连接部分中创建的Summer_fruits和Winter_fruits表。

表1:夏季水果

要查看Summer_fruits表的记录,我们将使用SELECT命令,如以下命令所示:

Select * from Summer_fruits;

输出量

执行完上述命令后,我们将从Summer_fruits表中获取数据:

表2:冬季水果

要查看Winter_fruits表中的记录,我们将使用SELECT命令,如以下命令所示:

Select * from Winter_fruits;

输出量

执行完上述命令后,我们将从Winter_fruits表中获取数据:

我们将执行以下命令从两个表( Summer_fruits和Winter_fruits )中获取所有记录:

SELECT *
FROM Summer_fruits 
CROSS JOIN Winter_fruits ;

输出量

执行上述命令后,我们将获得以下输出:

当执行交叉联接命令,我们将看到它显示42行,这意味着从Summer_fruites表乘行从Winter_fruits表中的行。

注意:建议在SELECT *命令的位置使用单独的列名,以避免两次重复列的输出。

PostgreSQL中的不确定列问题CROSS JOIN

有时,我们需要从两个以上的表中获取选定的列记录。这些表可以具有一些匹配的列名。

让我们看一个示例来了解这种情况,假设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不清楚我们要显示哪一列。

因此,为解决上述错误,我们将在列名之前指定表名,如下面的命令所示:

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交叉联接的表别名

通常,我们要联接的表将具有名称相似的列,例如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;

输出量

一旦执行了以上命令,我们将获得以下输出:

使用WHERE子句的PostgreSQL Cross Join

如果要标识Table1( Summer_fruits )中的表1中没有任何匹配行的行( Winter_fruits ),则可以将WHERE条件Cross Join一起使用

从下面的命令中可以看到,我们从Summer_fruits和Winter_fruits两个表中选择行,其中Summer_fruits_name等于Watermelon,Winter_fruits_name不等于Pineapple

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连接多个表

在上一节中,如果我们要联接两个以上的表并从该特定表中获取记录,则现在有两个表,分别为Summer_fruits和Winter_fruits。在这种情况下,我们将使用Cross join

例如,我们将使用“创建子句”来创建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:水果销售

现在,我们将在PostgreSQL交叉连接的帮助下连接多个表,例如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 Full连接条件与表别名和WHERE子句一起使用,并从多个表中获取记录。