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 也都会各自生成新的虚拟表
相关推荐
木喃的井盖8 分钟前
无锁队列细节
c++·工程
TDengine (老段)20 分钟前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
皮皮林55122 分钟前
OpenFeign 首次调用卡 3 秒?八年老开发扒透 5 个坑,实战优化到 100ms!
后端
王老师青少年编程26 分钟前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:输出亲朋字符串
c++·字符串·csp·高频考点·信奥赛·专项训练·输出亲朋字符串
WBluuue1 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
callJJ1 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
S1998_1997111609•X1 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
KuaCpp2 小时前
C++面向对象(速过复习版)
开发语言·c++
千寻girling2 小时前
《 Git 详细教程 》
前端·后端·面试
wbs_scy2 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言