简单的查询优化

问题描述:

嘿家伙,请原谅我,如果这太简单的问题。我基本上想要一个数据库中男性和女性的数量。所以我知道两个简单的查询将做到这一点,如:简单的查询优化

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

然而,这似乎非常低效的,因为我知道,下面的查询都是相同的查询:

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

,是否存在最佳如何检索这些信息,而不必遍历数据库中的每一行两次?

+0

我发现你的问题有趣:-) – Aif 2010-10-29 14:44:07

您还可以使用GROUP BY:

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

这将导致这样的事情:

gender  genderCount 

Male   10 

Female  15 
+0

@安迪 - 谢谢;) – dotariel 2010-10-29 14:48:01

+0

非常感谢! – ntsue 2010-10-29 15:13:50

+0

不客气:) – dotariel 2010-10-29 15:45:33

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

在只有2个这样的可能值的情况下,作为“男性”和“女性”,案件陈述适用。但是,处理n个可能值时更灵活的方法是按包含值的列进行GROUP。这样,当添加新值时,不需要编辑查询。 – dotariel 2010-10-29 14:46:36

是的,请改用case语句。

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

您可以使用group by子句。

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

那个查询在那里也需要'性别',否则你只会得到无归属计数。 – 2010-10-29 14:44:07

+0

感谢您指出,我认为我已经是我的职位。看起来更改没有保存。我正在更新查询 – 2010-10-31 04:22:34

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

第一行是男性,第二行是女...

+0

您是否意识到这仍然是两个单独的查询? – StingyJack 2010-10-29 14:46:07

+0

你知道它和上面的COUNT CASE例子一样吗?它是一个单独的语句,在MySQL中的同一列中连接成两行.UNION是查询的一部分....但是不是在一行中返回两列,而是在一列中返回两行。 – FatherStorm 2010-10-29 14:56:38

那么,RedFilter和erwin atuli p可以*地给出你的问题的答案,但是如果你只关心性能,那么你应该在性别列上加一个索引,这些查询的性能应该没问题,所以你可以多次执行它们。

如果您使用的是oracle,那么应该使用位图索引来索引那种数据。

无论如何,许多数据库都缓存这样的聚合结果。

@redfilter: 如果表不包含任何条目您的查询将只返回NULL值,而不是0(为整数)