博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL中NOT EXISTS...[EXCEPT]的妙用
阅读量:5308 次
发布时间:2019-06-14

本文共 1664 字,大约阅读时间需要 5 分钟。


title: ‘SQL中NOT EXISTS…[EXCEPT]的妙用’

date: 2018-11-13 16:15:30
tags: SQL
categories: 数据库、SQL
toc: true
这是基于github的个人博客:


EXISTS子查询可以理解为存在,但也不能死扣字眼,多用在where子句中用来删选满足条件的记录,只要子查询能找到就是True,EXISTS条件就成立,反之不成立;NOT EXISTS与之相反

NOT EXISTS用法

有以下四张表:

Product (pID, name, category, UnitType, sID, price )Order (oID, year, month, day, type, cID, shipType, status)OrderDetail (oID, oDetailNum, pID, unitPrice, quantity)Customer (cID, name, address, phone, creditLimit)
  • 利用not exists 的子查询思想解决如下查询
    • 查询从未在2012年10月卖出去的产品信息,
    • 具体包括: 商品ID,商品名

not exists就是【没有、从未】,其后跟随的子查询就是要解决的后半段问题【肯定部分】

Select pID, nameFrom productWhere not exists    (select *    From order join orderDetail        on order.oID = orderDetail.oID    Where year=2012 and month=10 and        product.pID = orderDetail.pID)

有上面代码可以看出not exists只是解释了需求中的【从未】,而子查询负责【在2012年10月卖出去的产品信息】

如果子查询结果集为空,就是没有售卖的信息,not exists【没有、不存在】满足,条件成立

NOT EXISTS… EXCEPT 用法

  • 查找学生,该生通过了其所属的系开设的 所有 课程,列出stu_name,dept_name
    • 要用到的有student表(包含学生id,所属的系名,学生名),Course表(包含开课的系名,课程id等),takes表(包含学生id,课程id,成绩等)
select name, dept_name  from student  where not exists (      select course_id      from course      where student.dept_name=course.dept_name      except      select course_id      from takes      where student.ID = takes.ID           and grade != 'F'  )

我们知道except是求差集,所以可以有如下解释

where not exists (      该学生所属的系开设的所有课程C1      except      学生所有及格的课程C2  )

C1-C2为空,就是C1是C2的子集,not exists成立,满足条件

  • not exists… except 有两种用法,要根据所求语义判断

比如说公司中若干部门,若干等级的职位

  • 求所有职位都是B等级的部门
    • {部门所有职位} except {所有B等级的职位}
  • 求包含所有B等级职位的部门
    • {所有B等级的职位} except {部门所有职位}

其实很简单,判断时画个图,就知道谁该包含谁了

如果还想不通,可以参考这篇分析更细致的文章:


这是基于github的个人博客:

欢迎前来搭讪

转载于:https://www.cnblogs.com/JosonLee/p/10053711.html

你可能感兴趣的文章
mysql忘记密码的解决办法
查看>>
全面分析Java的垃圾回收机制2
查看>>
[Code Festival 2017 qual A] C: Palindromic Matrix
查看>>
修改博客园css样式
查看>>
Python3 高阶函数
查看>>
初始面向对象
查看>>
docker一键安装
查看>>
leetcode Letter Combinations of a Phone Number
查看>>
Unity 5.4 测试版本新特性---因吹丝停
查看>>
7.5 文件操作
查看>>
DFS-hdu-2821-Pusher
查看>>
MyEclipse中将普通Java项目convert(转化)为Maven项目
查看>>
node js 安装.node-gyp/8.9.4 权限 无法访问
查看>>
windows基本命令
查看>>
VMware中CentOS设置静态IP
查看>>
[poj1006]Biorhythms
查看>>
jsp
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
Hover功能
查看>>
js千分位处理
查看>>