代码编织梦想

                                                 如果不进行去重可能会出现一个情况 

嵌套查询根据子查询的结果是否依赖于外层循环,分成相关子查询和不相关子查询

分类 

 IN

笔者总结:一般这种方法适用于查找有共性的元组,同一类事物比如查找和elsa选修相同科目的学生/选修相同科目的女同学。在后面我们也知道in先执行子查询,可以在优化的时候进行选择下推。

例题1

解法1 不相关子查询

查询结果是不是在那个嵌套的返回结果里面,比如说查询和elsa选修同一个系得学生,一个比较简单的方法是先确定elsa在哪个系,然后在这个查询的系中选人。 那么

select sdept 
from student 
where sname  = 'Elsa';//首先先查找Elas学生所在的系

                                                                 将sdept看成是一个集合

                         ​​​​​​​        ​​​​​​​         一定先执行子查询再执行父查询,先取子查询再了解父查询。

 解法2 相关子查询

select sno,sname from student as S 
where exists
(select * from student as t where t.sname  = 'Elsa' AND t.sdept = s.sdept);

 两种方法都可以达到预期的结果 第一种的时间开销主要在查询和选择上 第二中的时间开销在于那个exist函数,需要一个判断返回的操作。

例题2

在比较条件下使用子查询

一般情况下这种查询适用于寻找最高或者最低分

 上一次 出现是在聚集函数中出现 并且聚集函数不能出现在where子句里。

select * from student where sage > ALL(select sage from student where sdept = 'CS');

分组查询第一个属性必须是分组属性 你分的是啥 必须得让别人看到。 

 Exist存在性函数

查看执行结果是否为空

select * from student as S where exists
(select * from student as T 
where S.sname = 'Elsa' and S.SDEPT = T.SDEPT)

 利用exist函数实现任意的功能

关系代数实现

如果是关系代数的话可以用除法来实现:

SELECT Sno FROM Student WHERE NOT EXISTS (
SELECT * FROM SC AS SC1
WHERE SC1.Sno = 'CS-001' AND NOT EXISTS (
SELECT * FROM SC AS SC2
WHERE SC2.Sno = Student.Sno AND SC2.Cno = SC1.Cno));

 子查询结果作为派生的结果

 With语句

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_62260432/article/details/130901757

sql结构化查询语言_如烟如风的博客-爱代码爱编程_结构化查询语言

一、 什么是SQL SQL(structured query language),中文意思是结构化查询语言,它是一种对关系型数据库中的数据进行定义和操作的语言方法,是大多数关系型数据库管理系统所支持的语言。 二、SQL的分

SQL数据查询——嵌套查询-爱代码爱编程

嵌套查询 语法格式带有IN谓词的子查询IN谓词实现交运算IN谓词实现差运算带有比较运算符的子查询带有ANY谓词的子查询带有ALL谓词的子查询相关子查询引用子查询的值不引用子查询的值(EXISTS)基于派生表的查询 语法格式 SELECT 列名表达式 FROM 表名 WHERE 表达式 运算符 (SELECT 子查询) 其中运算符包含IN、关系