为什么 mysql 要搞出 having where on 三个关键字?

2021-06-13 16:35:39 +08:00
 einQimiaozi
我感觉完全没必要啊,只保留一个 where 然后直接按照 sql 语句的书写顺序决定限制条件和临时数据表是否生成何时生成不就好了吗?为什么要设计三个关键字?
4982 次点击
所在节点    程序员
32 条回复
uselessVisitor
2021-06-13 21:30:58 +08:00
where 是对分组前进行过滤的,having 是分组后过滤的
@einQimiaozi #13
adoal
2021-06-13 22:42:36 +08:00
SQL 各种成分的书写位置是固定的,不可能根据一个条件子句的位置判断是用来做聚合前过滤还是聚合后过滤。
这张设计是为啥就不可考了,也许为了 parse 方便。不过 SQL 的语法确实槽点满满。也有人设计了语义贺和 SQL 一样但语法不一样的查询语言,但这样的改变并不是实质性的,一点点语法糖终究抵不过 SQL 的既成影响力。
akira
2021-06-13 23:44:48 +08:00
问就是历史原因
blockmin
2021-06-14 07:08:16 +08:00
举个不恰当的例子。就好比一个刚学乘法的人吐槽为什么会有乘法这个东西,多加几遍不就行了?不知道以后会遇到几千几万相乘。
楼主大概没见过一个 sql 语句有两三页 word 那么长的
shakoon
2021-06-14 07:17:50 +08:00
你觉得没有必要,是因为你还没有入门。等你多看看别人的代码,就能了解为什么会有这些关键字了。另外,这是标准 sql 语言的语法,不是 mysql 独有的,所有数据库都支持。
polyang
2021-06-14 10:50:38 +08:00
@blockmin 顶一个,说的有道理,这个例子举的不错。
有了 having,起码能方便我们理解 SQL 吧,看一个 SQL 可以直接找 having 关键字就可以了,去掉了 having,你还得捋一下 SQL 的顺序,虽然简单的 SQL 没什么,但如果是复杂的 SQL 呢?
paragon
2021-06-14 11:14:45 +08:00
模型是基于关系代数的~ 你说没用 那么请用数学方式证明~
Warder
2021-06-14 16:00:18 +08:00
这是 sql 的语法,又不是 mysql 独有的
aguesuka
2021-06-14 19:18:26 +08:00
因为 sql 是上个世 1970 年诞生的, 甚至早于罗素类型论的提出, 而 c 语言是 1972 年诞生的. 也许那个年代没有代码提示, 类型安全, 元编程的概念, 或者不重要. 反例是现代的 nosql 查询.
aguesuka
2021-06-14 19:37:44 +08:00
在 V2EX 问 pl 有关的问题, 最好带上 curd boy 不懂的词汇, 比如这个问题可以换成 "为什么 sql 没有 pipeline 查询" 或者 "sql 中的 functor". 也许没有价值的回复会少一点.
SmiteChow
2021-06-15 10:54:48 +08:00
#30 妙啊
zhangchongjie
2021-06-16 16:34:24 +08:00
这和 mysql 有啥关系? mysql 躺枪

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

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

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

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

© 2021 V2EX