Что легче читать в подзапросах 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);

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

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

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

3 ответа

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

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

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

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

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

Лучше спросить словами: "проверь, существует ли хотя бы малая часть", то есть 1 (или что-то другое).

Другие вопросы по тегам