SQL存在量词EXISTS的理解笔记
假设:我要查询还没被借出去的书的书名
- 表结构:
-
表查询解析:通过把Book表的每一条记录在Borrow表找一下,看一下有没有存在这个,如果有就忽略了,如果没有就在结果集中添加记录
-
解题思路:
- 子表复合查询:
略
- exists存在量词:
SELECT
Book.bookNo
FROM
Book
WHERE
NOT EXISTS(
SELECT * FROM Borrow WHERE Book.bookNo=Borrow.bookNo
)
解析:
首先如果直接执行:
SELECT Book.bookNo FROM Book得出的结果显然是所有图书
然后执行:
SELECT * FROM Borrow显然得出的是所有被借过的书的记录
现在我我们要检查每一本图书是否在被借阅表中出现过,所有用EXISTS,不过要加一个否定,因为我们要的是没有被借的,也就是如果书不存在借阅表中,那么就加入结果集,那么问题来了:
如何判断书是否在结果集中?
答:通过查询出来的书的属性作为参数在借阅表中找一下,存在就返回true,不存在就返回false
因此把SQL用中文翻译一下就是:
找 书名 把 Book所有中的所有记录取出来,然后一个个取出比较(遍历) 在 Borrow表中的bookNo列找一下有没有遍历的Book记录的某一记录的bookNo, 如果有就跳过 如果没有就把书名放到加入终结果中
Python伪代码:
result = [] # 结果集
for book in AllBook:
for item in Borrow:
if book.bookNo != item.bookNo:
# 这里的if条件就是对应 NOT EXISTS以及内部的WHERE条件
result.append(result)