📜  PostgreSQL左联接

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

PostgreSQL左联接

在本节中,我们将了解ostgreSQL Left join的工作原理,该方法用于从left表返回数据。我们还将学习如何使用表别名, WHERE子句,USING子句,以及如何在PostgreSQL Left连接子句的帮助下连接多个表。

什么是PostgreSQL Left Outer Join或Left Join子句?

PostgreSQL LEFT JOINLeft Outer Join用于返回左表中的所有行以及满足ON条件中定义的满足连接条件的另一个表中的行。如果在右表中没有找到相应的记录,它将返回null

左联接也可以称为左外部联接子句。因此,“外部”是可选关键字,在“左连接”中使用。在PostgreSQL中Left联接与Inner Join条件平行。

下面的Venn图显示了PostgreSQL左连接,在这里我们可以很容易地理解到,左连接返回了Left表中的所有数据以及Right表中的类似数据:

PostgreSQL左连接语法

Left Join关键字与SELECT命令一起使用,并且必须写在FROM关键字之后。

SELECT columns  
FROM table1  
LEFT [OUTER] JOIN table2  
ON table1.column = table2.column;  

在上面的语法中, table1向左表table2向右表,这意味着特定条件将根据定义的连接条件返回table1的所有记录和table2的匹配记录。

我们将按照以下步骤在左或左外部联接条件的帮助下联接左表和右表:

  • 首先,我们将从两个表中定义列列表,我们希望在SELECT条件下选择数据。
  • 然后,我们将定义Left表,它是FROM子句中的表1。
  • 最后,我们将描述Right表,它是Left JOIN条件下的表2 ,并在ON关键字之后写入联接条件。

PostgreSQL左连接示例

让我们看一个示例来了解PostgreSQL Left连接的工作方式:

使用PostgreSQL左联接联接两个表

为此,我们将在CREATE命令的帮助下创建两个名为ClientOrders表的表,并使用INSERT commandM插入一些值。

首先,我们将使用CREATE命令创建Client和Orders表:

CREATE TABLE Client(
client_id int primary key, 
client_name varchar not null, 
client_profession varchar not null, 
client_qualification varchar not null,
client_salary int );

以下命令用于创建订单表:

Create table Orders
(client_id int primary key,
order_id int not null,
price int,
order_date Date Not null);

执行上述命令后,已经成功创建了Client和Orders表。

一旦生成了两个表,我们就可以使用INSERT命令如下向其中插入一些值:

INSERT INTO Client (client_id, client_name, 
client_profession, client_qualification, client_salary)
VALUES
(1, 'Emma Hernandez','Web Designer','BTech', 25000),
(2, 'Mia Clark','Software Engineer','BE',20000),
(3, 'Noah Rodriguez','Bussinessman','MBA',50000),
(4, 'Martha Brown','Doctor','MBBS',75000),
(5,'James Luther','HR','MBA',35000),
(6,'Maria Garcia','Astronaut','Msc', 100000),
(7,'Robert Smith','Software Tester','BTech',30000);

在下面的命令中,我们将值插入到Orders表中:

INSERT INTO Orders (client_id, order_id, price, order_date)
VALUES
(1, 101, 2000,'2020-05-14'),
(2, 102, 3500,'2019-08-30'),
(3, 103, 4000,'2020-06-23'),
(4, 104, 2500,'2017-12-11'),
(5, 105, 5000,'2018-10-26');

在“客户和订单”表中创建并插入值之后,执行以下命令将获得以下输出:

表1:客户

Select * from Client;

输出量

表2:订单

Select * from Orders;

输出量

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

以下查询用于从两个表( ClientOrder )中选择记录:

SELECT Client.client_id, client_name, order_date, price 
FROM Client  
LEFT JOIN Orders 
ON Client.client_id = Orders.client_id;

或者我们在上面的查询中使用Left Outer Join关键字代替Left Join关键字,因为两者都会给出类似的输出:

SELECT Client.client_id, client_name, order_date, price 
FROM Client  
LEFT Outer JOIN Orders 
ON Client.client_id = Orders.client_id;

输出量

一旦执行了上面的命令,我们将得到以下结果:


注意:如果“客户”表中的行在“订单”表中没有匹配的行,则不匹配的行的order_date和price列的值将为NULL。

PostgreSQL的工作Left join

  • 在上面的屏幕截图中,左联接条件从左表(Client)中选择记录,并且将client_id,client_name列中的值与Orders表中order_date,price列中的值相等。
  • 如果这些记录相似,则Left联接将创建一个新行,该行具有在Select子句中显示的列,并将特定行添加到结果中。
  • 假设,如果值不相似,则左联接还会生成一个新行,该行将显示在SELECT命令中,并用NULL填充来自右表( Orders )的列。

