SQL存在量词EXISTS的理解笔记

148 阅读1分钟

SQL存在量词EXISTS的理解笔记

假设:我要查询还没被借出去的书的书名

  • 表结构:

截屏2022-09-09 12.03.25.png

  • 表查询解析:通过把Book表的每一条记录在Borrow表找一下,看一下有没有存在这个,如果有就忽略了如果没有就在结果集中添加记录

  • 解题思路:

  1. 子表复合查询:

  1. 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)