Что легче читать в подзапросах EXISTS?

Это вопрос удобочитаемости. Нет никакой разницы в производительности.
Старые версии SQL Server были достаточно глупы, чтобы искать метаданные, но не более.

SELECT foo FROM bar WHERE EXISTS (SELECT * FROM baz WHERE baz.id = bar.id);
SELECT foo FROM bar WHERE EXISTS (SELECT 1 FROM baz WHERE baz.id = bar.id);

Я не рассматриваю NULL или "забавные варианты", которые не кажутся мне интуитивными.

SELECT foo FROM bar WHERE EXISTS (SELECT NULL FROM baz WHERE baz.id = bar.id); SELECT foo FROM bar WHERE EXISTS (SELECT 1/0 FROM baz WHERE baz.id = bar.id);удаp >

Вопрос появился в комментариях только сейчас. Я изучил руководства самых популярных СУБД:

  • MS SQL, похоже, поддерживает SELECT * в руководстве.
  • Пример в руководстве PostgreSQL 9.4 использует SELECT 1.
  • Oracle 11g имеет SELECT * в справочной системе .
  • MySQL 5.7 имеет SELECT * в справочном руководстве , а также SELECT 1 в комментариях.
  • SQLite не имеет примера в справочной системе .

Поиск по SO для code:"EXISTS (SELECT 1" дает 5 048 результатов.
Поиск по SO для code:"EXISTS (SELECT *" дает 5 154 результата.
Обновленные ссылки и подсчеты 07.2015.

Итак, SELECT * имеет популярное голосование и большие коммерческие СУБД на его стороне.
Я нахожу SELECT 1 более интуитивным. Это как сказать "если хотя бы один существует" .
Является ли SELECT * более интуитивным?

Ответ 1

Интуитивно понятный ...EXISTS (SELECT * .., потому что вам действительно все равно

  • Единственное ключевое слово важности - EXISTS
  • Выбор ...EXISTS (SELECT 1 .. увековечивает общие мифы и суеверия вокруг EXISTS (например, комментарии к документам MySQL).
  • Стандарт ANSI говорит, что "не имеет значения"
  • Более интересно понять, что EXISTS является полусоединением.

Ответ 2

Я все еще использую EXISTS (SELECT * ...), для исторических (gbn: должно быть, истерично?) причинам. Технически, конечно, нет никакой разницы; оптимизатор/планировщик выбросит его и уменьшит до одного бита информации. Для читателя-человека * выглядит более особенным, он выделяется как особый символ, а не как значение или константа. Кроме того, я стараюсь уменьшить количество литералов и магических констант в моих программах (в итоге, только 0 и 1 должны оставаться).

Ответ 3

В контексте EXISTS оптимизатор SQL знает, что не имеет значения, что он возвращает, пока он что-то возвращает. Так что вам не важно.

Для интуитивной части: я не думаю, что * будет правильным.

Лучше спросить словами: "проверьте, существует ли даже малейшая часть" - значит 1 (или что-то еще).