Что легче читать в подзапросах 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);
Вопрос всплыл в комментариях только сейчас. Я исследовал руководства самых популярных СУБД:
- 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 *
более интуитивно понятный?
3 ответа
Интуитивно понятный ...EXISTS (SELECT * ..
потому что тебе действительно все равно
- Единственное ключевое слово важности - EXISTS
- Выбор
...EXISTS (SELECT 1 ..
увековечивает общие мифы и суеверия вокруг EXISTS (например, комментарии к документам MySQL). - Стандарт ANSI гласит "не имеет значения"
- Более интересно понять, что EXISTS является полусоединением.
Я все еще использую EXISTS (SELECT * ...)
по историческим причинам (истерика?). Технически, разницы нет, конечно; оптимизатор / планировщик выбросит его и сократит до одного бита информации. Для читателя-человека *
выглядит более особенным, он будет выделяться как специальный символ, а не как значение или константа. Кроме того, я склонен уменьшать количество литералов и магических констант в моих программах (в конечном итоге должны остаться только 0 и 1).
В контексте EXISTS оптимизатор SQL знает, что не имеет значения, что он возвращает, если он что-то возвращает. Так что для вас это не имеет значения.
Для интуитивной части: я не думаю, *
будет прав.
Лучше спросить словами: "проверь, существует ли хотя бы малая часть", то есть 1
(или что-то другое).