📜  PostgreSQL连接

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

PostgreSQL的加入

在本节中,我们将简要了解几种类型的PostgreSQL联接的工作方式,例如内部联接,左联接,右联接和全外联接。

PostgreSQL JOINS与SELECT命令一起使用,这有助于我们从各种表中检索数据。我们可以将Select和Joins语句合并到一个命令中。每当我们想要从两个或多个表中获取记录时,我们将执行joins命令。

它用于根据连接的表之间的标准列的数据合并来自一个或多个表的列。通常,第一个表的标准列主键列第二个表列是外键列。

PostgreSQL中,我们有各种类型的联接,如下所示:

  • 内部联接
  • 左联接
  • 正确加入
  • 交叉联接
  • 完全外部联接
  • 自然加入
  • 自我加入。

下图显示了最重要的PostgreSQL联接,我们将在PostgreSQL教程的这一部分中进行解释。

PostgreSQL连接示例

让我们看一些不同类型的PostgreSQL联接的例子:

在这里,我们将创建并插入两个不同的表,在其中对几种类型的联接执行操作:

在下面的示例中,我们将使用“创建”命令创建Luxury_cars表。

CREATE TABLE Luxury_cars (
L_ID INT PRIMARY KEY,
luxury_car_names VARCHAR (250) NOT NULL);

输出量

一旦执行了上面的命令,我们将获得以下消息,该消息显示Luxury_cars表已成功创建。

再次在这里,我们将使用Create命令来创建Sports_cars表,如下所示:

CREATE TABLE Sports_cars (
S_ID INT PRIMARY KEY,
sports_car_names VARCHAR (250) NOT NULL);

输出量

一旦执行了上面的命令,我们将得到以下消息,该消息显示Sports_cars表已成功创建。

之后,我们将使用INSERT命令在Luxury_cars表中插入一些值:

INSERT INTO Luxury_cars (L_ID, luxury_car_names)
VALUES
(1, 'Chevrolet Corvette'),
(2, 'Mercedes Benz SL Class'),
(3, 'Audi A7'),
(4, 'Genesis G90'),
(5,'Lincoln Continental');

输出量

执行完上述命令后,我们将收到以下消息,表明已将值成功插入Luxury_cars表中。

就像我们在Luxury_cars表中插入值一样,我们也将在Insert命令的帮助下将值插入Sports_cars表中:

INSERT INTO Sports_cars (S_ID, sports_car_names)
VALUES
 (1, 'BMW Z4'),
 (2, 'Nissan 370Z'),
 (3, 'Chevrolet Corvette'),
 (4, 'Mercedes Benz SL Class'),
(5,'Subaru BRZ');

输出量

执行完上述命令后,我们将收到以下消息,表明已将值成功插入到Sports_cars表中。

上表中有一些类似的汽车,例如Chevrolet CorvetteMercedes Benz SL Class

现在,我们将使用SELECT命令从Luxury_cars表中获取以下数据:

Select * from Luxury_cars;

输出量

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

我们将使用SELECT命令从Sports_cars表中获取以下数据:

Select * from Sports_cars;

输出量

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

现在,让我们实时查看不同类型的PostgreSQL Join的工作情况:

PostgreSQL内部连接

PostgreSQL INNER JOIN用于返回满足连接条件的各种表中的所有行。

PostgreSQL内部连接的语法

SELECT columns  
FROM table1   
INNER JOIN table2  
ON table1.column = table2.column;  

下面的可视表示形式显示了PostgreSQL内部联接的工作方式:

例如

我们将使用上面的表( Luxury_cars和Sports_cars )来了解PostgreSQL内部联接。

下面的命令通过匹配Luxury_car_namesports_car_name列中的值,将第一个表( Luxury_cars )与第二个表(Sports_carsv)连接起来:

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
INNER JOIN Sports_cars
ON luxury_car_names= sports_car_names;

输出量

一旦执行了上面的命令,我们将得到以下结果,从中我们可以看到Luxury_carsSports_cars表中匹配的行数据。

  • 内部联接用于分析表A( Luxury_cars)中的每一行。
  • 将表B中每一行(Sports_cars )的luxury_car_name列中的记录等同于sports_car_name列中的记录。
  • 如果这些记录相似,则内部联接将创建一个包含来自两个表的列的新行,并将特定行增强到输出中。

PostgreSQL左联接

PostgreSQL LEFT JOIN用于返回左表中的所有行,这些表可以在ON条件中定义,而仅返回满足连接条件的其他表中的那些行。

PostgreSQL左连接的语法

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

下面的可视表示形式显示了PostgreSQL Left join的工作:

例如

在下面的命令中,我们将使用Left Join条件将Luxury_cars表Sports_cars表联接。

