PostgreSQL交叉连接-PostgreSQL教程|
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教程]PostgreSQL教程-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL特性-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL版本-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL语法-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL创建数据库-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL选择数据库-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL删除/删除数据库-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL创建表-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL删除/删除表-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL显示表-PostgreSQL教程|
相关推荐:
- [PostgreSQL教程]PostgreSQL与SQLite-PostgreSQL教程|
- [PostgreSQL教程]MongoDB与PostgreSQL-PostgreSQL教程|
- [PostgreSQL教程]psqlcommands-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLDate&TimeFunction-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLFunctions-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLMulti-columnIndexes-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL禁用触发器-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL左连接-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLANDCondition-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL获取子句-PostgreSQL教程|
- PostgreSQL与SQLite-PostgreSQL教程|
- PostgreSQL与Oracle-PostgreSQL教程|
- PostgreSQL与MariaDB-PostgreSQL教程|
- PostgreSQL与SQLServer-PostgreSQL教程|
- MongoDB与PostgreSQL-PostgreSQL教程|
- PostgreSQLEXCEPT-PostgreSQL教程|
- PostgreSQLINTERSECT-PostgreSQL教程|
- PostgreSQLUnion-PostgreSQL教程|
- psqlcommands-PostgreSQL教程|
- PostgreSQLDate&TimeFunction-PostgreSQL教程|
- PostgreSQL删除触发器-PostgreSQL教程|
- PostgreSQLOrderby子句-PostgreSQL教程|
- PostgreSQL与SQLite-PostgreSQL教程|
- PostgreSQLINTERSECT-PostgreSQL教程|
- PostgreSQLAlias-PostgreSQL教程|
- PostgreSQLNot-NullConstraint-PostgreSQL教程|
- PostgreSQL与Oracle-PostgreSQL教程|
- PostgreSQL与MariaDB-PostgreSQL教程|
- MongoDB与PostgreSQL-PostgreSQL教程|
- PostgreSQLUnion-PostgreSQL教程|