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 也都会各自生成新的虚拟表
相关推荐
stevewongbuaa21 分钟前
一些烦人的go设置 goland
开发语言·后端·golang
Icomi_41 分钟前
【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法
c语言·c++·人工智能·深度学习·神经网络·机器学习·计算机视觉
apocelipes43 分钟前
Linux glibc自带哈希表的用例及性能测试
c语言·c++·哈希表·linux编程
whisperrr.1 小时前
【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南
java·架构·tomcat
island13141 小时前
【QT】 控件 -- 显示类
开发语言·数据库·qt
Andya_net1 小时前
网络安全 | F5-Attack Signatures-Set详解
网络·数据库·web安全
Ronin-Lotus1 小时前
上位机知识篇---CMake
c语言·c++·笔记·学习·跨平台·编译·cmake
火烧屁屁啦2 小时前
【JavaEE进阶】应用分层
java·前端·java-ee
m0_748257462 小时前
鸿蒙NEXT(五):鸿蒙版React Native架构浅析
java
码农幻想梦2 小时前
实验二 数据库的附加/分离、导入/导出与备份/还原
数据库·oracle