首页 > 数据库 >图解 SQL 执行顺序,通俗易懂!

图解 SQL 执行顺序,通俗易懂!

时间:2024-04-15 09:11:07浏览次数:32  
标签:查询 通俗易懂 having 分组 SQL 筛选 图解 where id

 

 


这是一条标准的查询语句:

 

这是我们实际上SQL执行顺序:

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

 

数据的关联过程

数据库中的两张表

 

from&join&where

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

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

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

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

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

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

 

group by

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

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

 

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无法实现的。

当前数据分组情况

 

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

 

select

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

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

 

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

 

order by

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

 

limit

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

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

 


https://mp.weixin.qq.com/s/_T9aAdx_P6J99gNF_eikrQ

 

标签:查询,通俗易懂,having,分组,SQL,筛选,图解,where,id
From: https://www.cnblogs.com/softidea/p/18135126

相关文章

  • SQL Prompt 10安装与破解方法
    SQLPrompt10安装与破解方法Cooper写文章只是为了日常记录 4人赞同了该文章SQLPrompt10是一款SQLServer数据库开发工具,通过自动完成、代码补全等功能提高开发效率。但是,该软件需要付费购买,对于一些学生和个人开发者来说,价格较为昂贵。本文将......
  • .net core EF mysql 共享事务
     .netcoreEFmysql共享事务在.NETCore中使用EntityFramework(EF)Core与MySQL一起工作时,您可以使用System.Transactions的TransactionScope来创建一个可以跨多个数据库连接共享的事务。以下是一个简单的示例,展示了如何在.NETCore应用程序中使用EntityFramewo......
  • SQL SERVER锁(LOCK)知识及锁应用(转载)
    SQLSERVER锁(LOCK)知识及锁应用(转载)ChenSir°已于 2023-10-0915:10:48 修改阅读量2.1k收藏8点赞数1文章标签:数据库sqlserver于 2023-10-0915:07:09 首次发布  提示:这里所摘抄的关于锁的知识有的是不同sqlserver版本的,对应于特......
  • SQL-SQL通用语法、SQL分类、DDL、DML、DQL、DCL
    一、SQL通用语法1、SQL语句可以单行或多行书写,以分号结尾。2、SQL语句可以使用空格/缩进来增强语句的可读性3、MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写4、注释:单行注释:--注释内容或#注释内容(MySQL特有)多行注释:/*注释内容*/二、SQL分类分类全称说明......
  • 利用Sqlmap API接口联动Google Hacking批量SQL注入检测
    目录前言slghack自动化搜集URLSqlmapAPI脚本slghack_sqli前言挖掘SQL注入漏洞的一种方式就是通过GoogleHacking搜索那些可能存在SQL的URL,然后手工的探测注入点。但是现在的SQL注入漏洞的网站是比较少的了,所以这样一个一个手工测效率有一点低。sqlmap比较好的一点是可批量扫描......
  • 1个表A多个字段a,b,关联另一个表B的一个字段c,并取出B表的d字段,如何写sql
    方式有两种,第一种如下:A数据表中多个字段对应B数据表的ID,现在要把B表的其他字段一起查询出来一、数据表: 1、SPEED_DETECTION_ROAD一、数据表: 1、SPEED_DETECTION_ROAD 它的START_POINT_ID和END_POINT_ID字段对应下面表的ID,2、SECTION_INFO: 二、sql语句SELE......
  • MySQL概述以及MySQL的安装以及启动
    一、数据库的相关概念数据库Database,简称DB。按照一定的数据结构来组织、存储和管理数据的仓库。数据库管理系统DatabaseManagementSystem,一种操纵和管理数据库的大型软件,用于创建、使用和维护数据库,简称DBMS。  关系型数据库(RDBMS)概念:关系型数据库,是建立在关系模型......
  • 子查询 (SQL Server)
    Learn  SQL 使用英语阅读添加  子查询(SQLServer)项目2023/09/0412个参与者反馈 本文内容子查询基础知识子查询规则在子查询中限定列名多层嵌套显示另外3个适用于:SQLServerAzureSQL数据库AzureSQL托管实例AzureSynapseAnalytic......
  • mysql中文全文索引的记录
    在MySQL5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。从MySQL5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。创建示例--创建表格CREATETABLEarticles(idINTAUTO_INCREME......
  • Mysql - 什么是三大范式(通俗详解)
    Mysql-什么是三大范式(通俗详解)高月之风关于数据的一切我都喜欢。​关注他 218人赞同了该文章​展开目录 Hello~我是高月!我将会在这篇文章中用通俗易懂的话为你简单说明什么是Mysql的三大范式。如果喜欢这篇文章,请点赞、关注......