📜  PostgreSQL存在条件

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

PostgreSQL存在条件

在本节中,我们将了解PostgreSQL EXISTS Condition的工作原理,该条件与WHERE子句一起使用以评估子查询中的现有行。我们还看到带有不同查询EXISTS条件示例,例如INSERT,SELECT,NOT EXISTS,NULL,UPDATE和DELETE。

PostgreSQL EXISTS条件的介绍

PostgreSQL中EXISTS条件可以与SELECTINSERTUPDATEDELETE命令结合使用。换句话说,我们可以说EXISTS条件用于检查子查询中是否存在任何数据,如果子查询返回多个记录,则返回true。

它用于与子查询分组并测试子查询中记录的存在。 PostgreSQL EXISTS条件是一种布尔运算符,它返回true或false 。换句话说,我们可以这样说:

  • 如果子查询返回任何记录,则Exists条件将返回TRUE值,否则将返回FALSE
  • 在此,始终用数字值1表示TRUE值,而将FALSE值表示为数字值0。

PostgreSQL EXISTS条件语法

PostgreSQL EXISTS条件的语法如下:

WHERE EXISTS (subquery);

Exists条件采用一个称为Subquery的参数。它经常与相关的子查询一起使用。

EXISTS条件的输出取决于子查询是否获取了任何行,而不取决于行信息。因此,在子查询的SELECT命令上出现的列并不重要。

在这种情况下,我们将对EXISTS条件使用以下语法:

SELECT column1, column2…columnN
FROM table1  
WHERE [NOT] EXISTS (  
    SELECT 1
    FROM table2   
    WHERE column2= table1.column1
);  

在以上语法中,我们还使用了NOT运算符来帮助我们与EXISTS条件相矛盾。当子查询不返回任何行时,它将返回TRUE ,否则它将返回FALSE

在以上语法中,我们使用了以下参数:

Parameter Description
Column1, Cloumn2…columnN It is used to specify the column name which used in the particular table.
table_name This parameter is used to define the table names from which we are going to perform the EXISTS condition.
Conditions The condition parameter is used to search the specific value from the table.
Subquery Generally, the SELECT command starts with the SELECT *, but PostgreSQL ignores it in a subquery.

注意:

  • 通常, SELECT命令以SELECT *开头,而不是列名或表达式列表。在这里,我们使用SELECT 1代替SELECT *,这有助于我们增强PostgreSQL中查询的性能。
  • 同时,子查询列的结果不合适,因为这里仅返回的行很重要。
  • 它将提供与PostgreSQL忽略子查询中的选择列表相同的输出。
  • 确定匹配的输出后,EXISTS条件将直接停止以进行其他处理。
  • 在PostgreSQL中,我们将在EXISTS条件下使用的SQL命令非常无效。因此,事先,对于外部查询表中的每一行,子查询都会重新运行。
  • 而且我们有更有效的方式来编写所有不使用EXISTS条件的命令。

PostgreSQL EXISTS条件的示例

让我们看不同的示例,以了解PostgreSQL EXISTS条件的工作原理。

首先,我们将看到一个EXISTS条件的示例示例,以学习PostgreSQL中有效的EXISTS运算符。

为此,我们从Javatpoint数据库获取ClientClient_details表。

在下面的示例中,我们使用client_details表中至少有一条client_salary大于30000的记录来标识那些Clients的信息。

以下命令将返回薪水超过30000的那些客户信息:

SELECT client_name, client_profession, 
client_qualification, Client_salary
FROM Client c
WHERE EXISTS
    (SELECT 1
     FROM Client_details cd
     WHERE cd.client_id = c.client_id
     AND client_salary > 30000 )
ORDER BY client_name, client_profession;

输出量

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

正如我们在上面的截图中看到,子查询分析Client_details表,以确定客户表中的每个客户端的细节如下场景。

  • 如果来自Client_detailsCLIENT_ID,并从客户端(cd.client_id = c.client_id)CLIENT_ID相等。
  • 并且client_salary大于30000 (client_salary> 30000)。

带有INSERT命令的PostgreSQL EXISTS条件的示例

我们将显示如何通过INSERT命令使用EXISTS条件。

为此,我们要从Organization数据库中获取employee,departmentJobs表,以将记录从一个表插入到另一个表。

在下面的示例中,我们将记录从employee表插入到department表中。我们从employee表中获取电话地址列记录,其中两个表中的emp_idjob_id相等。

INSERT INTO department
(phone, address)
SELECT phone, address
FROM employee
WHERE EXISTS (SELECT 1 
             FROM Jobs
             where employee.emp_id= Jobs.Job_id);

输出量

执行完上述命令后,我们将获得以下消息窗口,显示该值已成功插入到Department表中。

要检查记录是否已插入部门表中,我们将使用SELECT命令,如下所示:

Select * from department;

输出量

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

在上面的屏幕截图中,我们可以看到PostgreSQL EXISTS条件成功地将四个记录插入了Department表中。

带有SELECT命令的PostgreSQL EXISTS条件的示例

在下面的示例中,我们将显示如何在两个条件通过SELECT命令使用EXISTS条件。

