7
votes

Count (*) en SQL

Je comprends comment compter (*) en SQL lors de l'adressage d'une table, mais comment fonctionne-t-il sur les jointures intérieures?

par exemple p>

SELECT branch, staffNo, Count(*)
FROM Staff s, Properties p 
WHERE s.staffNo = p.staffNo
GROUP BY s.staffNo, p.staffNo

sql

1 commentaires

Détail: Ce n'est pas une jointure extérieure. C'est une jointure (implicite) interne .


5 Réponses :


0
votes

Il compte le nombre de lignes pour chaque distinct staffno dans le produit cartésien.

En outre, vous devez regrouper par la branche , StaffNo .


0 commentaires

9
votes

C'est une fonction globale - en tant que telle qu'elle est gérée par votre groupe par clause - chaque ligne correspondra à un groupe unique (c.-à-d. Staffno) et compter (*) retournera le nombre d'enregistrements dans la jointure qui correspond à ce groupe. Donc, par exemple: P>

 SELECT grade, Count(*)
 FROM Staff s, Properties p 
 WHERE s.staffNo = p.staffNo
 GROUP BY grade


4 commentaires

bien me coupez-moi - je frappe Soumettre sans finir ma réponse


Ta :) Je suis arrivé à la fin!


Alors, comptez-t-il essentiellement de nombreux p.staffs = S.Staffs?


NON - Exécutez la requête suivante: Sélectionnez une branche, S.Staffno du personnel S, Propriétés p Où S.Staffno = P.Staffno. Cela montre les Resultats non concroissants. Vous pouvez avoir plusieurs rangées avec la même personnalisation. Ce sera parce que dans l'une des tables, il y a plusieurs rangées avec cette staffno. L'ajout du comte () et la clause de groupe ci-dessus réduira les Resultats des rangées regroupées par StaffNo. Lorsque plusieurs entrées existaient auparavant, cela sera maintenant reflété dans le résultat du comte ().



1
votes

compte (*) compte simplement le nombre de lignes dans la requête ou le groupe par .

Dans votre requête, il imprimera le nombre de lignes de StaffNo. (Il est redondant d'avoir S.Staffno, p.staffno; soit suffisant).


0 commentaires

3
votes

votre requête n'est pas valide.

Vous avez un nom de colonne ambigu StaffNo .

Vous sélectionnez Branche mais ne groupez pas par IT - Préparez-vous pour une erreur de syntaxe (tout sauf mySQL) ou des branches aléatoires à sélectionner pour vous (mySQL).

Je pense que ce que vous voulez savoir, c'est que cela retournera un compte pour chaque "jeu" de vos champs regroupés, afin que chaque combinaison de s.staffno, p.staffno Combien de lignes appartiennent à cet ensemble.


0 commentaires

4
votes

La fonction d'agrégat (que ce soit compte () , somme () , avg () , etc.) est calculé sur les lignes Dans chaque groupe: ce groupe est ensuite effondré / résumé / agrégé à une seule ligne selon la liste de sélection définie dans la requête.

Le modèle conceptuel pour l'exécution d'un SELECT La requête est:

  1. calculez le produit cartésien des références de toutes les tables dans la clause à partir de (comme si un Joindre complet était effectué.
  2. Appliquez les critères de jointure.
  3. Filtre selon les critères définis dans le clause.
  4. la partititition en groupes, basée sur les critères définis dans le groupe par Clause.
  5. Réduisez chaque groupe à une seule ligne, calculant les valeurs de chaque fonction d'agrégat sur les lignes de ce groupe.
  6. Filtre selon les critères définis dans le Clause
  7. Trier selon les critères définis dans la commande par clause

    Ce modèle conceptuel omettes traitant de tout Compute ou Compute ... par clauses.

    Ce n'est pas ce que ce n'est pas vraiment comment quelque chose qu'un moteur SQL très naïfe exécuterait une requête, mais les résultats doivent être identiques à ce que vous [éventuellement] obtenez si vous l'avez fait de cette façon.


0 commentaires