系列文章目录
SQL函数除了单行函数外,其实SQL函数还有一类,叫做聚合(或者聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。聚合函数:**聚合函数作用于一组数据,并对一组数据返回一个值。**
文章目录
1 基本聚合函数
1.1 AVG和SUM函数
1.2 MIN和MAX函数
1.3 COUNT函数
2 GROUP BY
2.1 基本使用
2.2 使用多个列分组
2.3 GROUP BY中使用WITH ROLLUP
3 HAVING
3.1 基本使用
3.2 WHERE和HAVING的对比
4 SELECT的执行过程
4.1 查询的结构
4.2 SELECT执行顺序
你需要记住SELECT 查询时的两个顺序:
- 关键字的顺序是不能颠倒的:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
- SELECT 语句的执行顺序(在MySQL和Oracle中,SELECT 执行顺序基本相同)
FROM WHERE GROUP BY HAVING SELECT 的字段 DISTINCT ORDER BY LIMIT
在SELECT 语句执行这些步骤的时候,每个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤中作为输入。需要注意的是,这些步骤隐含在SQL的执行过程中,对于我们来说是不可见的。
4.3 SQL 的执行原理
SELECT 是先执行FROM这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
1.首先先通过CROSS JOIN 求笛卡尔积,相当于得到虚拟表vt 1-1;
2.通过ON进行筛选,在虚拟表vt 1-1 的基础上进行筛选,得到虚拟表vt 1-2;
3.添加外部行。如果我们使用的是左连接、右连接或者全连接,就会涉及到外部行,也就是在虚拟表vt 1-2的基础上增加外部行,得到虚拟表vt 1-3。
当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据。
。。。。中间少了?
然后进行第三步和第四步,也就是GROUP 和HAVING阶段。在这个阶段中,实际上是在虚拟表vt2的基础上进行分组和分组过滤,得到中间的虚拟表vt3 和vt4.
当我们完成条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到SELECT 和 DISTINCT 阶段。
首先在SELECT阶段会提取想要的字段,然后再DISTINCT阶段过滤掉重复的行,分别得到中间的虚拟表vt5-1和vt5-2
当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是ORDER BY 阶段,得到虚拟表vt6
最后在vt6的基础上,取出指定行的记录,也就是LIMIT阶段,得到最终的结果,对应的是虚拟表vt7。
当然我们在写SELECT 语句得时候,不一定存在所有的关键字,相应的阶段就会省略。
同时因为SQL是一门类似英语的结构化查询语言,所以我们在写SELECT 语句的时候,还要注意相应的关键字顺序,所谓的底层运行原理,就是我们刚才讲到的执行顺序。