数据库操作: 查询选修了所有课程的学生
2015-06-10 15:48
302 查看
先给出sql 代码:
是吧,你肯定会想 == 卧槽这是什么鬼
因为sql 中没有全称量词,所以要把要求转换为 等价的 存在量词的表述形式
也就是转化成 双重否定的形式
not exists 将不满足的条件的提交,里面一个not exists 意思就是说,我先把每个学生选修的全部课程都找出来(a),然后再和所有的课程比较(b) ,两个比较,提交a,然后用b 比较a 如果有 b 里面有,而a 里面灭有not
exists 的,那我们就把这条数据提交,也就是返回 true 返回真的话,外面的 not exists 一作用就变成 false 了
所以如果学生有课程没有选的话,那么就是false 就不会输出
同理,如果a 中的每条记录和b 中都是一样的,那么就不会有 not exists 的问题了,因为都exists 啊! 所以是 false 然后外面的 not exists 一作用就变成 true 了,就会输出
小弟才疏学浅 == 错误之处烦请各位巨巨指正 ==
select sno, sname from students where not exists( select * from course where not exists( select * from sc where sno = students.sno and cno = course.cno ) )
是吧,你肯定会想 == 卧槽这是什么鬼
因为sql 中没有全称量词,所以要把要求转换为 等价的 存在量词的表述形式
也就是转化成 双重否定的形式
not exists 将不满足的条件的提交,里面一个not exists 意思就是说,我先把每个学生选修的全部课程都找出来(a),然后再和所有的课程比较(b) ,两个比较,提交a,然后用b 比较a 如果有 b 里面有,而a 里面灭有not
exists 的,那我们就把这条数据提交,也就是返回 true 返回真的话,外面的 not exists 一作用就变成 false 了
所以如果学生有课程没有选的话,那么就是false 就不会输出
同理,如果a 中的每条记录和b 中都是一样的,那么就不会有 not exists 的问题了,因为都exists 啊! 所以是 false 然后外面的 not exists 一作用就变成 true 了,就会输出
小弟才疏学浅 == 错误之处烦请各位巨巨指正 ==
相关文章推荐
- 数据库的连接字符串?
- memcached的基本命令(安装、卸载、启动、配置相关)
- MYSQL数据库学习六 索引的操作
- memcache基本讲解
- Oracle例外定义
- MISCONF Redis is configured to save RDB snapshots,but is currently not able to persist on disk
- mysql事务的理解
- RMAN 复制目标数据库的理论知识
- RMAN 同机复制数据库
- mybatis对mysql进行分页
- RMAN 异机 复制数据库
- memcached完全剖析
- sqlsever2012数据库转移到sqlserver2008
- 数据库,比如 100 用户同时来访,要采取什么技术解决?
- 不安装oracle,配置plsql
- Ubuntu Server下启动/停止/重启MySQL数据库的三种方式
- oracle表空间创建
- mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式
- ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
- Oracle 11g Data Guard 使用duplicate from active database 创建 standby database