问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用 EXISTS 编写 SELECT 查询

创作时间:
作者:
@小白创作中心

使用 EXISTS 编写 SELECT 查询

引用
1
来源
1.
https://www.navicat.com.cn/company/aboutus/blog/1087-%E4%BD%BF%E7%94%A8-exists-%E7%BC%96%E5%86%99-select-%E6%9F%A5%E8%AF%A2.html

SQL中的EXISTS运算符提供了一种基于其他数据是否存在(或不存在)来检索数据的简便方法。本文将通过具体示例介绍如何使用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_id相关联的账户的客户:

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

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

使用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的账户。

用Joins替换EXISTS

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

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

IN vs EXISTS运算符

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

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

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

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

结语

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

本文原文来自Navicat博客

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号