2016-05-25 5 views
0

У меня есть этот запрос:Почему я должен использовать функцию EXISTS() в MySQL?

SELECT * FROM mytable t1 
    WHERE t1.id = :id AND 
     EXISTS(SELECT 1 FROM t2 WHERE t2.post_id = :id) 

И когда я удалить что EXISTS() функции, до сих пор мой код работает:

SELECT * FROM mytable t1 
    WHERE t1.id = :id AND 
     (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1) 

Так почему я должен написать, что? В чем его преимущество?

+0

Exists возвращается на первом матче. Подзапрос извлекает все соответствующие записи. Пойдите, прочитайте руководство. – Pred

+0

@Pred Спасибо за подсказку. Но я отредактировал свой второй запрос. Так что теперь есть разные? –

+0

Соответствие требованиям ANSI SQL является одной из причин. – jarlh

ответ

2

Вкратце:

  • EXISTS возвращается, когда он находит первый результат вместо выборки всех соответствующих записей (так что является более эффективным, когда существует несколько записей mathing в из условий)
  • EXISTS является семантический корректным ,
  • Когда есть имя столбца вместо 1 во втором запросе, а столбец содержит NULL, FALSE, 0, и т.д., то MySQL будет неявно преобразовать его в FALSE, что приводит к ошибочному результату.
  • EXISTS на самом деле определяется стандартом ANSI, а вторая форма - нет. (Второй запрос может потерпеть неудачу в других СУБД)

В качестве дополнительного примечания, вы отлично с * тоже, когда вы используете EXISTS, так как он проверяет, есть ли соответствующая запись, а не значение.

0

Если подзапрос возвращает любые строки, подзапрос EXISTS имеет значение ИСТИНА, а НЕ ПОДХОДЕТСЯ в подзапрос: FALSE.

И когда вы используете ... (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1) вы либо вернуть 1 на успех или NULL на нет вещи, которые, как считают True или False соответственно.

Работа с Exists является более профессиональным, потому что:

Традиционно EXISTS подзапросов начинается с SELECT *, но он может начинаться с SELECT, 5 или ВЫБРАТЬ column1 или вообще ничего. MySQL игнорирует список SELECT в таком подзапросе, поэтому он не имеет значения.

Возврат True или False.

справка из MySQL Dev site

 Смежные вопросы

  • Нет связанных вопросов^_^