PostgreSQL左联接的表别名

我们将使用表别名为联接的表分配短名称,以使该命令更易于理解。

通常,我们要联接的表将具有名称相似的列,例如Client_id列。在下面的命令中,我们将使用表别名,并且它将返回与上面类似的结果:

SELECT c.Client_id, Client_name,order_date, price
FROM Client c 
LEFT JOIN Orders o 
ON c.client_id= o.client_id;

输出量

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

PostgreSQL左连接USING子句

在这里,我们将看到PostgreSQL Left连接如何与USING子句一起工作。

这两个表( Client和Order )都包含类似的列名Client_id;这就是为什么我们可以使用USING子句从表中获取值的原因。

在下面的示例中,我们在Left join中使用USING子句,该子句返回值Client_id,Client_name,Client_prof,price和order_date,因为两个表的Client_id列均相似。

SELECT Client_id, Client_name, Client_profession, order_date, price
FROM Client  
LEFT JOIN Orders   
USING (client_id);  

输出量

执行以上语句后,我们将得到以下结果:

PostgreSQL使用WHERE子句的左联接

在这里, WHERE子句允许我们返回过滤器结果。我们还可以将WHERE条件与Left join一起使用

在下面的示例中,我们将从clientOrders表中选择client_qualification等于MBA的行:

SELECT Client_id, Client_name, client_qualification,order_date, price
FROM Client  
LEFT JOIN Orders   
USING (client_id) WHERE client_qualification ='MBA';

输出量

成功执行以上命令后,将给出以下输出:

PostgreSQL LEFT JOIN中WHERE和ON子句之间的区别

我们可以看到以下命令,以了解WHERE和PostgreSQL Left join中的ON子句之间的区别。

在左联接中,WHERE和ON子句为我们提供了不同的输出。

首先,我们在左连接中使用WHERE子句,如下面的命令所示:

SELECT client_name, client_profession, order_id, order_date, price
FROM Client 
LEFT JOIN Orders   
USING(client_id) WHERE price=3500;

输出量

一旦实现了上面的查询,我们将获得以下输出:

现在,我们在左连接中使用ON子句,如下面的命令所示:

SELECT client_name, client_profession, order_id, order_date, price
FROM Client 
LEFT JOIN Orders ON price=3500;

输出量

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


注意:在PostgreSQL中,如果我们在命令中使用WHERE和ON子句,则Inner联接将始终返回类似的输出。

使用PostgreSQL联接各种表Left JOIN

在上一节中,我们已经创建了两个表ClientOrders 。现在,我们使用Left连接来组合各种表并从该特定表中获取记录。

因此,我们将使用CREATE命令再创建一个表作为Clieint_详细信息,如以下命令所示:

CREATE TABLE Client_details (
Phone_id int primary key, 
Mobile_number bigint,
address varchar not null
);

成功创建Clieint_详细信息表后,我们将在INSERT命令的帮助下向其中插入一些值,如以下命令所示:

INSERT INTO Client_details (Phone_id,Mobile_number,address)
VALUES (1, 9976542310,'Florida'),
(2, 9869456700,'New York'),
(3, 7345672210,'Chicago'),
(4, 9088506466,'Houston'),
(5, 9476548901,'Los Angeles');

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

Select * from Client_details;

表3:Client_details

现在,我们将在PostgreSQL Left Join的帮助下连接多个表,例如Client, Orders和Client_details ,如以下语句所示:

SELECT Client.client_name, order_id, order_date,Mobile_number
FROM Client 
LEFT JOIN Client_details 
ON Client_id= phone_id 
LEFT JOIN Orders 
ON Client.client_id = Orders.client_id 
ORDER BY client_salary;

输出量

成功执行以上命令后,我们将给出以下结果:

使用PostgreSQL LEFT JOIN子句获取不匹配的记录

如果要从表中获取数据,该表不包含来自另一个表的任何相似的数据行,那么在这种情况下,我们将使用PostgreSQL LEFT JOIN子句。

如下面的示例所示,LEFT JOIN子句用于标识没有Mobile_number的客户端

SELECT client_id, client_name, mobile_number 
FROM Client 
LEFT JOIN Client_details
ON client_id = phone_id  
WHERE Mobile_number IS NULL;  

输出量

一旦执行了以上命令,我们将得到以下结果: