sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo mysql define DISTINCT() en la documentación de referencia?

En aras de la integridad, respondo el mío y lo vinculo a otro nombres-y-paréntesis">pregunta por mi cuenta. Parece que este comportamiento es una consecuencia directa del estándar SQL que permite espacios en blanco entre la función y el paréntesis.

Dado que (generalmente) se permite decir FUNCTION_NAME (x), cuando esta función se aplica a un primer término de select

SELECT FUNCTION_NAME (x)

entonces el analizador tendrá dificultades para establecer si este es un contexto de un nombre de función o una palabra clave de modificación SELECT.

Entonces, en el caso anterior, FUNCTION_NAME es en realidad FUNCTION_NAME_OR_KEYWORD para el analizador.

Pero va más allá:dado que el espacio entre el nombre de la función y el paréntesis ESTÁ permitido, el analizador en realidad NO puede distinguir entre

SELECT FUNCTION_NAME_OR_KEYWORD (x)

y

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(debe probar las palabras clave para ver si son funciones), y dado que (x) se analizará a x, se deduce que para FUNCTION_NAME_OR_KEYWORD -> DISTINCT (y todas las demás palabras clave de modificación SELECT) no hay diferencia entre

SELECT DISTINCT x, y, z, ...

y

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

QED, pero sin referencias duras (suponiendo que estándar no le importan los espacios en blanco entre los nombres de las funciones y los paréntesis, creo que está justificado, pero no pude seguir la gramática BNF hasta el punto de poder citar la regla exacta).

NOTA:mysql tiene cierta cantidad de funciones en las que se preocupa por los espacios en blanco entre las funciones y los paréntesis, pero creo que estas son excepciones (de ahí la opción del servidor para ignorarlo)