mySql查询以查找其他表中不存在的记录

mySql查询以查找其他表中不存在的记录,mysql,Mysql,我有两个mySql表,分别是CARS和DRIVERS,属性为licenseNumber 作为外键 要找到没有车的司机的名字,需要什么样的查询 我在想: SELECT DISTINCT D.name FROM drivers D, cars C WHERE D.licenseNumber = C.licenseNumber AND D.licenseNumber NOT IN (SELECT licenseNumber FROM cars) 但这不会返回任何内容。 我觉得我有点想得太多

我有两个mySql表,分别是
CARS
DRIVERS
,属性为
licenseNumber

作为外键

要找到没有车的司机的名字,需要什么样的查询

我在想:

SELECT DISTINCT D.name
FROM drivers D, cars C
WHERE 
 D.licenseNumber = C.licenseNumber AND 
  D.licenseNumber NOT IN (SELECT licenseNumber FROM cars)
但这不会返回任何内容。
我觉得我有点想得太多了。

有什么帮助吗

任何行都不可能与该查询匹配(如果licenseNumber不在cars表中,cars.licenseNumber=drivers.licenseNumber如何匹配?)

使用左连接:

SELECT DISTINCT D.name
    FROM drivers D
    LEFT JOIN cars C ON D.licenseNumber = C.licenseNumber 
    WHERE C.SOMECOLUMNTHATCANNOTBENULL IS NULL
尽管你可能会这么做

SELECT DISTINCT D.name FROM drivers D WHERE D.licenseNumber is NULL
但这完全取决于您如何构建数据

[编辑:LEFT JOIN的工作原理如下:它从左侧提到的列(本例中为drivers)中获取所有行,并为每个行尝试匹配一辆车(使用启用后的条件)。如果未找到该车,则返回该司机的行,通常应来自car的列设置为NULL。(如果为单个驾驶员找到多辆车,则返回多行)。]


选择不同的D.name、c.id
从驾驶员D向左连接车辆C
在D.licenseNumber=C.licenseNumber上,其中C.id为NULL

我添加了汽车id,以便找到没有汽车的驾驶员(c.id为空)

当你意识到自己做错了什么时,你会自责的。:-)车牌号是汽车的主键,外键是驾驶员的外键?那么你的问题是不可能的。如果没有车意味着没有车的主钥匙,那么就不可能有外键。谢谢,这是最明显的解决方案。真不敢相信我竟然没想到!此查询必须为每个“驱动程序”执行单独的子查询。我知道MySQL可以做一些功能强大的优化,但我认为它们不会延伸到这么远。除了性能方面的缺点外,我还认为这个解决方案对于这样一个常见的SQL“问题”来说太奇特了。PS:如果你真的不喜欢联接,并且想用子查询解决这个问题,请看don Grossman的解决方案。@Jochem-很抱歉,如果你认为这个解决方案是奇特的,那么你需要多做!这是解决这个问题的标准方法。在SQL Server中,它比
外部联接
更有效。写作时,我在想‘如果我错了怎么办?’,但我还是决定写下我的想法,意识到如果我真的错了,可能会有人纠正我,我会从中吸取教训。好了,我们开始了,11分钟后:-D Tnx!
SELECT DISTINCT D.name FROM drivers D WHERE D.licenseNumber is NULL
SELECT D.name 
FROM drivers D
WHERE NOT EXISTS(SELECT * FROM cars c 
                 WHERE D.licenseNumber = C.licenseNumber)