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 也都会各自生成新的虚拟表
相关推荐
oak隔壁找我1 分钟前
SpringBoot 将项目打包成 Fat JAR(肥包),核心原理
后端
瀚高PG实验室10 分钟前
审计策略修改
网络·数据库·瀚高数据库
言慢行善33 分钟前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅37 分钟前
emcc24ai
开发语言·数据库·python
专吃海绵宝宝菠萝屋的派大星39 分钟前
使用Dify对接自己开发的mcp
java·服务器·前端
有想法的py工程师1 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
大数据新鸟1 小时前
操作系统之虚拟内存
java·服务器·网络
Tong Z1 小时前
常见的限流算法和实现原理
java·开发语言
喵了几个咪1 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset