【发布时间】:2011-05-26 19:05:19
【问题描述】:
这个查询是什么意思
select fname, lname
from Owner
where not exists
(select fname, lname
from Trainer)
我的理解是:它从表所有者返回 fname 和 lname,而这些名称在表训练器中不存在? 我说的对吗?
【问题讨论】:
标签: mysql not-exists
这个查询是什么意思
select fname, lname
from Owner
where not exists
(select fname, lname
from Trainer)
我的理解是:它从表所有者返回 fname 和 lname,而这些名称在表训练器中不存在? 我说的对吗?
【问题讨论】:
标签: mysql not-exists
查找存在于Owner 表中但不存在于Trainer 表中的人员的姓名。
【讨论】:
Trainer 为空,则查询返回来自Owner 的所有行,否则不返回任何行。
Trainer 表中没有行的情况下返回结果。 select count(*) from Trainer 返回什么?如果它返回一个 > 0 的数字,那么您问题中的查询不会返回任何结果。
从owner 表中获取trainer 表中不存在的每个人的列表是一种非常蹩脚的方法。
所以,如果Owner 表包含
----------------
fname | lname
----------------
clark | kent
lois | lane
peter | parker
并且 Trainer 表包含
----------------
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
)
【讨论】:
EXISTS 通常不能按预期工作)。
查询有两个部分:“选择”和“位置”。 先看where部分:
where not exists
(select fname, lname from Trainer)
如果 Trainer 表中没有任何内容,则此 where 子句的计算结果为“真”,如果有任何内容,则计算结果为“假”。现在看看“选择”部分:
select fname, lname from Owners
这会从“所有者”表中选择所有行。
将这些放在一起:如果(且仅当)Trainer 表中没有任何内容,则查询从 Owner 表中选择所有行 - 如果有,则绝对没有。
【讨论】: