Une autre question du didacticiel SQL: Champ > 0?
Question
Très bien, celui-ci (3a; exemple de problème avec la réponse fournie) m'a fait me gratter la tête :
bbc (nom, région, région, population, pib)
3a. Trouvez le plus grand pays de chaque région:
SELECT region, name, population
FROM bbc x
WHERE population >= ALL
(SELECT population
FROM bbc y
WHERE y.region = x.region
AND population > 0)
Je comprends le concept de ' WHERE y.region = x.region
' quand j'y pense en termes de moteur de base de données bouclant sur les entrées de table et faisant correspondre chaque x.region au courant y.region (dans le SELECT imbriqué) ... mais wtf fait ' AND population > 0
'faire? Ce n’est pas une bonne réponse sans cela, mais je ne vois pas comment…
La solution
Cette clause existe uniquement parce qu'il y a une entrée dans la table Europe (pour le Vatican) qui a NULL dans la colonne population. Les travaux suivants fonctionnent également et sont, à mon avis, plus compréhensibles:
SELECT region, name, population
FROM bbc x
WHERE population >= ALL
(SELECT population
FROM bbc y
WHERE y.region = x.region
AND population IS NOT NULL)
Dans la documentation MySQL pour TOUTES les sous-requêtes , il y a un commentaire utile (souligné le leur):
En général, les tables contenant les NULL valeurs et les tables vides sont des "cas extrêmes." Lors de la rédaction du code de sous-requête, vérifiez toujours si vous avez pris en compte ces deux possibilités.
Autres conseils
Je spécule ici.
Que se passe-t-il si la population est nulle pour tous les enregistrements d'une région spécifique?
EDIT: Il peut être considéré comme un filet de sécurité d'ignorer cinq valeurs dans la population (ce n'est pas un scénario réel).