mysql嵌套注意什么_mysql – 嵌套SQL查询,每个嵌套实际发生了什么?

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

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

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

假设Projects表中有5个项目,并且每个项目都分配了Employee1.这将返回5条记录.还假设Employee2被分配给其中一个项目,从而返回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将不返回,因为从上一个查询返回了一个或多个项目.

希望这可以帮助.以下是有关EXISTS的一些其他信息:

从那篇文章:

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,database

来源: https://codeday.me/bug/20190620/1245660.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值