一篇明白SQL的执行顺序

2023-10-26

这是一条标准的查询语句:
在这里插入图片描述
这是我们实际上SQL执行顺序:

  • 我们先执行from,join来确定表之间的连接关系,得到初步的数据
  • where对数据进行普通的初步的筛选
  • group by 分组
  • 各组分别执行having中的普通筛选或者聚合函数筛选。
  • 然后把再根据我们要的数据进行select,可以是普通字段查询也可以是获取聚合函数的查询结果,如果是集合函数,select的查询结果会新增一条字段
  • 将查询结果去重distinct
  • 最后合并各组的查询结果,按照order by的条件进行排序

在这里插入图片描述

数据的关联过程

数据库中的两张表
image-20200923101344122

from&join&where

用于确定我们要查询的表的范围,涉及哪些表。

选择一张表,然后用join连接

  • from table1 join table2 on table1.id=table2.id

选择多张表,用where做关联条件

  • from table1,table2 where table1.id=table2.id

我们会得到满足关联条件的两张表的数据,不加关联条件会出现笛卡尔积。

image-20200923101443089

group by

按照我们的分组条件,将数据进行分组,但是不会筛选数据。

比如我们按照即id的奇偶分组

image-20200923101722361

having&where

having中可以是普通条件的筛选,也能是聚合函数。而where只能是普通函数,一般情况下,有having可以不写where,把where的筛选放在having里,SQL语句看上去更丝滑。

使用where再group by

先把不满足where条件的数据删除,再去分组

使用group by再having

先分组再删除不满足having条件的数据,这两种方法有区别吗,几乎没有!

举个例子:
100/2=50,此时我们把100拆分(10+10+10+10+10…)/2=5+5+5+…+5=50,只要筛选条件没变,即便是分组了也得满足筛选条件,所以where后group by 和group by再having是不影响结果的!

不同的是,having语法支持聚合函数,其实having的意思就是针对每组的条件进行筛选。我们之前看到了普通的筛选条件是不影响的,但是having还支持聚合函数,这是where无法实现的。

当前数据分组情况

image-20200923101722361

执行having的筛选条件,可以使用聚合函数。筛选掉工资小于各组平均工资的having salary<avg(salary)

image-20200923102636800

select

分组结束之后,我们再执行select语句,因为聚合函数是依赖于分组的,聚合函数会单独新增一个查询出来的字段,这里用紫色表示,这里我们两个id重复了,我们就保留一个id,重复字段名需要指向来自哪张表,否则会出现唯一性问题。最后按照用户名去重。

select employee.id,distinct name,salary, avg(salary)

image-20200923110725030

将各组having之后的数据再合并数据。

order by

最后我们执行order by 将数据按照一定顺序排序,比如这里按照id排序。如果此时有limit那么查询到相应的我们需要的记录数时,就不继续往下查了。

image-20200923104001707

limit

记住limit是最后查询的,为什么呢?假如我们要查询年级最小的三个数据,如果在排序之前就截取到3个数据。实际上查询出来的不是最小的三个数据而是前三个数据了,记住这一点。

我们如果limit 0,3窃取前三个数据再排序,实际上最少工资的是2000,3000,4000。你这里只能是4000,5000,8000了。

