mySql查询查找另一个表中不存在的记录

时间:2010-12-06 14:49:50

标签: mysql

我有两个CARSDRIVERS的mySql表,其属性为licenseNumber
作为外键。

查找没有车的司机姓名的查询是什么?

我在想:

SELECT DISTINCT D.name
FROM drivers D, cars C
WHERE 
 D.licenseNumber = C.licenseNumber AND 
  D.licenseNumber NOT IN (SELECT licenseNumber FROM cars)

但这不会返回任何东西 我有一种感觉,我正在过度思考它 有帮助吗?

4 个答案:

答案 0 :(得分:6)

SELECT D.name 
FROM drivers D
WHERE NOT EXISTS(SELECT * FROM cars c 
                 WHERE D.licenseNumber = C.licenseNumber)

答案 1 :(得分:3)

使用LEFT JOIN:

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的工作原理如下:它从左边提到的列中获取所有行 - 在这种情况下为驱动程序 - 并且每次尝试匹配汽车(使用ON后的条件)。如果没有找到汽车,则无论如何都会返回该驱动程序的行,通常应该来自汽车的列设置为NULL。 (如果为单个驱动程序找到多个汽车,则返回多行)。]

答案 2 :(得分:2)

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

SELECT DISTINCT name FROM drivers WHERE licenseNumber NOT IN (SELECT licenseNumber FROM cars)

答案 3 :(得分:0)

SELECT DISTINCT D.name, c.id
FROM drivers D LEFT JOIN cars C
ON D.licenseNumber = C.licenseNumber WHERE c.id IS NULL
我添加了汽车ID,所以我可以找到什么驾驶员没有汽车(c.id为空)