【问题标题】:Simple query optimization简单查询优化
【发布时间】:2010-10-29 14:37:05
【问题描述】:

大家好,如果这个问题太简单了,请原谅我。我基本上想要一个数据库中男性和女性的数量。所以我知道两个简单的查询可以完成这个,例如:

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'

是否有一种最佳方式来检索此信息,而不必遍历数据库中的每一行两次?

【问题讨论】:

  • 我发现你的问题很有趣 :-)

标签: sql database count query-optimization


【解决方案1】:

您也可以使用 GROUP BY:

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

这将导致如下结果:

gender       genderCount

Male         10

Female       15

【讨论】:

    【解决方案2】:
    select sum(case when gender='male' then 1 end) as MaleCount,
        sum(case when gender='female' then 1 end) as FemaleCount
    from table
    

    【讨论】:

    • 如果只有 2 个可能的值,例如“男性”和“女性”,case 语句有效。但是,在处理 n 个可能值时,一种更灵活的方法是按包含这些值的列进行 GROUP。这样,您无需在添加新值时编辑查询。
    【解决方案3】:

    您可以使用 group by 子句。

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

    【讨论】:

    • 那个查询也需要,gender,否则你只会得到未归属的计数。
    • 感谢您指出这一点,我以为我已经在发帖了。看起来更改没有保存。我现在正在更新查询
    【解决方案4】:

    是的,请改用 case 语句。

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

    【讨论】:

      【解决方案5】:

      嗯,RedFilter 和 erwin atuli 可能已经回答了你的问题,但是如果你只是关心性能,那么你应该在性别列上放一个索引,这些查询的性能应该没问题,所以你可以多次执行。

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:
          (select count(*) from table where gender='male')
          UNION
          (select count(*) from table where gender='female')
          

          第一排是男的,第二排是女的……

          【讨论】:

          • 您知道这仍然是两个独立的查询吗?
          • 您确实意识到它与上面的 COUNT CASE 示例相同?它是一条语句,在 MySQL 的同一列中连接成两行.. UNION 是查询的一部分.. 但不是在一行中返回两列,而是在一列中返回两行。
          猜你喜欢
          • 1970-01-01
          • 2014-07-06
          • 1970-01-01
          • 1970-01-01
          • 2016-04-13
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          相关资源
          最近更新 更多