暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL exists和in的区别



EXISTS
IN
的区别如下:

一、基本概念


EXISTS


EXISTS
 用于检查子查询是否返回至少一行数据。如果子查询返回了至少一行数据,那么 EXISTS
 表达式的值为 TRUE
;如果子查询没有返回任何行数据,那么 EXISTS
 表达式的值为 FALSE


IN


IN
 操作符用于将一个表达式的值与一个列表中的值进行比较。如果表达式的值与列表中的任何一个值相等,那么 IN
 表达式的值为 TRUE
;否则,IN
 表达式的值为 FALSE


二、执行原理


EXISTS


当使用 EXISTS
 时,数据库系统首先执行子查询。对于外部查询的每一行数据,都会执行一次子查询,以确定子查询是否返回行。如果对于某一行数据,子查询返回了行,那么外部查询的这一行数据就会被包含在结果集中;如果子查询没有返回行,那么外部查询的这一行数据就会被排除在结果集之外。


例如:

SELECT * FROM table1 t1
WHERE EXISTS (SELECT 1 FROM table2 t2 WHERE t2.id = t1.id);

在上述示例中,对于 table1
 中的每一行,都会执行子查询 SELECT 1 FROM table2 t2 WHERE t2.id = t1.id
 来判断是否存在匹配的行。


IN


使用 IN
 时,数据库系统首先计算子查询的结果,得到一个值列表。然后,对于外部查询的每一行数据,将该数据与这个值列表进行比较。如果该数据在值列表中,那么这一行数据就会被包含在结果集中;如果该数据不在值列表中,那么这一行数据就会被排除在结果集之外。


例如:

SELECT * FROM table1 t1
WHERE t1.id IN (SELECT id FROM table2);

在这个例子中,首先执行子查询 SELECT id FROM table2
 获取一个 id
 值列表,然后将 table1
 中 t1.id
 与这个列表进行比较。


三、性能差异


数据量


  • 当子查询的结果集较小,而外部查询的结果集较大时,IN
     的性能可能更好,因为它只需计算一次子查询的结果集。

  • 当子查询的结果集较大,而外部查询的结果集较小,或者外部查询的条件列没有合适的索引时,EXISTS
     的性能可能更好,因为它不需要将子查询的结果集全部存储在内存中进行比较。


索引


  • 如果子查询中相关的列有合适的索引,那么 IN
     和 EXISTS
     的性能可能会比较接近。

  • 如果外部查询的条件列有合适的索引,而子查询的列没有合适的索引,那么 EXISTS
     可能更优。


四、适用场景


EXISTS


  • 适用于子查询关联条件复杂,难以用简单的 IN
     列表来表示的情况。

  • 当需要根据外部查询的每一行数据动态地确定子查询的条件时,使用 EXISTS
     更加灵活。


IN


  • 当子查询的结果集是一个固定的、较小的集合时,使用 IN
     更加直观和易于理解。





以下是一些 EXISTS
 和 IN
 的实际案例,帮助您更好地理解它们的使用场景:



一、使用 EXISTS
 的案例


案例 1:查询有订单的客户信息

假设有两张表 customers
customer_id
customer_name
)和 orders
order_id
customer_id

SELECT * 
FROM customers c
WHERE EXISTS (
    SELECT 1 
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

案例 2:查询部门有员工的部门信息

设有 departments
 表(department_id
department_name
)和 employees
 表(employee_id
department_id

SELECT * 
FROM departments d
WHERE EXISTS (
    SELECT 1 
    FROM employees e
    WHERE e.department_id = d.department_id
);

二、使用 IN
 的案例


案例 1:查询属于特定城市的客户

假设 customers
 表(customer_id
customer_name
city
),特定城市列表为 ('New York', 'London', 'Tokyo')

SELECT * 
FROM customers
WHERE city IN ('New York', 'London', 'Tokyo');


案例 2:查询特定订单状态的订单


假设有 orders
 表(order_id
order_status
),特定订单状态列表为 ('Pending', 'Shipped', 'Delivered')

SELECT *

FROM orders
WHERE order_status IN ('Pending', 'Shipped', 'Delivered');





点 击 下 方  关注+星标  公众号



文章转载自SQL 数据库入门学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论