Je regardais une requête SQL que j'ai dans la base de données Access que je n'ai pas faite.
L'une des requêtes SQL ressemble à ceci:
column1 apple mango
Le but de cette requête est de trouver la valeur dans column1
qui apparaît plus d'une fois. Je peux vérifier que cette requête fonctionne correctement et renvoie la valeur de colonne qui apparaît plus d'une fois.
Je ne comprends cependant pas pourquoi cette requête fonctionne. Selon ce que je comprends, l'utilisation de group by
supprimera les champs en double. Par exemple, si la colonne 1 avait
column1 apple mango mango
Faire group by (column1)
entraînera
select column1 from table1 group by column1 having count(*)>1
À ce stade, si nous effectuons ayant count (*)> 1
ou ayant count (column1)> 1
, cela ne devrait renvoyer aucun résultat car group by a déjà supprimé le doublon champ. Mais clairement, je me trompe car l'instruction SQL ci-dessus donne le résultat exact.
Pourriez-vous s'il vous plaît me faire savoir le problème dans ma compréhension?
Modifier 1:
Outre la réponse acceptée, je cet article qui traite de l'ordre des opérations SQL m'a vraiment aidé à comprendre
3 Réponses :
group by
ne supprime pas seulement les valeurs en double - il renvoie une ligne par valeur distincte de la clause group by et vous permet d'appliquer une fonction d'agrégation pour une telle valeur unique.
Dans cette requête, vous interrogez en fait les valeurs de colonne1
et le résultat de count (*)
par valeur de colonne1 , puis, vous utilisez la clause ayant
pour renvoyer uniquement les valeurs de column1
qui ont un count (*)
supérieur à 1.
La clause GROUP BY regroupe la sélection par les champs que vous mentionnez, dans ce cas colonne1 mais peut être une colonne combinée (par exemple, colonne1, colonne2). Au fait, je pense que si vous exécutez:
SELECT column1, Count(*) AS [Count], MIN(column2) AS MinColumn2, MAX(column2) AS MaxColumn2 FROM table1 GROUP BY column1;
Cela vous aidera à comprendre comment fonctionne le GROUPING. Lorsque vous filtrez directement par n'importe quelle colonne, vous pouvez utiliser la condition WHERE, mais si vous voulez filtrer par n'importe quel champ calculé à partir du regroupement, vous devez utiliser la clause HAVING.
Vous ne comprenez pas comment fonctionne HAVING
. En fait, vous pouvez y penser en utilisant des sous-requêtes. Votre requête équivaut à:
select column1 from (select column1, count(*) as cnt from table1 group by column1 ) as t having cnt > 1;
Autrement dit, avoir
filtre une requête d'agrégation après l'agrégation a eu lieu. Cependant, les fonctions d'agrégation sont appliquées par groupe . Donc count (*)
compte le nombre de lignes dans chaque groupe. C'est pourquoi il identifie les doublons.
Avoir une clause fonctionne sur des groupes de lignes qui ont été formés à la suite du regroupement. Le résultat du regroupement était de 2 groupes, à savoir la pomme et la mangue. Sur chacun de ces groupes, nous exécutons la clause ayant. Le groupe Apple avait 1 rangée et la mangue en avait 2. C'est comme ça que ça marche
Le critère HAVING entraînera le retour de la seule ligne Mango car c'est le seul groupe AYANT un compte> 1.