📜  PostgreSQL自连接

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

PostgreSQL自连接

在本节中,我们将了解PostgreSQL自连接的工作原理,该自连接用于关联同一表中的行。我们还学习了如何借助PostgreSQL Self join子句从相似的表中获取分层数据

什么是PostgreSQL自连接?

PostgreSQL中,我们有一种特殊的联接类型,称为自联接“ PostgreSQL自连接用于完全设置相似表的不同名称,我们也可以使用别名。

为了进行自联接,我们将定义两次具有不同表别名的相似表,并在ON关键字后给出Join谓词。

实时地,我们使用自联接来比较同一表中的行(因为在PostgreSQL中不允许相似表名的比较),并获取分层数据。

注意:没有诸如“自我连接”之类的关键字;但是,我们可以在别名的帮助下使用PostgreSQL内部连接,左连接,右连接。

PostgreSQL自连接语法

在PostgreSQL中,Self-Join具有不同的语法,如下所示:

语法1

在下面的语法中,我们使用内部联接关键字,它将表合并到自身:

SELECT column_list
FROM table_name Table1
INNER JOIN table_name Table2 ON join_predicate;

在以上语法中, table_name与PostgreSQL INNER JOIN子句的帮助结合在一起。

语法2

在以下语法中,我们使用Left Join Keyword ,它将表与自身结合起来:

SELECT column_list
FROM table_name Table1
LEFT JOIN table_name Table2 ON join_predicate;

在上面的语法中, table_name本身通过PostgreSQL LEFT JOIN子句结合在一起。

语法3

在下面的语法中,我们使用Right Join Keyword ,它将表合并到自身:

SELECT column_list
FROM table_name Table1
RIGHT JOIN Table_name Table2 ON join_predicate;

在上面的语法中, table_name在PostgreSQL RIGHT JOIN子句的帮助下结合在一起。

PostgreSQL自连接示例

让我们看一个示例,以了解PostgreSQL Self连接的工作方式:

从表中获取层次记录的示例

为此,我们将创建一个示例数据库,然后在CREATE命令的帮助下创建一个名为Customer的表,并使用INSERT命令插入一些值。

首先,我们将创建一个示例数据库,就像在PostgreSQL教程的前面部分中创建的那样,或者参考下面的链接了解如何在PostgreSQL中创建数据库:

https://www.javatpoint.com/postgresql-create-database

现在,我们将按照以下过程在pgadmin4中创建一个数据库:

  • 我们将在本地系统中然后在“对象”树中打开pgAdmin,然后右键单击“数据库”并选择“创建”,然后选择“数据库”

数据库→创建→数据库

  • 之后,将打开“创建数据库”窗口,我们需要在其中提供一些用于创建数据库的必要详细信息(数据库名称,Comment ),然后单击“保存”按钮。

  • 组织数据库已成功创建,并显示在“对象”树中,如下面的屏幕快照所示:

成功创建Origination数据库之后,我们将使用CREATE命令创建Customer表,如下面的语句所示:

CREATE TABLE Customer (
Customer_id INT PRIMARY KEY,
First_name VARCHAR NOT NULL,
Last_name VARCHAR NOT NULL,
Order_id INT,
FOREIGN KEY (Order_id) REFERENCES Customer (Customer_id) 
ON DELETE CASCADE
);

现在,我们将在INSERT的帮助下将一些客户记录插入到Customer表中,如下面的语句所示:

INSERT INTO Customer(Customer_id,First_name, Last_name,
Order_id )VALUES
(1, 'Mia', 'Rodriguez', NULL),
(2, 'Maria', 'Garcia', 1),
(3, 'James ', 'Johnson', 1),
(4, 'Michael', 'Smith', 2),  
(5, 'David', 'Smith', 2), 
(6, 'Jones', 'Smith', 2),
(7, 'Margaret', 'Brown', 3),
(8, 'Jane', 'Miller', 3),
(9, 'Catherine', 'Martinez', 4),
(10, 'Ana', 'Clark', 4);

在将值创建并插入到Customer表中之后,执行以下命令将获得以下输出:

Select * from Customer;

输出量

在“客户”表中,“订单ID”列引用“客户ID”列。 Order_id列中的值显示客户购买的订单。

如果Order_id列中的值为Null ,则客户不会购买任何东西。

正如我们在下图中看到的那样,总体层次结构如下所示:

在以下示例中,我们将通过“客户”表中的“自助加入”来获取购买者的数据:

SELECT
c.First_name || ' ' || o.Last_name Customer,
o.first_name || ' ' || o.last_name Orders
FROM
Customer c
INNER JOIN Customer o ON o. order_id = c.order_id
ORDER BY Orders;

输出量

执行上述命令后,我们将得到以下结果:

正如我们在上面的输出表中所看到的, Customer表被执行两次,一次作为Customer ,另一次作为Orders

在上面的命令中,我们使用表别名,例如c表示客户o表示Orders

并且联接谓词借助Customer_id和Orders_id列中的类似值来标识“客户/订单”对。

注意:Order_id为Null的客户(Mia Rodriguez)不会出现在结果上。

我们将使用LEFT JOIN代替INNER JOIN子句,以使用以下命令在输出表中包括最高顺序:

SELECT
c.First_name || ' ' || o.Last_name Customer,
o.first_name || ' ' || o.last_name Orders
FROM
Customer c
LEFT JOIN Customer o ON o. order_id = c.order_id
ORDER BY Orders;

输出量

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

总览

在PostgreSQL Self Join部分中,我们学习了以下主题:

  • PostgreSQL自连接是特殊连接,在这里我们还可以获取同一表中的层次结构数据。
  • 我们使用PostgreSQL Self join子句在Inner Join和Left Join子句的帮助下合并了一个表本身。