PostgreSQL 交叉连接 PostgreSQL Full join PostgreSQL Self joins PostgreSQL 交叉连接 在本节中,我们将了解PostgreSQL Cross join的工作原理,它允许我们创建两个或多个表中行的笛卡尔积。我们还学习了如何使用表别名、WHERE 子句以及在PostgreSQL Cross Join 子句的帮助下连接多个表。 什么是 PostgreSQL 交叉连接? 的PostgreSQL的交叉联接用于将多个表和返回输出,该输出包含从所有选定的表的每一行的所有的可能性进行组合。在CROSS JOIN,进一步称为CARTESIAN JOIN,使我们能够生产所有相关的表的笛卡尔乘积。 Cartesian product 可以被描述为在第一表乘以在所述第二表中的所有行的所有现有行。它与Inner Join**并行,其中此子句不存在连接条件。 下面的维恩图展示了PostgreSQL Cross Join,在这里我们可以很容易理解,Cross Join返回了Table1 和 Table2 中的所有记录,每一行都是来自两个表的行的分组。 PostgreSQL 交叉连接语法 在跨加入关键字用于与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-lists column-list 用于指定我们要返回的列或字段的名称。 Table1 and Table2 这些是我们从中获取记录的表名。 PostgreSQL 交叉连接示例 让我们看一个例子来理解PostgreSQL 交叉连接是如何工作的: 使用 PostgreSQL Cross Join 连接两个表 为此,我们将使用Summer_fruits 和 Winter_fruits\表,这是我们在PostgreSQL 教程的 PostgreSQL Full join 部分中创建的。 表 1: Summer_fruits 要查看Summer_fruits\表的记录,我们将使用SELECT命令,如下面的命令所示: Select * from Summer_fruits; 输出 执行上述命令后,我们会从Summer_fruits\表中获取数据: 表 2:Winter_fruits 要查看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 命令抛出一个错误,即The column name is ambiguous,这意味着该列的名称存在于两个表中。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 交叉连接 如果我们想识别 Table1 ( Summer_fruits ) 中在 Table2 ( 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。 例如,我们将使用 Create Clause创建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 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子句从两个表中选择数据并理解Ambiguous Columns 问题。 我们使用带有表别名和 WHERE 子句的 PostgreSQL 完整连接条件,并从多个表中获取记录。 PostgreSQL Full join PostgreSQL Self joins