简单的查询优化

时间:2010-10-29 14:37:05

标签: sql database count query-optimization

嘿,伙计们,如果这个问题太简单,请原谅我。我基本上想要计算数据库中男性和女性的数量。所以我知道有两个简单的查询可以实现这一点,例如:

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'

是否有最佳方法来检索此信息,而无需两次遍历数据库中的每一行?

7 个答案:

答案 0 :(得分:9)

你也可以使用GROUP BY:

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

这将导致类似这样的事情:

gender       genderCount

Male         10

Female       15

答案 1 :(得分:5)

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

答案 2 :(得分:4)

您可以使用group by子句。

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

答案 3 :(得分:1)

是的,请改用案例陈述。

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

答案 4 :(得分:0)

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

如果您使用的是oracle,则应使用位图索引来索引此类数据。

无论如何,许多数据库都会缓存此类聚合结果。

答案 5 :(得分:0)

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

答案 6 :(得分:-3)

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

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