不幸的是,MySQL不遵守这个标准,并会造成混乱。总结来看,GROUP BY可以再次对表引用进行操作,将它们转换为新的形式。
SQL中的SELECT在关系代数中称为投影
我个人很喜欢“投影”这个术语,它用于关系代数中。在SQL中, 一旦生成表引用,就可以对其进行过滤,转换,将其投影成另一种形式。SELECT子句就像一个投影机。 表函数使用行值表达式将每个记录从先前构造的表引用转换为最终结果。
在SELECT子句中,最后可以对列执行操作,从而创建复杂的列表达式作为记录/行的一部分。关于表达式,函数等的性质,有很多特殊的规则。最重要的是,你应该记住这些:
1、你只能使用那些可以通过表引用得到的字段。
2、.如果有GROUP BY子句,则只能引用该子句的列或聚合函数。
3、没有GROUP BY子句时,可以使用窗口函数代替聚合函数。
4、如果没有GROUP BY子句,则不能将聚合函数与非聚合函数组合。
5、有关在聚合函数中封装常规函数的一些方法,反之亦然......
有很多复杂的规则,这里无法全部列举出来。而在不使用GROUP BY子句的SELECT语句的投影中,不能将聚合函数与非聚合函数组合的原因是:
1、直观地讲,没意义。
第一直觉就是没意义(尤其是对SQL初学者而言,几乎没有任何价值)。SQL:1999介绍了GROUPING SETS,而SQL:2003引入了空分组集:GROUP BY ()。无论何时存在聚合函数,并且没有显式的GROUP BY子句,都将应用隐式的空GROUPING SET(规则编号2)。虽说这件事让我很困惑,但确实如此。
SELECT子句可能是SQL中最复杂的子句之一,即使它看起来很简单。 其他语句的作用其实就是对表不同形式的引用 ,而SELECT子句完全转换了这些表引用,对这些表引用进行各类操作,并且过程还可逆。
为了理解SQL,在尝试解决SELECT之前,先了解一些基本情况是重要的。虽然SELECT是语法排序中的第一个子句,但不急着第一个掌握。
SQL DISTINCT,UNION,ORDER BY和OFFSET都很简单
在看完复杂的SELECT语句之后,我们可以再次回到简单的事情:
集合运算(DISTINCT和UNION)
排序运算(ORDER BY,OFFSET .. FETCH)
集合运算就是对“集合”进行操作,这实际上不是...表,好吧,差不多。在概念上,他们很容易理解。