PostgreSQL Exists Condition


PostgreSQL Exists Condition

在本节中,我们将了解PostgreSQL EXISTS Condition的工作它与WHERE 子句一起用于评估子查询中的现有行。我们还看到了EXISTS 条件的**示例,其中包含不同的查询,例如INSERT、SELECT、NOT EXISTS、NULL、UPDATE 和 DELETE。

PostgreSQL EXISTS 条件介绍

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

它用于与子查询分组并测试子查询中记录的存在。所述的PostgreSQL EXISTS条件是一种类型的布尔运算符,它返回真或假的结果。换句话说,我们可以说:

  • 如果子查询返回任何记录,Exists 条件将返回TRUE值,否则将返回FALSE
  • 这里的TRUE值总是与示出的数字值1,并且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

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

范围 描述
Column1, Cloumn2…columnN 它用于指定在特定表中使用的列名。
table_name 此参数用于定义我们将要执行 EXISTS 条件的表名。
Conditions 条件参数用于从表中搜索特定值。
Subquery 通常,SELECT 命令以 SELECT * 开头,但 PostgreSQL 在子查询中忽略它。

笔记:

  • 通常,SELECT 命令SELECT *开头,而不是列名或表达式列表。在这里,我们使用SELECT 1代替SELECT *,这有助于我们提高 PostgreSQL 中的查询性能。
  • 同时,子查询列结果不合适,因为在这里,只有返回的行才重要。
  • 它将给出与 PostgreSQL 忽略子查询中的选择列表相同的输出。
  • EXISTS条件的匹配输出被识别后,将直接停止额外的处理。
  • 在 PostgreSQL 中,我们将在EXISTS 条件中使用的 SQL 命令非常无效。因此,预先对外部查询表中的每一行重新运行子查询。
  • 我们有更有效的方法来编写所有不使用 EXISTS 条件的命令。

PostgreSQL EXISTS 条件示例

让我们看不同的例子来理解PostgreSQL EXISTS 条件是如何工作的。

首先,我们将看到一个 EXISTS 条件的示例示例,以了解PostgreSQL 中工作的 EXISTS 运算符。

为此,我们从Javatpoint 数据库中获取Client\Client_details\表。

在下面的示例中,我们使用client_details表中的至少一个记录来识别那些客户的信息,其中client_salary大于30000。

以下命令将返回工资超过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;

输出

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

PostgreSQL 存在条件

正如我们在上面的屏幕截图中看到的,子查询分析了Client_details\表,以识别Client\表中每个客户端的详细信息的以下场景。

  • 如果CLIENT_IDClient_details\表,CLIENT_ID客户端\(cd.client_id = c.client_id)是相等的。
  • 并且client_salary大于30000 (client_salary > 30000)。

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

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

为此,我们从组织数据库中取出员工、部门\工作\表,将记录从一个表插入到另一个表。

在以下示例中,我们将记录从员工\表插入部门\表。我们从emp_idjob_id在两个表中相等的emp_idjob_idemployee\表中获取电话地址列记录。

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

输出

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

PostgreSQL 存在条件

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

Select * from department;

输出

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

PostgreSQL 存在条件

在上面的截图中,我们可以看到PostgreSQL EXISTS 条件成功地将4 条记录插入到了部门\表中。

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

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

我们从Javatpoint数据库中取出Client\Client_details\表,以从一张表中选择所有记录。

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

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

输出

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

PostgreSQL 存在条件

在上面的子查询语句中,我们使用了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\)。

以下示例显示Not 条件和 EXISTS 条件以获取Client_details\表中不存在的客户端信息。

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

输出

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

PostgreSQL 存在条件

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

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

在 PostgreSQL 中,我们也可以使用EXISTS 条件NULL

PostgreSQL EXISTS Condition with NULL 用于获取子查询将返回NULL 的行,EXISTS 条件将返回TRUE

为此,我们从Javatpoint数据库中获取员工\表。

让我们看下面的例子来了解Exists 条件如何与NULL 一起工作

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

输出

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

PostgreSQL 存在条件

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

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

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

为此,我们从Javatpoint数据库中获取Summer_fruits\Winter_fruits\表。

在下面的命令时,PostgreSQL的EXISTS条件被用于更新Fruits_name列中的值summer_fruits\表作为的winter_fruits_name从柱winter_fruits\表所在的winter_fruits'\ wf_id列等于summer_fruits'\ sf_id柱。

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\表已经更新成功。

PostgreSQL 存在条件

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

SELECT * FROM summer_fruits;

输出

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

PostgreSQL 存在条件

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

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

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

在下面的命令时,PostgreSQL的EXISTS条件是用于从删除所有记录课程\表所在的COURSE_ID课程\表和course_category_idCourse_categories\表是相等的。

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

输出

执行上述命令后,我们将看到以下消息窗口,显示已成功从Course\表中删除记录。

PostgreSQL 存在条件

我们现在将使用Select命令来检查Course\表中的特定记录是否已被删除:

SELECT *   
FROM Course;

输出

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

PostgreSQL 存在条件

概述

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

使用的PostgreSQL EXISTS条件提供的优点的EXISTS条件,以评估在子查询行存在。

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