📜  PostgreSQL自然连接

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

PostgreSQL自然连接

在本节中,我们将了解PostgreSQL Natural join的工作原理,该方法用于联接两个或两个以上的表。

什么是PostgreSQL Natural Join子句?

自然联接是将多个表组合在一起的地方,作为输出,我们将获得新的行,该行用于联接每个表的列。并且它还用于组合表,这将根据组合表中的相似列名创建隐式联接。

换句话说,我们可以说PostgreSQL Natural Join子句实质上是为一组行创建一个临时表,以处理几个(两个或更多)表。

这些表将在连接条件中指定,并且至少具有一个共同的列,并且这些标准列之间应具有关系。

默认情况下, PostgreSQL将使用INNER JOIN操作。它可以与LEFT JOININNER JOINRIGHT JOIN一起使用,但是联接的类型必须在联接中定义,否则PostgreSQL默认将使用INNER JOIN操作。

PostgreSQL Natural Join的语法

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

SELECT [Column_list |*]
FROM Table1
NATURAL [INNER, LEFT, RIGHT] JOIN Table2;

注意:在上述语法中,我们也可以使用星号(*)代替Column-list,因为星号将生成包含以下字段的输出:

  • 当两个表都有唯一的column时,其中包含不同的名。
  • 当表具有公共字段两列均具有相同名称时。

PostgreSQL自然连接的例子

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

使用PostgreSQL Natural Join连接两个表

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

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

以下语句用于创建Course_categories表:

CREATE TABLE Course_categories (
Course_category_id serial PRIMARY KEY,
Course_category VARCHAR NOT NULL,
Course_id INT NOT NULL,
FOREIGN KEY (Course_id) REFERENCES Course(Course_id)
);

以下命令用于创建课程表:

CREATE TABLE Course (
Course_id serial PRIMARY KEY,
Course_name VARCHAR NOT NULL
);

执行上述命令后, Course_categories和Course表已成功创建。

在上表中,所有课程类别都有零个或几个课程,但是这里所有课程都链接到唯一的课程类别

Course_catagories表中, Cousre_id列是Foreign key ,它被称为Course的主键。

因为Course_id是两个表中的标准列,所以我们将使用PostgreSQL自然连接。

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

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

INSERT INTO Course_categories (Course_category, Course_id)
VALUES
('Adobe Photoshop', 1),
('Adobe Illustrator', 1),
('JavaScript', 2),
('Advance CSS', 2),
('Machine Learning', 2),
('AWS', 3),
('CCNA', 3),
('Kubernetes', 3),
('Social Media Marketing', 4),
('Digital Marketing', 4);

在下面的命令中,我们将值插入“课程”表中:

INSERT INTO Course (Course_name)
VALUES
('Design'),
('Development'),
('IT & Software')
('Marketing');

在将Course_categories和Course表中的值创建并插入之后,我们将使用SELECT命令查看特定表上的现有记录:

表1: Course_categories

Select * from Course_categories;

输出量

实施上述命令后,我们将从Course_categories表中获取以下数据:

表2:课程

Select * from Course;

输出量

执行上述命令后,我们将从“课程”表中获得以下记录:

下面的查询使用PostgreSQL Natural Join子句来合并Course和Course_categories表中的记录。

SELECT * 
FROM Course_categories
NATURAL JOIN Course;

输出量

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

上面的命令类似于下面的命令,其中我们使用INNER JOIN子句而不是Natural Join Keyword

SELECT * 
FROM Course_categories
INNER JOIN Course USING (Course_id);

输出量

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

PostgreSQL Natural Join中,似乎不需要描述Join子句,因为它使用隐式连接条件取决于Common列。

但是,我们应尽可能避免使用自然连接,因为有时它会导致无法预测的结果。

让我们看一个示例,如果两个表中都有两个标准列。因此,为此,我们将采用员工和部门表:

员工表的结构

通过使用Select命令,我们将看到employee表的结构,如下所示:

Select * from employee;

输出量

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

部门表的结构

我们将通过使用Select命令来查看部门表的结构,如下所示:

Select * from department;

输出量

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

正如我们在上面的屏幕截图中看到的那样, employee和department表具有相同的emp_id列,因此我们可以使用Natural Join子句在以下命令中组合这些表:

SELECT * 
FROM employee
NATURAL JOIN department;

输出量

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

在上面的输出中,我们将获得空表,因为两个表还具有另一个称为emp_fname的公共列,并且该列不能用于PostgreSQL Natural Join 。但是自然联接条件仅使用emp_fname列。

总览

在“ PostgreSQL自然连接”部分,我们学习了以下主题:

  • 在“ PostgreSQL自然连接”部分,我们学习了以下主题: