我有一个典型的Persons表和Orders表定义,我可以按以下方式执行JOIN查询以返回所有人的订单.
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.id=Orders.Person_id
Run Code Online (Sandbox Code Playgroud)
问题是,我如何撰写一份声明,返回所有没有订单的人?
我正在使用mysql.
提前全部感谢.
Dan*_*llo 23
您可能想要使用LEFT JOIN
和IS NULL
:
SELECT Persons.LastName, Persons.FirstName
FROM Persons
LEFT JOIN Orders ON Persons.id = Orders.Person_id
WHERE Orders.Person_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
左连接的结果始终包含"左"表(人员)的所有记录,即使连接条件在"右"表(订单)中未找到任何匹配记录也是如此.当没有匹配时,"右"表的列将NULL
在结果集中.
Dav*_*vid 12
这应该有效......不止一种方法.
select * from persons where person.id not in (select person_id from orders)
Run Code Online (Sandbox Code Playgroud)
小智 6
为了完整起见,这里是not exists
版本:
select * from persons p
where not exists
(select null from orders o where o.person_id = p.id)
Run Code Online (Sandbox Code Playgroud)