Mysql 这个问题是什么意思
这个问题是什么意思Mysql 这个问题是什么意思,mysql,not-exists,Mysql,Not Exists,这个问题是什么意思 select fname, lname from Owner where not exists (select fname, lname from Trainer) 我的理解是:它从表所有者返回fname和lname,而这些名称不存在于表中? 我说得对吗?查找所有者表中存在但不在培训师表中的人的姓名。查找所有者表中存在但不在培训师表中的人的姓名。从所有者表中获取培训师表中不存在的所有人的列表是一种非常蹩脚的方法 因此
select fname, lname
from Owner
where not exists
(select fname, lname
from Trainer)
我的理解是:它从表所有者返回fname和lname,而这些名称不存在于表中?
我说得对吗?查找所有者表中存在但不在培训师表中的人的姓名。查找所有者表中存在但不在培训师表中的人的姓名。从所有者表中获取培训师表中不存在的所有人的列表是一种非常蹩脚的方法 因此,如果所有者表包含
----------------
fname | lname
----------------
clark | kent
lois | lane
peter | parker
----------------
fname | lname
----------------
peter | parker
hal | jordan
培训师表包含
----------------
fname | lname
----------------
clark | kent
lois | lane
peter | parker
----------------
fname | lname
----------------
peter | parker
hal | jordan
您应该得到一个结果集:
----------------
fname | lname
----------------
clark | kent
lois | lane
更新
实际上,如果Trainer表中有任何记录,您的查询将不会返回任何内容。您可能应该使用:
select fname, lname
from Owners
where not exists (
select fname, lname
from trainers
where fname=Owners.fname
and lname=Owners.lname
)
从owner表中获取trainer表中不存在的所有人的列表是一种非常蹩脚的方法 因此,如果所有者表包含
----------------
fname | lname
----------------
clark | kent
lois | lane
peter | parker
----------------
fname | lname
----------------
peter | parker
hal | jordan
培训师表包含
----------------
fname | lname
----------------
clark | kent
lois | lane
peter | parker
----------------
fname | lname
----------------
peter | parker
hal | jordan
您应该得到一个结果集:
----------------
fname | lname
----------------
clark | kent
lois | lane
更新
实际上,如果Trainer表中有任何记录,您的查询将不会返回任何内容。您可能应该使用:
select fname, lname
from Owners
where not exists (
select fname, lname
from trainers
where fname=Owners.fname
and lname=Owners.lname
)
查询分为两部分:“选择”和“位置”。 首先查看where部分:
where not exists
(select fname, lname from Trainer)
如果Trainer表中没有任何内容,则where子句的计算结果为“true”,如果有内容,则为“false”。现在看一下“选择”部分:
select fname, lname from Owners
这将从“所有者”表中选择所有行
把这些放在一起:当且仅当Trainer表中没有任何行时,查询才会选择Owner表中的所有行,如果有,则绝对不会选择任何行。查询有两个部分:“选择”和“位置”。 首先查看where部分:
where not exists
(select fname, lname from Trainer)
如果Trainer表中没有任何内容,则where子句的计算结果为“true”,如果有内容,则为“false”。现在看一下“选择”部分:
select fname, lname from Owners
这将从“所有者”表中选择所有行
综合起来:当且仅当Trainer表中没有任何行时,查询才会选择Owner表中的所有行,如果有,则绝对不会选择任何行。这可能是有意的,但一位健忘的查询作者没有将子选择与顶级选择链接起来。如果Trainer为空,则查询返回Owner的所有行,否则不返回任何行。@9000:捕捉得很好。我不敢相信我错过了。但是当我运行查询时,没有显示任何结果,尽管两个表都是相同的different@Wizzy:正如@9000所指出的,只有当Trainer表中没有行时,编写的查询才会返回结果。从培训师返回中选择计数*是什么?如果返回的数字大于0,则问题中的查询将不返回任何结果。这可能是故意的,但健忘的查询作者没有将子选择链接到顶级选择。如果Trainer为空,则查询返回Owner的所有行,否则不返回任何行。@9000:捕捉得很好。我不敢相信我错过了。但是当我运行查询时,没有显示任何结果,尽管两个表都是相同的different@Wizzy:正如@9000所指出的,只有当Trainer表中没有行时,编写的查询才会返回结果。从培训师返回中选择计数*是什么?如果它返回一个大于0的数字,那么问题中的查询将不返回任何结果。它是跛脚的,因为它效率低下。最好是使用联接。但是当我运行查询时,虽然两个表都不同,但没有显示结果,是吗?我对MySQL不太清楚,但MSSQL和Oracle对此处理得很好,通常比连接更有效。@Wizzy,请参见顶部答案中的注释-它解释了特定查询被破坏的原因,但这并不意味着存在的查询通常无法正常工作。@Byron当然,但是这个问题很简单,我避免了混淆OP。它很蹩脚,因为它效率低下。最好是使用联接。但是当我运行查询时,虽然两个表都不同,但没有显示结果,是吗?我对MySQL不太清楚,但MSSQL和Oracle对此处理得很好,通常比连接更有效。@Wizzy,请参见顶部答案中的注释-它解释了特定查询被破坏的原因,但这并不意味着存在的查询通常无法正常工作。@Byron当然,但是这个问题非常简单,我避免了混淆OP。