2010-10-29 4 views
1

Hé les gars, pardonnez-moi si c'est une question trop simple. Je veux essentiellement un compte du nombre de mâles et de femelles dans une base de données. Donc, je sais que deux requêtes simples cela, tels que:Optimisation simple requête

select count(*) from table where gender='male' 
select count(*) from table where gender='female' 

Cependant, cela semble très inefficace car je sais que les questions ci-dessous sont à la fois la même requête:

select count(*) from table where gender='female' 
select count(*) from table where gender<>'male' 

Est-il optimal façon de récupérer ces informations, sans avoir à parcourir chaque ligne dans la base de données deux fois?

+0

J'ai trouvé votre question :-) intéressante – Aif

Répondre

9

Vous pouvez également utiliser GROUP BY:

SELECT gender, Count(1) as genderCount 
FROM table 
GROUP BY gender 

Cela se traduira par quelque chose comme ceci:

gender  genderCount 

Male   10 

Female  15 
+0

@Andy - Merci;) – dotariel

+0

Merci beaucoup! – ntsue

+0

Vous êtes les bienvenus :) – dotariel

5
select sum(case when gender='male' then 1 end) as MaleCount, 
    sum(case when gender='female' then 1 end) as FemaleCount 
from table 
+0

Dans le cas de seulement deux valeurs possibles telles en tant que «homme» et «femme», l'énoncé du cas fonctionne. Cependant, une approche plus flexible pour traiter n valeurs possibles est de GROUP par la colonne contenant les valeurs. De cette façon, vous n'avez pas besoin de modifier votre requête lorsque de nouvelles valeurs sont ajoutées. – dotariel

1

Oui, utilisez plutôt une instruction case.

SELECT 
    COUNT(CASE gender WHEN 'male' then 1 END) AS Males 
    COUNT(CASE gender WHEN 'female' then 1 END) AS Females 
FROM table 
4

Vous pouvez utiliser une clause group by.

select gender, count(gender) from table group by gender; 
+1

Cette requête a également besoin de ', gender ', sinon vous obtiendrez des nombres non attribués. –

+0

merci de le signaler, je pensais déjà que je poste. On dirait que les changements n'ont pas été enregistrés. Je suis en train de mettre à jour la requête maintenant –

-3
(select count(*) from table where gender='male') 
UNION 
(select count(*) from table where gender='female') 

première rangée est celui des hommes, la deuxième rangée est femelles ...

+0

Vous réalisez que c'est toujours deux requêtes distinctes? – StingyJack

+0

Vous réalisez que c'est la même chose que l'exemple COUNT CASE ci-dessus? c'est une seule instruction qui est jointe en deux lignes dans la même colonne dans MySQL. L'UNION fait partie de la requête .... mais au lieu de retourner deux colonnes dans une rangée, je retourne deux lignes dans une colonne. – FatherStorm

0

Eh bien, RedFilter et erwin atuli p Robably donné la réponse à votre question, mais si vous êtes juste préoccupé par la performance, alors vous devriez mettre un index sur la colonne de genre et la performance de ces requêtes devrait être bien, de sorte que vous pouvez les exécuter plusieurs fois. Si vous utilisez Oracle, un index Bitmap doit être utilisé pour indexer ce type de données.

De nombreuses bases de données mettent en cache de tels résultats d'agrégation.

0

@redfilter: si la table ne contient aucune entrée de votre requête serait juste retourner NULL-valeurs et non 0 (comme nombre entier)