对SQL 子查询 NOT EXISTS 的一点理解

对SQL 子查询 NOT EXISTS 的一点理解

  首先,了解一下NOT EXISTS在子查询中的用法

SELECT--1号SELECT
FROM table 
WHERE NOT EXISTS (
SELECT--2号SELECT
FROM table
WHERE)

  要使1号SELECT查询中的WHERE为真,则需要2号SELECT查询结果为空。
  接下来看一个例子。

学生表

在这里插入图片描述

学生选课表

在这里插入图片描述

  • 以以下查询语句为例

要求:查询至少选修了学号为“g0940201”的学生所选修的所有课程的学生的学号和姓名。

SELECT S.学号, S.学生姓名			--1号SELECT
FROM [学生] S
WHERE NOT EXISTS (
	SELECT *						--2号SELECT
    FROM [学生选课] A
    WHERE A.学号='g0940201' 
    AND NOT EXISTS (
    	SELECT *					--3号SELECT
    	FROM [学生选课] B 
        WHERE S.学号 = B.学号 
        AND B.课程号 = A.课程号
    )
);

  在3号SELECT中,查询指定学生A每一个所选课B学生是否也选了,如果选了,3号SELECT有结果,2号SELECT中的WHERE值为假,2号SELECT无查询结果。如果所有课程检测完毕,2号SELECT一直无查询结果,那么1号SELECT中的WHERE值为真,对下一位同学进行检测。如果出现一门课学生A选了,学生B没选,此时3号SELECT无结果,2号SELECT中的WHERE值为真,2号SELECT有查询结果,1号SELECT中的WHERE值将一直为假,直到所有课程检测完毕,对下一位同学进行检测。

状态机

在这里插入图片描述
  输入队列为A同学所选所有课程,条件为B同学是否选择这门课程。如果以状态2结束,存入查询结果,检测下一位同学,如果以状态3结束,不存入查询结果,直接检测下一位同学。

猜你喜欢

转载自blog.csdn.net/weixin_43902773/article/details/109883564