我希望没有问过这个问题,我试图搜索类似的问题,但可能使用了错误的关键字。无论如何,我遇到的情况是我必须搜索之前从未下过订单的客户,所以查询运行如下:
SELECT * FROM customers
where customers_id NOT IN (SELECT customers_id FROM orders)
我读到嵌套SELECT
是不好的,那么什么是更好的选择呢?
此外,我应该select *
还是应该指定字段,我还会在某处读到select *
更好?
提前谢谢大家。
答案 0 :(得分:5)
SELECT * FROM customers
LEFT JOIN orders ON customers.customers_id = orders.customers_id
WHERE orders.customers_id IS NULL
答案 1 :(得分:2)
简单的问题:SELECT *
比选择某些字段更昂贵,甚至可能非常显着。数据较少,如果索引中的所有字段都没有表访问权限。没有从数据库字段值编组到编程语言变量。
嵌套的子查询和关节有其权利。
SELECT * FROM customers where customers_id NOT IN (SELECT customers_id FROM orders)
可以改写为:
SELECT *
FROM customers c
WHERE NOT EXISTS(SELECT *
FROM orders o
WHERE o.customers_id = c.customers_id)
MySQL声明它可以更好地优化EXISTS,因为递归优化select现在有关于c.customers_id的信息。
虽然最好是@StilesCrisis的加入,但我有疑问它是正确的。 (虽然我当天没喝第一杯咖啡。)
顺便说一句。 EXISTS(SELECT *
并没有真正为所有字段保留空间,并且没关系。