Это вопрос удобочитаемости. Нет никакой разницы в производительности.
Старые версии 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 *
более интуитивным?