MySQL技术求助:编写查询未被出租车辆的SQL语句(执行无结果)
解决未被出租车辆的SQL查询问题
首先,咱们来拆解你现有查询里的问题:
- 内连接的局限性:你用了
FROM cars as c, rentals as r这种隐式内连接,它只会返回同时存在于Cars和Rentals表中的记录——换句话说,只有被出租过的车辆才会被筛选出来,完全没被出租过的车辆根本不会出现在结果集里。 - NULL判断错误:SQL里判断字段是否为NULL不能用
=,必须用IS NULL,不过这在你的查询里不是核心问题,因为内连接已经把无租赁记录的车提前排除了。
下面给你两种靠谱的解决方案:
方法一:使用左连接(LEFT JOIN)
左连接会保留Cars表的所有记录,再匹配Rentals表中的对应记录,没有匹配到的租赁字段会显示为NULL,我们可以利用这一点筛选未被出租的车辆:
SELECT c.car_id, c.car_name, c.car_type FROM cars AS c LEFT JOIN rentals AS r ON c.car_id = r.car_id WHERE r.rental_id IS NULL -- 用r.car_id IS NULL也能达到同样效果 ORDER BY c.car_id;
方法二:使用NOT EXISTS子查询
这个方法逻辑更直观:找出所有在Cars表中,但从未出现在Rentals表的车辆:
SELECT c.car_id, c.car_name, c.car_type FROM cars AS c WHERE NOT EXISTS ( SELECT 1 FROM rentals AS r WHERE r.car_id = c.car_id ) ORDER BY c.car_id;
补充说明:如果你的需求是找当前未被出租的车辆(即有过租赁记录但当前没有在租状态),那需要Rentals表额外包含归还日期字段,但根据你给出的表结构,这里默认按「从未被出租过」的场景来解决啦。
内容的提问来源于stack exchange,提问作者Krun06
相关产品推荐
相关产品推荐

