gpt4 book ai didi

mysql - 嵌套 SQL 查询,每次嵌套实际发生了什么?

转载 作者:可可西里 更新时间:2023-11-01 07:30:55 24 4
gpt4 key购买 nike

我想知道这个查询是如何工作的:

SELECT empname FROM Employee WHERE not exists (
SELECT projid FROM Project WHERE not exists (
SELECT empid, projid FROM Assigned WHERE empid = Employee.empid and projid = Project.projid
)
)

它应该返回分配给每个项目的所有员工的姓名并且它确实有效但是我对它如何/为什么正确工作感到困惑。

架构是:

Employee(empID INT,empName VARCHAR(100),job VARCHAR(100),deptID INT,salary INT);
Assigned(empID INT,projID INT,role VARCHAR(100));
Project(projID INT,title VARCHAR(100),budget INT,funds INT);

我是 SQL 的新手,所以希望能提供详细/简单的解释。

最佳答案

当我需要尝试了解正在发生的事情时,我会寻找最内层的查询并向外查找。对于您的情况,让我们从:

SELECT empid, projid 
FROM Assigned
WHERE empid = Employee.empid and projid = Project.projid

这匹配分配表中的所有记录,其中 empid 和 projid 在前面的表中(因此是 Employee.empid 和 Project.projid)。

假设 Projects 表中有 5 个项目,并且为每个项目分配了 Employee1。这将返回 5 条记录。还假设将 Employee2 分配给其中的 1 个项目,从而返回 1 条记录。

接下来看:

SELECT projid FROM Project WHERE not exists (
...
)

现在这表示对于在先前查询中找到的那些记录(Employee1 有 5 个项目,Employee2 有 1 个项目),从 Project 表中选择在先前查询中没有任何匹配项(不存在)的任何 projid。换句话说,Employee1 不会从该查询中返回任何项目,而 Employee2 会返回 4 个项目。

最后看

 SELECT empname FROM Employee WHERE not exists (
...
)

与第二个查询一样,对于在前一个查询中找到的任何记录(没有记录将这些员工与所有项目相匹配,例如 Employee1 和一些记录,如果员工没有分配给每个项目,例如 Employee2),选择Employee 表中没有任何匹配项(同样,不存在)的任何雇员。换句话说,Employee1 会返回,因为上一个查询没有返回任何项目,而 Employee2 不会返回,因为上一个查询返回了 1 个或多个项目。

希望这对您有所帮助。以下是有关 EXISTS 的一些附加信息:

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

从那篇文章中:

What kind of store is present in all cities?

SELECT DISTINCT store_type FROM stores s1   WHERE NOT EXISTS (
SELECT * FROM cities WHERE NOT EXISTS (
SELECT * FROM cities_stores
WHERE cities_stores.city = cities.city AND cities_stores.store_type = stores.store_type));

The last example is a double-nested NOT EXISTS query. That is, it has a NOT EXISTS clause within a NOT EXISTS clause. Formally, it answers the question “does a city exist with a store that is not in Stores”? But it is easier to say that a nested NOT EXISTS answers the question “is x TRUE for all y?”

祝你好运。

关于mysql - 嵌套 SQL 查询,每次嵌套实际发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14639628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com