基于mysql 的exists 嵌套查询的详解
来源:互联网 发布:淘宝好玩的稀奇小东西 编辑:程序博客网 时间:2024/06/01 07:36
select Sname from Student where not exists (select * from Course where not exists (select * from SC where Sno=Student.Sno and Cno=Course.Cno));
学习sql的时候碰到这货,有点难理解,问度娘找谷哥,终于明白...记录如下:
一、表的结构和数据如下:
Student:
Course:
SC:
二、SQL语句执行过程:
1、sql 结构分析
主查询:select Sname from Student;
嵌套 主查询:select * from Course...
嵌套 子查询:select * from SC where Sno=Student.Sno and Cno=Student.Cno;
关键字:not exists
2、执行过程:
注意:下表中以主键代表该条记录
步骤主查询 记录嵌套 主查询 记录嵌套 子查询嵌套主查询结果集主查询的结果记录12002151211无匹配记录结果集为空20021512122002151212无匹配记录20021512132002151213无匹配记录20021512142002151214无匹配记录20021512152002151215无匹配记录20021512162002151216无匹配记录20021512172002151217无匹配记录20021512182002151221有匹配记录结果集非空null9......... ...102002151227有匹配记录 null112002151231有匹配记录结果集非空null12...............132002151237有匹配记录结果集非空null142002151251有匹配记录结果集非空null15...............162002151257有匹配记录结果集非空null由上图可知该查询语句的返回结果是:
附文字说明:
首先,将主查询的记录和嵌套 主查询的记录查出
然后,取主查询中的第一条记录,依次遍历嵌套 主查询的记录,替换嵌套子查询中的查询条件为Sno=‘200215121’ and Cno=k,(k=1,2,3,4,5,6,7);
取主查询中的第二条记录,依次遍历嵌套查询中的记录,替换嵌套子查询中的查询条件为Sno='200215122' and Cno=k,(k=1,2,3,4,5,6,7);
最后,记录嵌套 主查询为空的主查询记录,将这些记录构成一个结果集即为此查询语句的结果集。
三、总结
1、作为where 查询条件时,exists(结果集为空返回false,否则返回true)
not exists(结果集为空返回true,否则返回false)
2、相关子查询,用主查询的相关属性去替换子查询中的条件从而匹配主结果集
3、题目情景出自某教科书
- 基于mysql 的exists 嵌套查询的详解
- 关于 Exists 的几种嵌套查询
- MySQL 的嵌套查询
- MySQL的嵌套查询
- MySQL的嵌套查询
- MySQL的嵌套查询
- 带有exists谓词的子查询 嵌套查询
- sql2000嵌套查询04--带有EXISTS谓词的子查询
- Mysql查询in和exists的效率
- MySQL带EXISTS关键字的子查询
- Mysql的嵌套查询方法
- mysql中有外键的嵌套查询
- SQL EXISTS 与 NOT EXISTS 的实现细节 和 嵌套查询
- MySQL 的复合查询或者嵌套查询
- mysql之exists子查询和in查询的对比
- 关于MySQL嵌套查询的问题
- mysql 删除嵌套查询的替代方式
- MySQL查询条件中exists和in的区别
- 递归删除指定目录下的指定类型文件和目录
- java下Class.forName的作用是什么,为什么要使用它
- 数据的网络传输学习笔记
- 大型数据库的设计原则与开发技巧
- windows7和linux fedora17 双系统 安装
- 基于mysql 的exists 嵌套查询的详解
- 数据库三大范式详解
- 在开发中你可能没有考虑到的两个性能优化
- Ubuntu12.10开机启动等待时间的修改方法
- Java解惑之try catch finally
- 淘宝网的技术发展史(一)——个人网站时代
- Tomcat 配置问题
- ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
- test1