2009-07-14 12 views
0

Est-ce que quelqu'un sait pourquoi une requête SQL SELECT ne renvoie aucune ligne lors de la sélection à partir d'une table vide, mais lorsque vous essayez de sélectionner l'AVG d'une colonne dans une table vide, elle renvoie < null>? La différence de comportement me semble étrange. J'utilise une base de données sqlite si cela fait une différence.sqlite SELECT AVG renvoie la valeur null

Voici les deux requêtes:

normal: Sélectionnez une FROM table1
Si table1 est vide Je reçois aucune ligne de retour

Avg Sélectionner: SELECT AVG (a) de table1
Si table1 est vide je récupère un < null> row.

Répondre

3

Je ne suis pas positif, mais pour déterminer la moyenne, vous devez diviser par le nombre de lignes. Si le nombre de lignes est nul, diviser par ce serait indéfini. Ainsi, le retour NULL. Juste une supposition.

1

Vous faites un agrégat. Puisque l'agrégat est défini pour les lignes 0-n (dans ce cas, 0 lignes renvoie null), vous obtiendrez toujours un résultat (exactement un dans ce cas). En d'autres termes, vous ne demandez pas les lignes de la table - vous demandez la moyenne d'une colonne dans la table et c'est ce que vous obtenez. Obtenir autre chose qu'une rangée dans ce cas serait plus bizarre.

Si vous aviez demandé des colonnes non agrégées, également, par exemple.

SELECT Salesperson, AVG(Sale) 
FROM Sales 
GROUP BY Salesperson 

alors je m'attendrais à ce que vous n'obteniez pas de lignes en arrière car il n'y aurait rien pour satisfaire les sélections non agrégées.

0

AVG est une fonction agrégée similaire à COUNT. Si vous faites:

SELECT COUNT (a) À partir de la table 1, vous obtiendrez une ligne zéro. C'est la même chose avec AVG, SUM, etc. Vous obtenez la ligne avec le résultat de la fonction d'agrégation.