当前位置:   article > 正文

【数据库&sql】EXISTS、NOT EXISTS、IN、NOT IN的分析及示例_sql not exists

sql not exists

题目

获取至少提供S2提供的所有零件的供应商的编号,表sp如下所示。

 分析

EXISTS / IN:查询有结果则返回true,查询为空则返回false。

NOT EXISTS / NOT IN:查询有结果返回false,查询为空返回true。 

 EXISTS与IN不同处在于:a EXISTS b是指a中存在b,即a包含b;而a IN b是指a在b中,即b包含a。

Exists首先执行外层查询,再执行内层查询,而IN相反。

 

 EXISTS

EXISTS 用于检查子查询是否返回结果。如果子查询返回至少一个行,EXISTS 返回 TRUE;否则返回 FALSE

通常,EXISTS 用于筛选主查询中存在相关行的数据。它表示 "至少存在一个满足条件的行"。

EXISTS 常用于子查询,通常与主查询之间的关系有关,以检查是否满足特定条件。

 示例
  1. SELECT employee_name
  2. FROM employees
  3. WHERE EXISTS (
  4. SELECT 1
  5. FROM departments
  6. WHERE departments.department_id = employees.department_id
  7. );

在这个查询中,EXISTS 用于检查是否至少存在一个与员工的部门相关联的部门。

 

NOT EXISTS

NOT EXISTSEXISTS 相反,它用于检查子查询是否不返回结果。如果子查询不返回任何行,NOT EXISTS 返回 TRUE;否则返回 FALSE

NOT EXISTS 常用于筛选主查询中不存在相关行的数据。它表示 "不存在满足条件的行"。

通常,NOT EXISTS 用于查找主查询中没有匹配的行。

 示例
  1. SELECT customer_name
  2. FROM customers
  3. WHERE NOT EXISTS (
  4. SELECT 1
  5. FROM orders
  6. WHERE orders.customer_id = customers.customer_id
  7. );

在这个查询中,EXISTS 用于检查是否至少存在一个与员工的部门相关联的部门。

注意:在 EXISTS和NOT EXISTS 子查询中,SELECT 语句通常不返回具体的列值,而只关心是否存在满足条件的行,即判断true或false。

 

IN

IN 用于检查一个列的值是否在指定的值列表中。如果列的值与值列表中的任何一个值匹配,IN 返回 TRUE;否则返回 FALSE

IN 通常用于筛选主查询中具有特定属性的数据。它表示 "值匹配值列表中的任何一个"。

 示例
  1. SELECT product_name
  2. FROM products
  3. WHERE category_id IN (1, 2, 3);

在这个查询中,IN 用于查找那些属于指定类别的产品。

 

NOT IN

NOT ININ 相反,它用于检查一个列的值是否不在指定的值列表中。如果列的值与值列表中的任何一个值都不匹配,NOT IN 返回 TRUE;否则返回 FALSE

NOT IN 通常用于筛选主查询中不具有特定属性的数据。它表示 "值不匹配值列表中的任何一个"。

 示例
  1. SELECT user_name
  2. FROM users
  3. WHERE user_id NOT IN (5, 7, 9);

在这个查询中,NOT IN 用于查找那些用户不在指定的用户列表中的用户。

 

sql语句

  1. SELECT DISTINCT S.SNO AS 供应商编号
  2. FROM SP S
  3. WHERE NOT EXISTS (
  4. SELECT PNO
  5. FROM SP P
  6. WHERE P.SNO = 'S2' AND P.PNO NOT IN (
  7. SELECT PNO
  8. FROM SP Q
  9. WHERE Q.SNO = S.SNO
  10. ))
  11. AND S.SNO NOT IN('S2');

总体来讲,就是判断当前供应商所供应的零件集合是否包含s2所供应的零件的集合。接下来分段进行分析。

 

 此处相当于获取当前供应商所供应的零件集合,后面以T1表示。

 

此处相当于判断是否存在SNO的值为S2,且PNO不在集合T1中的数据,若有则返回true,否则返回false。

换而言之,就是在判断S2的零件集合是否完全被集合T1包含。

显然若集合T1包含S2的零件集合的话,集合T1的补集是不会和S2的零件集合有交集的,即会返回false。

 

然后经过第三行的NOT EXISTS后就成了true。(总感觉有种双重否定变肯定的感觉?)

 

这一行是为了在结果中排出S2,因为S2的零件集合一定是包含它本身的,因而会在结果中。

 

看一下结果吧~ 总算绕明白了(倒.jpg)

 

(by 归忆) 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/851858
推荐阅读
相关标签
  

闽ICP备14008679号