当前位置: 首页 > article >正文

数据库SQL——嵌套子查询(IN/NOT IN/SOME/ALL/EXIST/NOT EXIST)

        嵌套子查询是SQL中一种强大的查询方式,它允许将一个查询语句嵌套在另一个查询语句内部执行。或称为子查询嵌套查询,是指在一个查询语句中嵌套一个或多个查询语句。这些嵌套的查询语句成为外层查询(也称为主查询或父查询)的一部分,并将子查询(里层查询)的结果作为条件来进行主查询。

1、集合成员资格

(1).IN:用于测试某个值是否存在于子查询的结果集中。
SELECT *
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);

        在这个例子中,外层查询选择所有员工,但仅限于那些存在于内层子查询返回的结果集合中的员工。内层子查询选择所有位于位置ID为1700的部门ID。

      所以这个查询返回所有部门位置ID位于1700的员工

(2).NOT IN:与IN相反,用于测试某个值是否不在子查询的结果集中。
SELECT *
FROM employees
WHERE employee_id NOT IN (SELECT manager_id FROM departments);

       这段sql语句。外层查询选择所有员工。但仅限于那些不存在于内层子查询 中的员工。内层子查询选择所有部门经理。

        所以这个查询返回所有不是任何部门经理的员工

补充!

在SQL中SELECT DISTINCT 和 SELECT INTERSECT 是两种用于处理查询结果集中重复数据的不同方法。

SELECT DISTINCT: 用于从查询结果中删除重复的行,只返回唯一的行。它确保结果集中的每一行都是唯一的。 

  例如  假设你有一个名为 employees 的表,其中有一列 department 表示员工的部门。如果你想要查询所有不同的部门

SELECT DISTINCT department
FROM employees;

这将返回 employees 表中所有不同的部门名称,每个部门只出现一次。


