剑未佩妥,出门已是江湖。
The Sword Unsheathed, Venture Begins: Into the Realm of Rivers and Lakes.

SQL 中 JOIN、IN 和 EXISTS 子句的区别

 最后更新7/27/2024
type
Post
status
Published
slug
sql/2
summary
这篇文章介绍了SQL中的三种常用命令:IN、EXISTS和JOIN。IN用于测试特定值是否与给定表达式或值集中的记录匹配,EXISTS用于检查子查询中的记录是否存在,JOIN用于将两个或多个表连接成一个表。文章还提供了这些命令的语法和示例,并对它们之间的区别进行了比较。
tags
SQL
category
译文
password

介绍

SEQUEL 被广泛称为 SQL,结构化查询语言是最流行的数据库标准语言。 我们可以使用 SQL 执行大量操作,包括创建数据库、以表的形式存储数据、修改、提取等等。 SQL有不同的版本,如MYSQL、PostgreSQL、Oracle、SQL lite等。SQL中有一些重要的命令,大致可以分为DDL、DML、DCL、TCL、DQL。
在本文中,我们将区分 SQL 中三种不同的最常用命令:
  • IN
  • EXISTS
  • JOIN

SQL子句

IN

它主要与 WHERE 子句一起使用,以测试给定表达式或它与一组值中的特定值匹配的记录。 它的工作方式类似于多重 OR 运算符。 IN 运算符的否定是 NOT IN,这有助于执行与值集不匹配的行。
下面是 IN 的语法:
SELECT col_name(s) FROM Table_name WHERE col_name IN(val1, val2, val3, …..); // 其中 col_name 是列的名称,val 是值集
例子:
notion image
要获取来自 Guwahati 和 Patna 地点的学生的详细信息:
notion image

EXISTS

主要用于嵌套查询(query inside a query)。 它用于检查子查询中提供的记录是否存在。 如果一条或多条记录匹配,则返回布尔值 TRUE,如果没有行匹配,则返回 FALSE。 同样,和 IN 运算符一样,这里我们也可以使用称为“NOT EXISTS”运算符的 EXISTS 的否定。
> EXISTS 适合于外表小而内表大的查询情况
句法:
SELECT col_name(s) FROM Table_Name WHERE EXISTS ( SELECT col_name(s) FROM Table_Name WHERE condition );
Where条件:如果使用两个或多个表,则条件还应包含具有共同属性的column_matching信息。
例子:
Purchase 表:
notion image
Customer 表:
notion image
查询从电子商务网站购买手机的客户的姓名和电子邮件地址的详细信息。
notion image

JOIN

查看 [什么是 SQL JOIN?不同类型的SQL JOIN](/2023/04/20/sql-20230420/)

SQL 中 JOIN、IN 和 EXISTS 对比

IN
EXISTS
JOINS
它的工作方式类似于多重 OR 运算符。 因此,它使我们免于在一次查询中多次写入 OR。
如果找到匹配,它返回 TRUE 值。
它用于将两个或多个表连接成一个表。
将扫描 IN 运算符内的所有值,然后做出决定。
如果我们为单个条件获得 TRUE 值,它将停止执行。
它将首先检查是否发生匹配,然后根据两个表中的匹配列连接两个表。
它返回 TRUE、FALSE 和 NULL 值。
它返回 TRUE 或 FALSE。
如果匹配不存在,它会在连接表中返回 NULL 条目。
它既可以用于嵌套查询,也可以用于我们在上面示例中看到的值。
它仅用于嵌套查询。
JOIN 也可以与嵌套查询一起使用。
IN 与子查询一起使用时效率较低,因为整个子查询将首先由关系数据库执行,然后根据指定的条件最终执行。 但是,对于更大的关系表,IN 可能比子查询中的 EXISTS 和 JOIN 工作得更快。
在使用 EXISTS 的情况下,我们知道它将根据用户指定的条件返回 TRUE 或 FALSE。 所以,对于一个小的表条目,子查询中的 EXISTS 比 IN 工作效率更高。
它类似于 EXISTS 运算符。 如果子查询表的数据相对较少,那么与 IN 相比,执行效率会更高。
关于查询性能感觉解释的不够详细,想深入了解可以看下面参考文章,后面在翻译相关文章。

📎 参考文章