улучшить выбор не в - PullRequest
       1

улучшить выбор не в

4 голосов
/ 04 февраля 2012

Я надеюсь, что этот вопрос не был задан, я пытался найти похожие вопросы, но, вероятно, использовал неправильные ключевые слова. В любом случае, я сталкиваюсь с ситуацией, когда мне приходится искать клиентов, которые никогда не размещали заказ раньше, поэтому запрос выполняется так:

SELECT * FROM customers 
where customers_id NOT IN (SELECT customers_id FROM orders)

Я читал, что вкладывать SELECT s нехорошо, так что лучше?

Кроме того, я должен сделать select * или я должен указать поля, я также где-то читал, что лучше просто select *?

Спасибо всем заранее.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2012
SELECT * FROM customers 
LEFT JOIN orders ON customers.customers_id = orders.customers_id
WHERE orders.customers_id IS NULL
2 голосов
/ 04 февраля 2012

Простой вопрос: 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, поскольку рекурсивная оптимизация выбора теперь содержит информацию о c.customers_id.

Хотя лучше всего было бы присоединиться к @StilesCrisis, хотя я сомневаюсь, что это правильно. (Хотя я не выпил свою первую чашку кофе за день.)

КСТАТИ. EXISTS(SELECT * на самом деле не резервирует место для всех полей, и это нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...