SELECT INTERSECT 用于返回两个或多个查询结果集的交集,即同时出现在所有查询结果集中的行。它要求每个查询的结果集中的列数和列的数据类型必须匹配。

  例如  假设你有两个表 employees_dept1 和 employees_dept2,它们分别包含两个不同部门中的员工。如果你想要找出同时在这两个部门中的员工(假设它们有一个共同的列 employee_id

SELECT employee_id
FROM employees_dept1
INTERSECT
SELECT employee_id
FROM employees_dept2;

这将返回同时出现在 employees_dept1 和 employees_dept2 表中的 employee_id 值。

2、集合比较

        在SQL中,SOME 和 ALL 是与比较运算符(如大于号 >、小于号 <、大于等于号 >= 和小于等于号 <=结合使用的量词,用于在子查询的结果集上进行比较。尽管 SOME 在许多数据库系统中可以互换使用 ANY,但意义相同。

(1).使用 ALL 

        当你使用 ALL 时,你正在指定一个条件,该条件必须对于子查询返回的所有行都为真。换句话说,外层查询中的值必须与子查询结果集中的每一个值进行比较,并且必须满足指定的比较条件。

  例如  假设你有一个名为 employees 的表,其中包含 salary(工资)列。找出工资高于某个部门所有员工工资的员工:

SELECT *
FROM employees e1
WHERE e1.department_id = '部门A'
  AND e1.salary > ALL (SELECT e2.salary
                       FROM employees e2
                       WHERE e2.department_id = '部门B');

这将返回部门A中所有工资高于部门B中所有员工工资的员工。(即>最大)

(2).使用 SOME 或 ANY

        当你使用 SOME(或 ANY)时,你正在指定一个条件,该条件只需对于子查询返回的行中的至少一个为真即可。换句话说,外层查询中的值只需与子查询结果集中的某一个值进行比较,并且满足指定的比较条件。 

  例如  找出工资高于公司某些员工(但不是所有员工)工资的员工:

SELECT *
FROM employees e1
WHERE e1.salary > SOME (SELECT e2.salary
                        FROM employees e2
                        WHERE e2.department_id = '部门D');

这将返回所有工资高于部门D中至少一个员工工资的员工。即(>最小)

3.空关系测试

(1)EXISTS

用于测试子查询是否返回至少一行数据。如果子查询返回至少一行,则EXISTS条件为真。

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

这个查询返回所有属于位于位置ID为1700的部门的员工。

注意!这里的子查询可以使用SELECT 1SELECT *任何其他有效的选择列表因为EXISTS只关心是否返回行,而不关心返回的具体内容。 

(2)NOT EXISTS:

EXISTS相反,用于测试子查询是否不返回任何行。

SELECT *
FROM employees
WHERE NOT EXISTS (SELECT 1 FROM departments WHERE departments.department_id = employees.department_id AND departments.location_id = 1800);

这个查询返回所有不属于位于位置ID为1800的部门的员工。

补充! 

  1. 相关子查询

    • 定义:在嵌套查询中,如果子查询的查询条件依赖于外层查询(或父查询)中的某个值,则称为相关子查询。
    • 特点:
      • 内部查询可以引用外部查询的表或字段,并根据外部查询的结果动态地改变条件。
      • 内部查询的执行依赖于外部查询的结果,内部查询的结果随外部查询的结果而变化。
      • 可以多层嵌套,即在一个子查询中嵌套另一个子查询。
      • 需要重复求值以供外部查询使用,因此处理次数可能较多。
  2. 不相关子查询

    • 定义:在嵌套查询中,如果子查询的查询条件不依赖于外层查询(或父查询)中的某个值,则称为不相关子查询。
    • 特点:
      • 内部查询与外部查询相互独立,内部查询无法引用外部查询的表或字段。
      • 内部查询的执行与外部查询无关,内部查询的结果在执行过程中保持不变。
      • 通常只包含单层查询,不涉及多层嵌套。
      • 处理一次完成,执行后传递给外部查询作为固定条件或数据源。

执行流程

  1. 相关子查询

    • 执行流程:先执行外部查询,然后根据外部查询的结果为内部查询提供条件,最后执行内部查询。
    • 示例:假设有一个员工表(employee)和一个部门表(department),要查询每个部门中薪资最高的员工,可以使用相关子查询。
  2. 不相关子查询

    • 执行流程:先执行内部查询,然后将内部查询的结果作为条件传递给外部查询进行执行。
    • 示例:假设有一个学生表(student)和一个成绩表(score),要查询所有成绩高于平均分的学生,可以使用不相关子查询。


http://www.kler.cn/a/390466.html

相关文章:

  • python: postgreSQL using psycopg2 or psycopg
  • 移动端【01】面试系统的MVVM重构实践
  • Redis高可用-主从复制
  • LeetCode【0031】下一个排列
  • 后端接口返回二进制文件,前端 window.opent预览展示
  • 监控录音如何消除杂音?降低录音噪音的五个技巧
  • 见人就说“数字化转型”,但你真的理解“转型”转的到底是什么吗
  • 黑盒测试方法论—边界值
  • 网络编程示例之socket编程
  • 第十三天 概率论与统计学
  • shodan 【2】(泷羽sec)
  • iOS 18.2 重磅更新:6个大动作
  • uni-app之数据驱动的picker选择器( uni-data-picker)之可以选择到任意级别
  • Timer指定时间定时任务运行
  • ONLYOFFICE 8.2 版:助力自动化办公的佼佼者
  • 2024年11月7日Github流行趋势
  • sql server启用远程连接与修改默认端口
  • 【FastAdmin】在页面中使用layui,以此引申使用颜色选择器示例
  • WMS仓储管理系统三个重要的使用价值
  • 内网环境,基于k8s docer 自动发包
  • go语言中的错误处理详解
  • 电脑桌面水印是什么,在哪里设置?手把手教会你三个方法,给电脑屏幕添加水印!(亲测好用)
  • linux-c 使用c语言操作sqlite3数据库-1
  • 工程认证与Spring Boot:计算机课程管理的新探索
  • Javascript高级—深浅拷贝
  • Elasticsearch知识点汇总