使SQL查询更有效

gjb*_*gjb 3 mysql sql postgresql

如何使此SQL查询更有效?

SELECT 
  (SELECT COUNT(*) FROM table WHERE price < 10) AS priceUnder10,
  (SELECT COUNT(*) FROM table WHERE price BETWEEN 10 AND 20) AS price10to20,
  (SELECT COUNT(*) FROM table WHERE price > 20) AS priceOver20,
  (SELECT COUNT(*) FROM table WHERE colour = 'Red') AS colourRed,
  (SELECT COUNT(*) FROM table WHERE colour = 'Green') AS colourGreen,
  (SELECT COUNT(*) FROM table WHERE colour = 'Blue') AS colourBlue;
Run Code Online (Sandbox Code Playgroud)

我已经在pricecolour列上有索引,所以我正在寻找一种更好的方法来聚合数据.

我已经研究过使用GROUP BY,HAVING自连接和窗口函数,但无法弄清楚如何实现相同的结果.

任何建议非常感谢.

Mar*_*ith 8

SELECT 
       COUNT(CASE WHEN price < 10 THEN 1 END) AS priceUnder10,
       COUNT(CASE WHEN price BETWEEN 10 AND 20 THEN 1 END) AS price10to20,
       COUNT(CASE WHEN price> 20 THEN 1 END) AS priceOver20,
       COUNT(CASE WHEN colour = 'Red' THEN 1 END) AS colourRed,
       COUNT(CASE WHEN colour = 'Green' THEN 1 END) AS colourGreen,
       COUNT(CASE WHEN colour = 'Blue' THEN 1 END) AS colourBlue
from YourTable  
WHERE price IS NOT NULL OR  colour IN ('Red','Green','Blue' )
Run Code Online (Sandbox Code Playgroud)

  • @gjb - 它可能不是,但想象你有一个1,000,000行表,只有一行在''红色','绿色','蓝色'中具有非零价格或颜色.其他999,999行将没有区别结果但仍然没有它扫描.当然你可能知道你的数据没有这个分布(`price`甚至可能不可为空),它也可能被删除! (2认同)