在Left连接子句中,表A或第一个表称为Left表,而表B或第二个表称为Right表

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
LEFT JOIN Sports_cars
ON luxury_car_names= sports_car_names;

输出量

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

PostgreSQL Left Join的工作

  • 在上面的截图,左连接条件选择左表(Luxury_cars)的记录,并将其与从Sports_carssports_car_names列中的值的luxury_car_names列相等的值。
  • 如果这些记录相似,则联接将创建一个新行,该行具有两个表的列,并将特定行添加到结果中,正如我们在上面的输出中看到的Row1和Row2一样。
  • 假设,如果值不相似,则左联接还会生成一个新行,该行涉及两个表中的列并将其添加到结果中。
  • 但是,它用null填充右表( Sports_cars )的列,因为我们可以在输出中看到Row3,Row4和Row5。

PostgreSQL使用Where子句退出联接

我们还可以在WHERE条件下使用左联接。在下面的例子中,我们将选择左表(Luxury_cars),不包含在右表(Sports_cars)类似的行的行:

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
LEFT JOIN Sports_cars
ON luxury_car_names= sports_car_names
WHERE S_ID IS NULL;

输出量

一旦执行了以上命令,我们将获得以下输出,该输出显示S_IDNULL的那些记录。


注意:我们可以同时使用LEFT JOIN和LEFT OUTER JOIN,因为Left联接和Left外部联接的工作方式相似。

下面的视觉表示说明了Left联接,该联接返回Left表中的行,其中Left表中不包含相似的行:

PostgreSQL右连接

PostgreSQL RIGHT JOIN用于返回Right表中的所有行,Right表可以在ON条件中定义,并且仅返回满足连接条件的另一个表中的那些行。

RIGHT JOIN将与LEFT JOIN相反,从右表获取数据。

PostgreSQL右连接的语法

SELECT columns  
FROM table1  
RIGHT JOIN table2  
ON table1.column = table2.column;  

下面的Venn图显示了PostgreSQL右连接的工作方式:

例如

下面的命令用于表示联接的工作,在该联接中,我们将Luxury_cars表与Sports_cars表联接在一起:

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
RIGHT JOIN Sports_cars
ON luxury_car_names= sports_car_names;

输出量

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

PostgreSQL右连接的工作

  • 另外,在上述图像中,RIGHT JOIN相当于在Sports_cars表在所有行中的Luxury_cars表中的列luxury_cars_name每个值的每一行的列Sports_car_names每个值。
  • 如果这些值相似,则联接将生成一个新行,其中包含两个表( Luxury_cars和Sports_cars )中的列。
  • 假设,如果值不相似,则右联接也会产生一个新行,该行涉及两个表中的列并将其增强为输出。

PostgreSQL Right Where with Where子句

同样,我们也可以在WHERE条件下使用正确的联接。例如,我们将使用where子句从右表( Sports_cars )中选择行,该表在左表(Luxury_cars )中不包含相似的行:

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
RIGHT JOIN Sports_cars
ON luxury_car_names= sports_car_names
WHERE L_ID IS NULL;

输出量

执行完上述命令后,我们将获得以下输出,其中显示L_IDNULL的那些记录。


注意:我们可以同时使用RIGHT JOIN和RIGHT OUTER JOIN,因为Right Join和Right外联接的工作彼此相似。

下面的可视表示形式说明了Right联接,该联接从Right表返回行,Right表在左表中不包含相似的行:

PostgreSQL完全外部联接

当左表右表中的记录匹配时,将使用FULL OUTER JOIN返回所有记录。

PostgreSQL Full Outer Join的语法

SELECT columns  
FROM table1  
FULL OUTER JOIN table2  
ON table1.column = table2.column;  

下面的Venn图显示了PostgreSQL Full Outer连接的工作方式:

例如

以下命令用于表示将Luxury_cars表与Sports_cars联接在一起的Full Outer联接的工作。

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
FULL OUTER JOIN Sports_cars
ON luxury_car_names= sports_car_names;

输出量

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

PostgreSQL Full where Join使用where子句

下面的Venn图显示了完整的外部联接,该联接从一个表返回行,该表不包含另一个表中的匹配行:

要返回表中没有其他行的表中的行,我们将使用带有WHERE子句的完全外部联接,如下所示:

SELECT L_ID, luxury_car_names, S_ID, sports_car_names
FROM Luxury_cars
FULL OUTER JOIN Sports_cars
ON luxury_car_names= sports_car_names
WHERE L_ID IS NULL OR S_ID IS NULL;

输出量

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

总览

在本节中,我们学习了几种PostgreSQL联接的工作方式,这些联接结合了来自各种连接表的数据。