Utiliser *
pour toutes vos requêtes que de compter tout, même pour les jointures, utilisez *
SELECT boss.boss_id, COUNT(subordinate.*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Mais ne pas utiliser COUNT(*)
pour la GAUCHE rejoint, qui va retourner 1, même si le subordonné de la table ne correspond pas à quelque chose de table parent
SELECT boss.boss_id, COUNT(*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Ne vous laissez pas berner par ceux de conseiller lors de l'utilisation d' *
dans le COMTE, elle récupère l'intégralité de la ligne à partir de votre table, en disant qu' *
est lente. L' *
sur SELECT COUNT(*)
et SELECT *
n'a aucun rapport les uns aux autres, ils sont tout à fait autre chose, ils ont juste partager un jeton, c'est à dire *
. En fait, si il n'est pas permis de nommer un champ de même que le nom de la table, SGBDR langue concepteur pourrait donner des COUNT(tableNameHere)
la même sémantique que l' COUNT(*)
. Exemple:
Pour compter les lignes, nous pourrions avoir ceci:
SELECT COUNT(emp) FROM emp
Et qu'ils pourraient le faire plus simple:
SELECT COUNT() FROM emp
Et pour la GAUCHE Rejoint, nous pourrions avoir ceci:
SELECT boss.boss_id, COUNT(subordinate)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Mais ils ne peuvent pas le faire (COUNT(tableNameHere)
) depuis la norme SQL permet de nommer un champ avec le même nom que son nom de la table:
CREATE TABLE fruit -- ORM-friendly name
(
fruit_id int NOT NULL,
fruit varchar(50), /* same name as table name,
and let's say, someone forgot to put NOT NULL */
shape varchar(50) NOT NULL,
color varchar(50) NOT NULL
)
Et aussi, il n'est pas une bonne pratique pour faire un champ nullable, disons que vous avez les valeurs de 'Banane', 'Pomme', NULL, 'Poires' sur les fruits de terrain. Ceci ne sera pas considéré tous les fruits, il ne cèdent 3, pas 4
SELECT count(fruit) FROM fruit
Bien que certains SGBDR faire ce genre de principe(pour compter les lignes du tableau, il accepte un nom de table comme le COMTE de paramètre), cela fonctionne dans Postgresql (si il n'y a pas d' subordinate
champ dans les deux tableaux ci-dessous, c'est à dire tant qu'il n'y a pas de conflit de nom entre le champ nom et le nom de la table):
SELECT boss.boss_id, COUNT(subordinate)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Mais qui pourrait causer de la confusion plus tard si nous allons ajouter un subordinate
champ dans la table, comme il compte le champ(ce qui pourrait être nullable), pas les lignes de la table.
Donc, pour être sur le côté sécuritaire, utilisez:
SELECT boss.boss_id, COUNT(subordinate.*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
[MODIFIER]
En particulier COUNT(1)
, c'est un one-trick pony, il ne fonctionne bien que sur une table de requête:
SELECT COUNT(1) FROM tbl
Mais lorsque vous utilisez des jointures, cette astuce ne fonctionne pas sur les multi-requêtes de table sans sa sémantique se confondre, et, en particulier, vous ne pouvez pas écrire:
-- count the subordinates that belongs to boss
SELECT boss.boss_id, COUNT(subordinate.1)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Alors, quel est le sens de COMPTAGE(1) ici?
SELECT boss.boss_id, COUNT(1)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
C'est ce que...?
-- counting all the subordinates only
SELECT boss.boss_id, COUNT(subordinate.boss_id)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Ou ce que...?
-- or is that COUNT(1) will also count 1 for boss regardless if boss has a subordinate
SELECT boss.boss_id, COUNT(*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Bien qu'il n'est pas difficile d'en déduire (même si certains pourraient être confondus) COUNT(1)
est le même que COUNT(*)
quel que soit le type de jointure. Mais pour la GAUCHE Rejoint conséquent, nous ne pouvons moule COUNT(1)
de travail: COUNT(subordinate.boss_id)
, COUNT(subordinate.*)
Utilisez donc de la façon suivante:
-- count the subordinates that belongs to boss
SELECT boss.boss_id, COUNT(subordinate.boss_id)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Fonctionne sur Postgresql, il est clair que vous voulez compter de la cardinalité de l'ensemble
-- count the subordinates that belongs to boss
SELECT boss.boss_id, COUNT(subordinate.*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Une autre façon de calculer la cardinalité de l'ensemble, très similaire à l'anglais (il suffit de ne pas faire une colonne avec un nom de même que le nom de la table) : http://www.sqlfiddle.com/#!1/98515/7
select boss.boss_name, count(subordinate)
from boss
left join subordinate on subordinate.boss_code = boss.boss_code
group by boss.boss_name
Vous ne pouvez pas faire ceci: http://www.sqlfiddle.com/#!1/98515/8
select boss.boss_name, count(subordinate.1)
from boss
left join subordinate on subordinate.boss_code = boss.boss_code
group by boss.boss_name
Vous pouvez le faire, mais cela produit des résultats incorrects: http://www.sqlfiddle.com/#!1/98515/9
select boss.boss_name, count(1)
from boss
left join subordinate on subordinate.boss_code = boss.boss_code
group by boss.boss_name
Bas De Ligne
Utiliser COUNT(field)
ou COUNT(*)
, et le bâton avec elle constamment, et si votre base de données permet de COUNT(tableHere)
ou COUNT(tableHere.*)
, utilisez-le. En bref, ne pas utiliser COUNT(1)
pour rien