image-20200923111015580

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇明白SQL的执行顺序 的相关文章

  • vue函数定义的多种写法

    vue定义方法 methods a e c alert aaa a e c alert aaa a function e c alert aaa 在JS中箭头函数根据是否书写大小括号可分为以下四种情况 不省略 const fun value
  • micropython-SPI通讯

    micropython SPI通讯 1 什么是SPI 2 SPI通讯原理 3 Micropython中的SPI 4 ZTMR测试SPI 1 ZTMR中SPI引脚 2 ZTMRSPI自测 2 SPI 2板之间通讯测试 1 什么是SPI SPI
  • 编码:KR字符串匹配,一个简单到领导都看得懂的算法

    常怀感恩 生活或许就不会处处深渊 这几天看了 柔性字符串匹配 觉得很有意思 书是好书 只是这个脑子是不是猪脑就不知道了 于是秉着知之为知之 不知为不知的精神 我准备再次去请教一下我的领导 在一个月黑风高的夜晚 我给领导发了个消息 领导这么回
  • QTableView的表格项中加入图标的方法

    当在使用表格视图的时候 需要在表格每一行前面加入图标 应该怎么做呢 Qt中通过使用MVC的处理方式 很容易做到这一点 具体实现如下 先贴出图 让大家一睹为快 下面我就来介绍一下 上图的灯泡是怎么实现的 通过重载QAbstractTableM
  • Go语言值不值得学,发展前景怎么样?

    我学习了java和golang java用了5年 无限感慨java的生态 工业级的语言 无数的解决方案 不管你是做互联网还是传统行业的开发用java开发总能解决一切很多的问题 国内巨头阿里巴巴更是把java推向了极致 golang作为一个新
  • d指针在Qt上的应用及实现

    Qt为了使其动态库最大程度上实现二进制兼容 引入了d指针的概念 那么为什么d指针能实现二进制兼容呢 为了回答这个问题 首先弄清楚什么是二进制兼容 所谓二进制兼容动态库 指的是一个在老版本库下运行的程序 在不经过编译的情况下 仍然能够在新的版
  • Linux 查看操作系统

    转载 linux查看操作系统版本信息 这个常用 放在这里备忘 转载上面的链接 一 linux下如何查看已安装的centos版本信息 1 Linux查看当前操作系统版本信息 cat proc version Linux version 2 6
  • java关于ArrayList,Vector,LinkedList,Set及其面试题+LeetCode136两种方式实现

    ArrayList ArrayList的遍历补充 将list转换为数组 使用toArray 方法将列表转换为数组 再对数组进行遍历 Test void test01 List
  • react时间戳转换成需要格式

    后端返回前端日期时间 一般给你的都是时间戳 然后前端展示需要转换成需要格式 以下是我开发中常遇到需要转换成的格式 看代码 class DateApi 将输入的毫秒字符串or毫秒数转换成指定的字符串格式 param string msStr
  • 大厂Code Review 流程

    提交cr的流程 检查代码风格 可以安装googlestyle或者Alibaba的一些stylecheck工具 也许各开发团队会有自己的风格规范 从mainline中同步代码 注意使用 git pull rebase 而不是 git pull
  • 新手如何学习网络安全?

    每天都有新闻报道描述着新技术对人们的生活和工作方式带来的巨大乃至压倒性影响 与此同时有关网络攻击和数据泄露的头条新闻也是日益频繁 攻击者可谓无处不在 企业外部充斥着黑客 有组织的犯罪团体以及民族国家网络间谍 他们的能力和蛮横程度正日渐增长
  • 如何判断是否适合学编程?

    能问出这个问题的人 肯定是心里有点想学习编程 但是又担心自己不适合学习编程 学不会反而浪费时间 那么 如何判断自己是否适合学习编程呢 可以从如下几个方面入手 1 明确自己为什么要学编程 因为不同的编程语言适用的领域不一样 比如我认识一个做互
  • JAVA之初识springMVC框架

    1 环境 操作系统 Mac OS 10 12 6 Tomcat v7 0 JDK 1 7 工具 eclipse 2 新建项目 用eclipse新建项目 选择Dynamic Web Project 将项目字符集改为UTF 8 3 编辑web
  • 【零知ESP8266教程】快速入门5-使用按键来控制你的灯

    上节课 我们已经学习了如何制作一个简易交通灯 那么如何去控制一个LED的亮或者灭呢 此次试验采用按键来控制我们的LED 实现LED的简单控制 一 工具原料 电脑 windows系统 ESP8266开发板 micro usb线 LED灯一个
  • 作为技术岗位面试官的一些分享

    我在过去的四年里参与了很多公司技术岗位的面试 说实话要看出一个人的综合素质 我还真的做不到 至于其他面试官是否可以 我也不得而知 但我个人感悟是 在面试过程中 面试官更加多的是去匹配和比较 在招聘过程中 企业会根据人力需求先制定出一套招聘需
  • Nginx日志常见时间变量解析

    request time 官方解释 request processing time in seconds with a milliseconds resolution time elapsed between the first bytes
  • java入门的第一个程序代码 hello world

    很多人说 学Java真的很难 其实 这是真的 但是高薪之所以为高薪 就是因为它比普通的活难的多 今天是我第一篇的博客 我还是想鼓励想学java技术的小伙伴一起来学 很多事只有去做了 你才能知道自己能不能成功 好了 接下来看Java入门的第一
  • 非常详尽的 Linux 中 WEB服务器配置与管理 (通过例子来讲解)

    Apache服务器的安装与启动 检查是否已经安装了APACHE并启动它 这是已安装好的状态 root root rpm qa grep httpd httpd tools 2 2 15 53 el6 x86 64 httpd 2 2 15
  • 一致性哈希算法,hash(key)是负值时,会出现异常吗?

    一致性哈希算法 hash key 是负值时 会出现异常吗 一致性哈希算法中 哈希函数hash key 的返回值通常是一个非负整数 如果hash key 返回负值 则可能会出现一些问题 例如无法正确地映射对象到哈希环上的位置 或者无法正确地找
  • C#有像Java ThreadLocal的类似实现吗?

    在C 中 可以使用 ThreadLocal

