MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析

前言

  • 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇+,涵盖入门、进阶、高级(一些原理分析);
  • 这一篇是内容较少,主要讲解:聚合函数和简要介绍sql语句执行过程
  • 虽然MYSQL命令很多,但是自己去多敲一点,到后面忘记了,查一下就可以回忆起来使用了;
  • 这一系列也是本人学习MYSQL做的笔记,也是为了方便后面忘记查询;
  • 参考资料:尚硅谷、黑马、csdn和知乎博客;
  • 欢迎收藏 + 关注,本人将会持续更新。

文章目录

课程使用数据文件: 后台私信获取。

聚合函数(统计函数)

SQL 允许对表中的数据进行计算,将一列数据作为一个整体,进行纵向计算。

函数名 作用
MAX(column) 返回某列的最低值(没有则返回NULL)
MIN(column) 返回某列的最高值(没有则返回NULL)
COUNT(column) 返回某列的行数(不包括 NULL 值)
COUNT(*) 返回被选列行数(包括NULL)
SUM(column) 求和
AVG(column) 求平均值

👁 注意:

  • 其中 COUNT 函数可用于任何数据类型 (因为它只是计数)
  • 而 SUM 、AVG 函数都只能对数值类型做计算
  • MAX 和 MIN 可用于数值、字符串或是日期时间数据类型。
  1. 统计该企业员工数量
mysql 复制代码
mysql> select count(ename) from emp;
+--------------+
| count(ename) |
+--------------+
|           15 |
+--------------+
1 row in set (0.02 sec)
  1. 统计该企业员工的平均工资
mysql 复制代码
mysql> select avg(sal) from emp;
+-----------+
| avg(sal)  |
+-----------+
| 1988.3333 |
+-----------+
1 row in set (0.00 sec)
  1. 查询该企业员工的最高工资
mysql 复制代码
mysql> select max(sal) from emp;
+----------+
| max(sal) |
+----------+
|     5000 |
+----------+
1 row in set (0.00 sec)
  1. 查询该企业员工的最低工资
mysql 复制代码
mysql> select min(sal) from emp;
+----------+
| min(sal) |
+----------+
|      800 |
+----------+
1 row in set (0.00 sec)
  1. 计算所有销售的工资之和
mysql 复制代码
mysql> select sum(sal) from emp where job='SALESMAN';
+----------+
| sum(sal) |
+----------+
|     5600 |
+----------+
1 row in set (0.00 sec)

MYSQL的运行顺序

MYSQL中常见的关键字段如下:

  • from:从哪些表中筛选;
  • on:关联多表查询时,去除笛卡尔积;
  • where:从表中筛选的条件;
  • group by:分组依据;
  • having:在统计结果中再次筛选;
  • order by:排序;
  • limit:分页。

这些在MYSQL中执行顺序是不一样的,从书写顺序来看

mysql 复制代码
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...

👀 注意: 这些顺序不能颠倒

MYSQL执行语句过程中,sql执行顺序是:

sql 复制代码
FROM ...,...-> ON -> (LEFT/RIGNT  JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT

具体sql执行原理:

  • SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
    • 首先笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
    • 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
    • 添加外部行,如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。

当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止,这个过程得到是我们的原始数据

  • 原始数据 得到后,在经过where进一步判断,得到新一张虚拟表;
  • 然后在经过group by、having,又得到新一张虚拟表;
  • 接着就是select、distinct,当然这个时候依然会生产虚拟表;
  • order by、limit 也都会各自生成新的虚拟表
相关推荐
mghio8 小时前
Dubbo 中的集群容错
java·微服务·dubbo
Asthenia04128 小时前
Spring AOP 和 Aware:在Bean实例化后-调用BeanPostProcessor开始工作!在初始化方法执行之前!
后端
Asthenia04129 小时前
什么是消除直接左递归 - 编译原理解析
后端
Asthenia04129 小时前
什么是自上而下分析 - 编译原理剖析
后端
Asthenia041210 小时前
什么是语法分析 - 编译原理基础
后端
Asthenia041210 小时前
理解词法分析与LEX:编译器的守门人
后端
uhakadotcom10 小时前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
Asthenia041211 小时前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz96511 小时前
ovs patch port 对比 veth pair
后端