当前位置: 首页 > article >正文

SQL 干货 | 使用 EXISTS 编写 SELECT 查询

基于 SQL 中的 EXISTS 运算符为我们提供了一种基于其他数据是否存在(或不存在)来检索数据的简便方法。更具体地说,它是一个逻辑运算符,用于评估子查询的结果,并返回一个布尔值,该值指示是否返回了行。尽管 IN 运算符可用于类似的目的,但需要注意它们之间的一些差异。今天的博客将介绍如何使用 EXISTS 运算符的几个示例,并提供一些指导,说明何时应使用 EXISTS 而不是 IN。

EXISTS 在实践中的应用

尽管 EXISTS 运算符可以在 SELECT、UPDATE、INSERT 或 DELETE 语句中使用,但为了保持简单,我们将重点介绍 SELECT 查询。因此,我们将使用的语法将非常类似于以下形式:

SELECT column_name(s) 
FROM table_name
WHERE EXISTS ( SELECT column_name(s) 
               FROM table_name
               WHERE condition );

我们将在 PostgreSQL 的几个表上执行我们的查询——比如客户和账户表,这些表在银行数据库中很常见。下面是在 Navicat for PostgreSQL 网格视图中显示的这些表:

customer_table (29K)

account_table (28K)

现在,我们可以使用以下查询来查看所有具有与其 customer_id 相关联的账户的客户:

SELECT *
FROM customer C
WHERE EXISTS ( SELECT *
               FROM account A
               WHERE C.customer_id = A.customer_id );

以下是在 Navicat Premium 的查询编辑器中执行上述查询的结果:

customers_with_accounts (49K)

使用 NOT EXISTS

相反地,在 EXISTS 运算符前加上 NOT 关键字会导致查询只选择子查询中没有匹配行的记录。我们可以使用 NOT EXISTS 来检索所有孤立的账户,即没有关联客户的账户:

SELECT *
FROM account A
WHERE NOT EXISTS ( SELECT *
                   FROM customer C
                   WHERE A.customer_id = C.customer_id );

由于客户表中没有该 ID 的客户,所以它返回了客户 #4 的账户。

accounts_without_customers (47K)

用 Joins 替换 EXISTS

使用 EXISTS 运算符的查询可能执行起来有点慢,因为子查询需要对外层查询的每一行都执行一次。因此,你应该尽可能考虑使用连接。事实上,我们可以使用 LEFT JOIN 来重写上面的EXISTS 查询:

SELECT C.*
FROM customer C
  LEFT JOIN account A ON C.customer_id = A.customer_id;

left_join (36K)

IN vs EXISTS 运算符

尽管 IN 运算符通常用于为列的某个值列表设置过滤器,但它也可以应用于子查询的结果。以下是我们第一个查询的等效查询,但这次使用的是 IN 而不是 EXISTS:

SELECT * 
FROM customer 
WHERE customer_id IN (SELECT customer_id FROM account);

请注意,我们只能选择想要进行比较的列,而不能选择 SELECT *。不过,IN 查询会产生相同的结果:

in_query (43K)

由于这两个操作符非常相似,数据库开发人员往往不确定应该使用哪一个。一般来说, 当你想根据特定值列表筛选行时,应该使用 IN 操作符。当你想检查子查询中是否存在满足某些条件的行时,应该使用 EXISTS。

结语

在今天的博客中,我们学习了如何使用 EXISTS 运算符,以及如何决定是使用 EXISTS 还是IN。

有兴趣试试 Navicat Premium 17 吗?你可以下载它进行为期14天的全功能免费试用。它适用于 Windows、macOS 和 Linux 操作系统。

Navicat 17 最新资讯 & 技术干货

- Navicat 17 体验官火热招募中

- Navicat- 17 新特性 | 用户界面再升级

- Navicat 17 新特性 | 模型设计创新与优化

- Navicat 17 新特性 | 查询与配置

- Navicat 17 新特性 | Navicat BI 功能革新升级

- Navicat 17 新特性 | 原生支持国产 Linux ARM 平台以及银河麒麟与统信操作系统

- 聚焦 Navicat 17 新特性 | 数据字典提升数据结构清晰度

- Navicat 17 新增 PolarDB 与 Garnet 数据库

- Navicat 17 新特性 | 聚焦 MongoDB

- Navicat 17 新特性 | 新增 Redis 哨兵部署模式

- 免费版 Navicat Premium Lite


http://www.kler.cn/news/342712.html

相关文章:

  • LeetCode 3311. 构造符合图结构的二维矩阵
  • Pr 视频效果:元数据和时间码刻录 - 元数据
  • React学习01 jsx、组件与组件的三大属性
  • 每日一题:单例模式
  • 01数组算法/代码随想录
  • 【计算机网络】CDN
  • java多态-cnblog
  • 如何在Amazon EC2 Ubuntu安装vsftp并开启TLS
  • CSS3旋转、平移、缩放、倾斜
  • 云计算的江湖,风云再起
  • selenium的 presence_of_element_located 与 invisibility_of_element_located的区别
  • Android 编译使用哪个key签名?
  • 第二十篇:必知的网络常识概念
  • js操作元素的其他操作(4个案例+效果图+代码)
  • 【动态规划-4.2 最长递增子序列(LIS)】力扣300. 最长递增子序列
  • 基于C++ 实现简易图书管理系统
  • 01 为什么要学习数据结构与算法
  • 洗衣店订单管理:Spring Boot技术实现
  • LangChain中使用Prompt01
  • 从 Reno TCP 到 Scalable TCP,HighSpeed TCP