Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment mysql définit DISTINCT() dans la documentation de référence

Par souci d'exhaustivité, je réponds moi-même et je crée un lien vers un autre question Il semble que ce comportement soit une conséquence directe de la norme SQL autorisant les espaces entre la fonction et les parenthèses.

Puisqu'il est (généralement) permis de dire FUNCTION_NAME (x) alors lorsque cette fonction est appliquée à un premier terme de select

SELECT FUNCTION_NAME (x)

alors l'analyseur va avoir du mal à établir s'il s'agit d'un contexte d'un nom de fonction ou d'un mot-clé de modification SELECT.

Ainsi, dans le cas ci-dessus, FUNCTION_NAME est en fait FUNCTION_NAME_OR_KEYWORD pour l'analyseur.

Mais cela va plus loin :puisque l'espace entre le nom de la fonction et la parenthèse EST autorisé, l'analyseur ne peut PAS faire la distinction entre

SELECT FUNCTION_NAME_OR_KEYWORD (x)

et

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(il doit tester les mots-clés pour voir s'ils sont des fonctions), et puisque (x) sera analysé en x, il s'ensuit que pour FUNCTION_NAME_OR_KEYWORD -> DISTINCT (et tous les autres mots-clés modifiant SELECT) il n'y a pas de différence entre

SELECT DISTINCT x, y, z, ...

et

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

CQFD, mais sans références matérielles (en supposant que standard ne se soucie pas des espaces entre les noms de fonctions et les parenthèses est, je crois, justifié, mais je n'ai pas pu suivre la grammaire BNF au point de pouvoir citer la règle exacte).

REMARQUE :mysql a un certain nombre de fonctions où il se soucie des espaces entre les fonctions et les parenthèses, mais je crois que ce sont des exceptions (d'où l'option du serveur pour l'ignorer)