O que é mais fácil de ler em subconsultas EXISTS?

É uma questão de legibilidade . Não há diferença no desempenho.
Versões antigas do SQL Server eram tolas o suficiente para procurar metadados, mas não mais.

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); 

Eu não estou considerando NULL ou “variantes divertidas” que não parecem intuitivas para mim.

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);

A questão apareceu nos comentários agora. Eu pesquisei os manuais do RDBMS mais popular:

  • O MS SQL parece favorecer o SELECT * no manual .
  • O exemplo no manual do PostgreSQL 9.4 usa SELECT 1 .
  • O Oracle 11g possui SELECT * na referência da linguagem .
  • O MySQL 5.7 possui SELECT * no manual de referência, mas também SELECT 1 nos comentários.
  • O SQLite não tem nenhum exemplo na referência da linguagem .

Uma pesquisa em SO para o code:"EXISTS (SELECT 1" produz 5.048 resultados.
Uma pesquisa no code:"EXISTS (SELECT *" SO code:"EXISTS (SELECT *" produz 5.154 resultados.
Links atualizados e contagens 07.2015.

Então o SELECT * tem o voto popular e o grande RDBMS comercial do seu lado.
Eu acho o SELECT 1 mais intuitivo. É como dizer “se pelo menos um existe“.
O SELECT * mais intuitivo?

Intuitivo é ...EXISTS (SELECT * .. porque você realmente não se importa

  • A única palavra-chave de importância é EXISTE
  • A escolha de ...EXISTS (SELECT 1 .. perpetua os mitos e superstições gerais em torno de EXISTS (por exemplo, comentários sobre os documentos do MySQL).
  • Padrão ANSI diz “não importa”
  • É mais interessante entender que o EXISTS é uma semi-join.

Eu ainda uso EXISTS (SELECT * ...) , para razões históricas (gbn: deveria isso ser histérico?). Tecnicamente, não há diferença, claro; o otimizador / planejador irá jogá-lo fora e reduzi-lo a um bit de informação. Para o leitor humano o * parece mais especial, ele se destacará como um símbolo especial, e não como um valor ou constante. Além disso, tenho a tendência de reduzir a quantidade de literais e constantes mágicas em meus programas (eventualmente, apenas 0 e 1 devem permanecer).

No contexto do EXISTS, o otimizador SQL sabe que não importa o que retorna, desde que retorne algo. Então para você não importa.

Para a parte intuitiva: eu não acho que estará certo.

É melhor perguntar em palavras: “verifique se existe a menor parte” – significando 1 (ou outra coisa).