我们从Javatpoint数据库中获取ClientClient_details表,以从一个表中选择所有记录。

我们将EXISTS条件WHERE子句一起使用,因为我们可以看到以下命令:

SELECT *
FROM Client
WHERE EXISTS (SELECT 1
              FROM Client_details
              WHERE Client.client_id = client_details.client_id);

输出量

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

在上面的Subquery语句中,我们使用了SELECT 1 ,这可以帮助我们提高性能,因为在Exists条件下不需要列输出,因为仅存在返回的行才很重要。

从上面的屏幕截图中可以看到, PostgreSQL EXISTS条件将返回Client表中的所有记录,其中Client_details表中的至少一个记录具有相似的Client_id。

使用NOT EXISTS条件的PostgreSQL EXIST条件示例

在PostgreSQL中,我们还可以将NOT条件EXISTS条件结合起来。

具有EXISTS条件的PostgreSQL NOT运算符用于获取其值与列表值不匹配的那些行。

注意:NOT条件与EXISTS条件的输出矛盾。我们知道,NOT条件与EXISTS条件完全相反,这意味着:

  • 如果子查询不返回任何行,则NOT EXISTS条件将返回TRUE
  • 或者,如果子查询返回多行,则NOT EXISTS条件将返回FALSE

为此,我们采用与上例类似的表( Client和client_details )。

下面的示例显示带有条件条件的非条件以获取该客户端信息,该信息在Client_details表中不存在。

SELECT *
FROM Client
WHERE NOT EXISTS (SELECT 1
              FROM Client_details
              WHERE Client.client_id = client_details.client_id);

输出量

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

在上面的示例中, PostgreSQL EXISTS示例将从Client表返回所有记录,其中给定client_id的client_details表中没有记录。

将EXISTS条件与NULL一起使用的示例

在PostgreSQL中,我们还可以将EXISTS条件NULL一起使用

带有NULL的PostgreSQL EXISTS条件用于获取那些子查询将返回NULL且EXISTS条件将返回TRUE的行

为此,我们从Javatpoint数据库获取employee表。

让我们看下面的示例,以了解Exists条件如何与NULL一起工作。

SELECT emp_fname, emp_lname
FROM employee
WHERE EXISTS (SELECT NULL)
ORDER BY emp_fname, emp_lname;

输出量

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

在上面的示例中,子查询语句返回NULL 。因此,该命令将返回employee表中的所有行。

使用UPDATE命令的PostgreSQL EXISTS条件示例

在下面的示例中,我们将显示如何通过UPDATE命令使用EXISTS条件。

为此,我们从Javatpoint数据库中获取Summer_fruitsWinter_fruits表。

在下面的命令,将PostgreSQL EXISTS条件被用于更新在summer_fruitsFruits_name列值从winter_fruits表所在的winter_fruits' wf_id列等于summer_fruits' sf_idwinter_fruits_name列。

UPDATE summer_fruits
SET Fruits_name=(SELECT winter_fruits.winter_fruits_name
                     FROM winter_fruits
                     WHERE winter_fruits.wf_id = summer_fruits.sf_id)
WHERE EXISTS (SELECT 1
              FROM winter_fruits
              WHERE winter_fruits.wf_id = summer_fruits.sf_id);

输出量

执行完上面的命令后,我们将获得以下输出,可以看到summer_fruits表已成功更新。

现在,我们将使用Select命令来检查summer_fruits表中的特定记录是否已更新:

SELECT * FROM summer_fruits;

输出量

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

带有DELETE命令的PostgreSQL EXISTS条件示例

在下面的示例中,我们将显示如何通过DELETE命令使用EXISTS条件。

在下面的示例中,我们将从JavatPoint数据库中获取CourseCourse_categories表,以从表中删除特定记录。

在下面的命令,PostgreSQLEXISTS条件是用于从课程表,其中从课程表和course_category_idCOURSE_IDCourse_categories表相等删除所有记录。

DELETE FROM Course
WHERE EXISTS (SELECT 1
       FROM Course_categories
       WHERE Course.course_id = Course_categories.course_category_id);

输出量

执行完上述命令后,我们将获得以下消息窗口,显示记录已成功从“课程”表中删除。

现在,我们将使用“选择”命令来检查“课程”表中的特定记录是否已删除:

SELECT * 
FROM Course;

输出量

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

总览

PostgreSQL EXISTS条件部分,我们学习了以下主题:

PostgreSQL EXISTS条件的使用提供了EXISTS条件来评估子查询中行是否存在的优点。

  • 我们已经看到了带有子查询的EXISTS条件的示例示例,以在子查询返回至少一行后检查条件是否得到满足。
  • 我们使用带有INSERT命令的EXISTS条件将记录从一个表插入到另一个表。
  • 我们使用EXISTS条件SELECT命令来获取特定的表记录。
  • 我们将EXISTS条件NOT运算符一起使用SELECT命令中,以从特定表中获取不存在的记录。
  • 我们使用EXISTS条件NULL来获取特定的表记录。
  • 我们使用EXISTS条件UPDATE语句来更新表的记录。
  • 我们使用EXISTS条件DELETE语句来删除特定表的记录。