原来 sql 可以这么写!

283 天前
 HackerJax
# 统计 a > b 的行数


## ✅:
### select count(a > b) from t;


## ❌:
### select sum(if(a > b, 1, 0)) from t;
3048 次点击
所在节点    MySQL
16 条回复
AoEiuV020JP
283 天前
如果效率更高了的话我会怀疑数据库引擎的质量,
Masoud2023
283 天前
该写的 where 不写,敢这么写 SQL 我要是老板你第二天不用来了
fkdog
283 天前
@Masoud2023 都什么逻辑?
count 带条件的写法在有带 group by 的查询语句里不是很常见?
Masoud2023
283 天前
@fkdog #3 可读性不太好,非必要我绝对不会这么写
fkdog
283 天前
@Masoud2023 那说明你写的少呗. 平时业务不涉及到复杂统计需求.
silencil
283 天前
不是第一个可读性更好吗?
yinmin
283 天前
## ✅:
### select count(*) from t where a>b
wxf666
283 天前
怎么我感觉,你想写的是:select sum(a > b) from t ?
philchang1995
283 天前
又学到了一个新知识,哈哈
Saturn72
283 天前
你这么写 a 和 b 相等时怎么算 我测 a=b 也会计数啊
via
283 天前
抱歉上面的例子少了一个 group by

ps:我的 id 是 op subaccount
lemonteacode
282 天前
@yinmin
正解,因为 where 先执行而 select 后执行,where 可以预先过滤更多的数据,等等我怎么感觉没什么区别
lasuar
282 天前
1. 哪个睿智 boy 会用到第二种写法?莫非是楼主
2. 第一种写法算是一种奇技淫巧,不常见,可读性对比常规 where 写法差不多
lemonteacode
282 天前
@lasuar
第二种写法有第二种写法的好处,比如需要多种筛选条件,我做的消费统计规则比较复杂,很多地方都使用了第二种方法,不在 where 过滤数据是因为有重复的统计
lasuar
282 天前
@lemonteacode #14 贴个示例
troywinter
282 天前
不建议在 OLTP 里这么搞,除非你对这个 execution plan 有清晰的预估,知道会扫描多少行数,复杂度是怎样的,不然这就是给自己挖坑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/961585

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX