EXISTS子查询可以理解为存在,但也不能死扣字眼,多用在where子句中用来删选满足条件的记录,只要子查询能找到就是True,EXISTS条件就成立,反之不成立;NOT EXISTS与之相反
有以下四张表:1
2
3
4Product (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就是【没有、从未】,其后跟随的子查询就是要解决的后半段问题【肯定部分】
1 | Select pID, name |
有上面代码可以看出not exists只是解释了需求中的【从未】,而子查询负责【在2012年10月卖出去的产品信息】
如果子查询结果集为空,就是没有售卖的信息,not exists【没有、不存在】满足,条件成立
- 查找学生,该生通过了其所属的系开设的 所有 课程,列出stu_name,dept_name
- 要用到的有student表(包含学生id,所属的系名,学生名),Course表(包含开课的系名,课程id等),takes表(包含学生id,课程id,成绩等)
1 | select name, dept_name |
我们知道except是求差集,所以可以有如下解释1
2
3
4
5where not exists (
该学生所属的系开设的所有课程C1
except
学生所有及格的课程C2
)
C1-C2为空,就是C1是C2的子集,not exists成立,满足条件
- not exists… except 有两种用法,要根据所求语义判断
比如说公司中若干部门,若干等级的职位
- 求所有职位都是B等级的部门
- ‘{部门所有职位} except {所有B等级的职位}’
- 求包含所有B等级职位的部门
- ‘{所有B等级的职位} except {部门所有职位}’
其实很简单,判断时画个图,就知道谁该包含谁了
如果还想不通,可以参考这篇分析更细致的文章:查询选修了全部课程的学生姓名