嵌套查询(一)-谓词IN、量词ANY、量词ALL

2024-06-13 14:36
文章标签 查询 谓词 嵌套 量词

本文主要是介绍嵌套查询(一)-谓词IN、量词ANY、量词ALL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、在多个表之间进行数据查询,除了可以使用连接查询之外,也可以使用嵌套查询,那么什么是嵌套查询呢?如何使用嵌套查询呢?

1、将一个SELECT-FROM查询,嵌套在另一个SELECT查询语句中,那么这个SELECT-FROM查询就叫嵌套查询或者子查询,被嵌套的上层查询被称为父查询,在子查询中还可以继续嵌入子查询,构成多层嵌套查询,一个查询的结果可能是一个关系,即元组的集合,也可能是一个值,即聚集函数的结果,因此,子查询既可以嵌套在其父查询的SELECT子句的目标列表达式中参与计算,也可以嵌套在其父查询的FROM子句中作为进一步查询的对象,还可以嵌套在其父查询的WHERE子句或HAVING短语的条件表达式中,作为进一步查询的条件,不同的DBMS对嵌套查询的支持程度不同

2、下面介绍几种常用的嵌套查询的使用方式

二、谓词IN实现嵌套查询

IN谓词用于判断一个值是否属于一个集合,其运算结果是一个布尔值

E 【NOT IN (V1,V2,...,Vn)

1、将子查询放在IN谓词后面的小括号中,使用子查询查询出来的结果集,实际上还是一个表

2、独立子查询:子查询的结果不依赖于父查询

(1)举例:查询选修了“003”课程的学生姓名

select sN
from s
where sNo in (select sNo from sC where cNo='003')

该查询需求也可以使用连接查询满足,但是从DBMS对SQL语句的查询语句的处理方式来看,嵌套查询语句更有利于生成优化的查询执行方案。

(2)逻辑运算符NOT的使用,举例:查询没有选修“003”课程的学生姓名

select sN
from s
where sNo not in (select sNo from sC where cNo='003')

错误实例:不可以使用连接查询

select sN
from s,sC
where s.sNo=sC.sNo and sC.cNo!='003'

原因:嫦娥不仅选修了003的课程,还选修了其它的课程

三、比较操作符实现嵌套查询

当嵌套查询的结果是一个值是,该嵌套查询可以嵌套在WHERE子句的元组条件选择表达式中

1、举例1:查询选修“003”课程的成绩高于刘备的学生的学号和成绩

use XSXK;
select sNo,grade
from sC
where cNo='003' and grade>(select gradefrom sCwhere cNo='003' and sNo in(select sNofrom swhere sN='刘备')
)

这是一个多层嵌套查询,并且每一个子查询都是一个独立子查询

2、举例2:查询每个学生所修课程成绩超过其所有选课平均成绩的学号和课程号

use XSXK;
select sC1.sNo,sC1.cNo
from sC sC1
where grade>(
select avg(sC2.grade)
from sC sC2
where sC2.sNo=sC1.sNo
)

(1)这里的子查询结果与父查询的当前元组有关,这种查询被称为相关子查询

(2)在相关子查询中,如果涉及到了父查询所用到的表,往往要对这两个表至少一个进行重命名操作,以便标识不同的元组

四、使用量词ANYALL实现嵌套查询

1、在有些DBMS中,如果子查询的结果是一个集合,还可以使用ANY或ALL与比较符配合来实现嵌套查询

2、ANY(子查询)

ANY的语义为查询结果中的某个值,当子查询结果中有某一个值满足比较运算符,比较运算结果则为真

3、ALL(子查询)

ALL的语义为查询结果中的所有值,当子查询结果中的每一个值都满足比较运算符,比较运算结果才为真。

4、举例1:查询其它院系中比数计学院某个学生年龄小的学生

select *
from s
where sD!='数计学院' and  sB > any(
select sB
from s
where sD='数计学院'
)

5、举例2:查询其它院系中比数计学院学生年龄都小的学生

select *
from s
where sD!='数计学院' and  sB > all(
select sB
from s
where sD='数计学院'
)

6、量词ANY或ALL与比较运算符配合的功能也可以用谓词IN或用聚集函数与与比较符配合来实现

(1)当子查询的结果是一个集合而不是一个值时,比较运算符前的值肯定会不等于查询结果中的某个值,那么比较运算符不能于ANY结果永真,作为父查询的条件没有意义

(2)举例1:查询其它院系中比数计学院某个学生年龄小的学生

select *
from s
where sD!='数计学院' and  sB > (
select min(sB)
from s
where sD='数计学院'
)

(3)举例2:查询其它院系中比数计学院学生年龄都小的学生

select *
from s
where sD!='数计学院' and  sB > (
select max(sB)
from s
where sD='数计学院'
)

这篇关于嵌套查询(一)-谓词IN、量词ANY、量词ALL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057576

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实