随机推荐

  • TS2559: Type ‘{ children: string; }‘ has no properties in common with type ‘IntrinsicAttributes & Fi

    Type children string key string is not assignable to type IntrinsicAttributes FilterTagPropsType Property children does
  • 锁与事务的关系

    在并发场景下 我们往往需要在事务方法中加锁来应对并发 如下 下面以 ReentrantLock 为例子 public final static ReentrantLock MY LOCK new ReentrantLock Transact
  • ubuntu安装ssh无法连接解决日志(已解决,可连接)

    原文链接http bbs chinaunix net thread 3585704 1 1 html 网上有很多介绍在Ubuntu下开启SSH服务的文章 但大多数介绍的方法测试后都不太理想 均不能实现远程登录到Ubuntu上 最后分析原因是
  • SpringBoot项目配置全局处理异常

    1 自定义异常 自定义异常 public class RRException extends RuntimeException private static final long serialVersionUID 1L private St
  • k8s学习

    主节点配置一定要好 K8S学习之路 1 介绍 1 1单机部署 1 2 虚拟化部署 类似window上安装多个linux虚拟机 在虚拟机中部署程序 使得程序之间不会互相影响 1 3 容器化部署 共享了操作系统 保证每个系统拥有自己的文件系统
  • MySQL-binlog2sql:非主从关系实现数据的【数据同步+数据恢复+数据追踪】

    文章目录 MySQL binlog2sql 非主从实时同步 恢复误删数据 1 引 1 介绍 2 功能 3 针对3种场景 4 脚本汇总说明 2 先决条件 1 安装 MySQL 2 修改 MySQL 配置 3 安装 binlog2sql 1 解
  • yii2 mysql设置时区

    第一步 修改配置文件 common config db php 注 8 00为北京时间 Asia Shanghai common config main php 第二步 修改vendor yiisoft yii2 db Connection
  • 抓取网站中的视频

    最近想从别人家的网站宣传片上提取一些素材 借鉴一下 之前也没有弄过 但是我的思路就是从网页的缓存中查找播放完后缓存的视频 然后失败了 然后又想到了网页打开源代码 然后查找到网页源代码饮用的视频的路径 然后找到视频 然后 再次失败 网上找了好
  • css基础———清除浮动的一些方法及区别

    为什么要清楚浮动 地址 http blog csdn net qwe502763576 article details 78811658 清除浮动方法概览 这里例举四种常见的清除浮动方式 方式一 使用overflow属性来清除浮动 ovh
  • 论文阅读

    简介 paper https arxiv org abs 1911 11907 github https github com huawei noah ghostnet Ghostnet CVPR2020 是华为提出的一种轻量级网络 结构类
  • WSL安装

    WSL安装教程 WSL简介 Windows Subsystem for Linux 简称WSL 是一个在Windows10上能够运行原生Linux二进制可执行文件 ELF格式 的兼容层 它是有微软与Canonical公司合作开发 其目标正是
  • 模糊查询与带参数跳转

    一 模糊查询 使用
  • 方法重写(override)原则

    方法的重写 override 两同两小一大原则 1 方法名相同 参数类型相同 2 子类返回类型小于等于父类方法返回类型 3 子类抛出异常小于等于父类方法抛出异常 4 子类访问权限大于等于父类方法访问权限
  • oracle RAC ORA-03113 错误解决

    好久 没有更新博客 太懒了 这咋换工作呢 1 错误现象 数据库 客户端连接不正常 频繁报 ORA 03113 错误 oracle 文档中对这个错误这样解释 ORA 03113 错误就是说连接到数据库的网络中断了 有些错误由于频繁出现 原因复
  • res_company_white_url.py 详解

    res company white url py 主要作用是 在数据库中建立一个表 存放白名单的URL 当我们读取文件时 先判断Referer是否在白名单中 如果不在则自动转到一个图片文件 防止盗链 接下来我们看一下主要代码 class C
  • unexpected keyword argument 'renderer'-DjangoUeditor

    今天在集成DjangoUeditor按照官方的Github集成之后 本以为就可以看到后台了没想到直接报错 render got an unexpected keyword argument renderer 报错93行 boundfield
  • 【QT】——06_带参数的信号(笔记)

    信号重载 说明 信号是可以重载的 相同的名字不同的参数 在发射信号的时候给值 emit musicSignal 100 音乐菜单 主窗口 h 创建一个带参的槽来处理信号 注意槽的参数要与信号一致 void dealMusic2 int QS
  • 《Hadoop学习笔记系列》二.Hadoop分布式文件系统 HDFS

    0 Hadoop分布式文件系统 HDFS HDFS以流式数据访问模式来存储超大文件 运行与商用硬件集群上 1 流式数据访问 HDFS的构建思路 一次写入 多次读取是最高效的访问模式 2 Block数据块 HDFS基本读写单位 类似于磁盘的页
  • STM32的ADC采样与多通道ADC采样

    一 单通道采样 参考资料 STM32库开发实战指南 刘火良 杨森著 原理性质的东西还是少讲 因为上面那本书里面讲解的很详细了 直接来看硬件电路图 这里使用的是3362电位器 10K 即用STM32来测量PB0和GND两端的电压 这样的电路设
  • 一篇明白SQL的执行顺序

    这是一条标准的查询语句 这是我们实际上SQL执行顺序 我们先执行from join来确定表之间的连接关系 得到初步的数据 where对数据进行普通的初步的筛选 group by 分组 各组分别执行having中的普通筛选或者聚合函数筛选 然