4
votes

Grouper et avoir du mal à comprendre

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


2 commentaires

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.


3 Réponses :


2
votes

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.


0 commentaires

1
votes

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.


0 commentaires

2
votes

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.


0 commentaires