Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL关键字IN与EXISTS使用

MySQL关键字IN与EXISTS的使用与区别详解

作者:Roc.Chang

in和exists是两种常用的条件查询关键字,两种常用于子查询,它们在某些情况下可以互换使用,但它们的工作方式和效率可能会有所不同,这篇文章主要给大家介绍了关于MySQL关键字IN与EXISTS的使用与区别的相关资料,需要的朋友可以参考下

1. IN & NOT IN

ININ用于判断某个字段的值是否存在于给定的值列表中,常用于简单的列表匹配。可以使用单个值,也可以使用一个由多个值组成的列表,也可以是一个子查询。以下是IN关键词的示例用法:

1.1 基本使用

SELECT * FROM table_name 
WHERE column_name IN (value1, value2, value3);

-- 示例
SELECT * FROM employees WHERE department_id IN (1, 2, 3);

这将返回table_name表中满足条件的行,其中列column_name的值在给定的值列表(value1, value2, value3)中。

SELECT * FROM table_name 
WHERE column_name IN (select column_name_b from table_name_b  WHERE condition );

-- 示例
SELECT * FROM employees WHERE department_id IN 
	(SELECT id FROM departments WHERE name = 'WorkDog');

其实与上面的用法是一样的,只是将给定的值列表换成了 table_name_b 表中的某个字段的值。先查出对应字段的所有值,然后再与前面表 table_name 的 column_name 字段进行值比较,返回table_name表中满足条件的行。

1.2 工作原理

在MySQL中,IN 语句用于检查某个值是否在指定的列表或子查询结果集中。IN 语句的工作原理包括处理静态值列表和子查询结果集。在不同的情况下,MySQL会采用不同的策略来执行 IN 语句。下面详细解释 IN 语句的工作原理。

1.2.1 静态值列表的 IN 语句

对于静态值列表,MySQL会将列表中的每个值与目标列的值进行比较。如果目标值在列表中,条件为真。

📓 假设有两个表 employees ,查询指定 department_id 的部门:

SELECT * 
FROM employees 
WHERE department_id IN (1, 2, 3);

👽 执行过程如下:

在这个过程中,MySQL对每一行执行简单的比较操作。这种情况下的 IN 语句等价于多个 OR 条件。

SELECT * 
FROM employees 
WHERE department_id = 1 
   OR department_id = 2 
   OR department_id = 3;

1.2.2 子查询的 IN 语句

当 IN 语句包含子查询时,MySQL必须先执行子查询并获取结果集,然后将主查询中的值与子查询结果集中的值进行比较。

📓 示例:

SELECT * 
FROM employees 
WHERE department_id IN (SELECT id FROM departments WHERE name = 'WorkDog');

👽 执行过程如下:

在这种情况下,子查询的执行方式会影响整体查询的性能。如果子查询结果集较大,MySQL可能会使用临时表来存储结果集,并使用索引来加快查找速度。

🌟 结果集缓存

当使用 IN 子查询时,MySQL会将子查询的结果集缓存到内存中以加快主查询的执行。对于非常大的结果集,这可能会导致内存占用过多。在这种情况下,可以考虑使用临时表或其他优化方法来降低内存使用。

1.3 相关优化

2. EXISTS & NOT EXISTS

EXISTSEXISTS用于判断是否存在满足子查询条件的结果,常用于复杂的条件检查。子查询可以是一个查询语句,返回一个结果集。

2.1 基本使用

以下是EXISTS关键词的示例用法, NOT EXISTS 同理:

SELECT column_name FROM table_name1 
WHERE EXISTS (
	SELECT column_name FROM table_name2 WHERE condition
);

-- 示例
SELECT * FROM employees e WHERE EXISTS 
	(SELECT 1 FROM departments d WHERE d.name = 'WorkDog' AND e.department_id = d.id);

这将返回table_name1表中满足EXISTS子查询条件的行,子查询是在table_name2表中的一个查询。如果子查询返回结果集,则认为条件满足。

2.2 工作原理

当 MySQL 处理一个包含 EXISTS 子查询的查询时,它会逐条扫描外表的每一行,并对每一行执行一次子查询。如果子查询返回至少一行结果,那么 EXISTS 条件就满足,主查询的那一行就会被包含在最终结果集中,否则只查询的那一行就会被舍弃。

📓 假设有两个表 employees 和 departments,希望找到所有在特定部门(例如 WorkDog)工作的员工:

SELECT * 
FROM employees e 
WHERE EXISTS (
    SELECT 1 
    FROM departments d 
    WHERE e.department_id = d.id 
      AND d.name = 'WorkDog'
);

👽执行过程如下:

2.3 相关优化

由于 EXISTS 子查询对于外表中的每一行都会执行一次,这意味着子查询的性能对于整个查询的性能至关重要。

3. 两者区别

(1) 用法:

(2) 功能:

(3) 子查询结果:

(4) 性能:

(5) 空值处理:

INEXISTS对待空值的方式不同。

在选择使用 IN 还是 EXISTS 关键字时,需要根据具体的查询需求和数据情况进行考虑。如果只是简单的匹配值是否在列表中,可以使用 IN。如果需要根据子查询的返回结果来决定外部查询的结果,或者需要处理大量数据,那么使用 EXISTS 可能更为适合。

总结

到此这篇关于MySQL关键字IN与EXISTS的使用与区别的文章就介绍到这了,更多相关MySQL关键字IN与EXISTS使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文