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