Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como o mysql define DISTINCT() na documentação de referência


Por uma questão de integridade, estou respondendo ao meu e vinculando a outro pergunta de minha autoria. Parece que este comportamento é uma consequência direta do padrão SQL permitindo espaços em branco entre a função e parênteses.

Uma vez que é (geralmente) permitido dizer FUNCTION_NAME (x) então quando esta função é aplicada a um primeiro termo de select
SELECT FUNCTION_NAME (x)

então o analisador terá dificuldade em estabelecer se este é um contexto de um nome de função ou uma palavra-chave modificadora de SELECT.

Portanto, no caso acima, FUNCTION_NAME é, na verdade, FUNCTION_NAME_OR_KEYWORD para o analisador.

Mas vai além:como o espaço entre o nome da função e os parênteses é permitido, o analisador NÃO pode distinguir entre
SELECT FUNCTION_NAME_OR_KEYWORD (x)

e
SELECT FUNCTION_NAME_OR_KEYWORD(x)

(ele deve testar as palavras-chave para ver se elas são funções), e como (x) será analisado para x, segue que para FUNCTION_NAME_OR_KEYWORD -> DISTINCT (e todas as outras palavras-chave que modificam SELECT) não há diferença entre
SELECT DISTINCT x, y, z, ...

e
SELECT DISTINCT(x), y, z, ...

QED, mas sem referências concretas (supondo que padrão não se importa com espaços em branco entre nomes de funções e parênteses é, acredito, justificado, mas não consegui seguir a gramática BNF a ponto de poder citar a regra exata).

NOTA:o mysql tem um certo número de funções onde se preocupa com o espaço em branco entre funções e parênteses, mas acredito que sejam exceções (daí a opção do servidor para ignorá-lo)