web-dev-qa-db-fra.com

Pourquoi ANSI SQL définit-il la somme (pas de lignes) comme null?

Le Norme ANSI SQL définit (Chapitre 6.5, Spécification de fonction définie) Le comportement suivant pour les fonctions d'agrégat sur les ensembles de résultats vides:

COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL

Retour NULL pour AVG, Min et Max est parfaitement logique, car la moyenne, le minimum et le maximum d'un ensemble vide n'est indéfini.

Le dernier, cependant, me dérange: mathématiquement, la somme d'un ensemble vide est bien définie: 0. Utilisation 0, l'élément neutre d'addition, car le boîtier de base rend tout cohérent:

SUM({})        = 0    = 0
SUM({5})       = 5    = 0 + 5
SUM({5, 3})    = 8    = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL

Définition de SUM({}) _ _ null fait fondamentalement "pas de lignes" un cas particulier qui ne correspond pas aux autres:

SUM({})     = NULL  = NULL
SUM({5})    = 5    != NULL + 5 (= NULL)
SUM({5, 3}) = 8    != NULL + 5 + 3 (= NULL)

Y a-t-il un avantage évident du choix qui a été fait (somme étant null) que j'ai manqué?

28
Heinzi

J'ai bien peur que la raison soit simplement que les règles ont été définies de manière ad hoc (comme de nombreuses autres "caractéristiques" du ISO STANDARD SQL) À une époque où les agrégations SQL et leur connexion avec les mathématiques étaient moins comprises qu'aujourd'hui (*).

Ce n'est que l'une des extrêmement nombreuses incohérences dans la langue SQL. Ils rendent la langue plus difficile à enseigner, plus difficile à apprendre, plus difficiles à comprendre, plus difficiles à utiliser, plus difficiles à ce que vous voulez, mais c'est comme ça. Les règles ne peuvent pas être changées "froides" et "comme ça", pour des raisons évidentes de la compatibilité en retard (si le comité ISO publie une version finale de la norme et que les fournisseurs ont ensuite mis en œuvre cette norme, ces vendeurs n'apprécient pas Ce si dans une version ultérieure, les règles sont modifiées de manière à ce que les implémentations existantes (conformes) de l'ancienne version de la norme "ne parviennent automatiquement à se conformer" La nouvelle version ...)

(*) Il est maintenant mieux compris que les agrégations sur un jeu vide se comportent plus systématiquement si elles renvoient systématiquement la valeur d'identité (= ce que vous appelez "l'élément neutre") de l'opérateur binaire sous-jacent. Cet opérateur binaire sous-jacent pour le nombre et la somme est addition et sa valeur d'identité est nulle. Pour Min and Max, cette valeur d'identité est la valeur la plus élevée et la plus basse du type à portée de main, respectivement, si les types concernés sont finis. Les cas comme la moyenne, les moyens harmeurs, les médianes, etc. sont extrêmement complexes et exotiques à cet égard, cependant.

20
Erwin Smout