当前位置: 首页 > news >正文

第16章 SELECT 底层执行原理

一、SELECT查询的完整结构

1.1 方式一(SQL 92语法)

SELECT ..., ..., ...
FROM ..., ..., ...
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ..., ...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ..., ...

1.2 方式二(SQL 99语法)

SELECT ..., ..., ...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ..., ...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ..., ...

1.3 关键字解释

  • from:从哪些表中筛选
  • on:关联多表查询时,去除笛卡尔积
  • where:从表中筛选的条件
  • group by:分组依据
  • having:在统计结果中再次筛选
  • order by:排序
  • limit:分页

二、SELECT 执行顺序

你需要记住SELECT查询时的两个顺序:

2.1 关键字的顺序是不能颠倒的

SELECT ... 
FROM ... 
WHERE ... 
GROUP BY ... 
HAVING ... 
ORDER BY ... 
LIMIT...

2.2 SELECT 语句的执行顺序

在MySQL和Oracle中,SELECT执行顺序基本相同

FROM ..., [(LEFT/RIGHT) JOIN ..., ON ...]

WHERE

GROUP BY

HAVING

SELECT

DISTINCT #去重操作

ORDER BY ..., ..., (ASC/DESC)

LIMIT ..., ...

2.3 SQL 的执行原理

        SELECT 结构中是先执行 FROM 这一步的,称为“FROM阶段”。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:

1. 首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;

2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;

3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。

        当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据

        当我们拿到了查询数据表的原始数据,也就是最终的虚拟表 vt1 ,就可以在此基础上再进行 WHERE 阶段 。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2

        然后进入第三步和第四步,也就是 GROUP HAVING 阶段 。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3vt4

        当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECTDISTINCT 阶段 。首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 vt5-2

        当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段 ,得到虚拟表 vt6

        最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段 ,得到最终的结果,对应的是虚拟表 vt7

        当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。

        同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序

附言:

        在WHERE阶段将会过滤掉大量的数据,再进行GROUP和HAVING阶段,比起将过滤条件都写在HAVING中效率高。因为先进行分组再过滤,有可能大量的分组工作就白做了。又因为只有对分组的数据才又使用聚合函数的意义,而WHERE阶段在GROUP阶段之前,所以尚未分组就不能使用聚合函数,这也是为什么将聚合函数放在WHERE中会出错的原因。

相关文章:

第16章 SELECT 底层执行原理

一、SELECT查询的完整结构 1.1 方式一(SQL 92语法) SELECT ..., ..., ... FROM ..., ..., ... WHERE 多表的连接条件 AND 不包含组函数的过滤条件 GROUP BY ..., ... HAVING 包含组函数的过滤条件 ORDER BY ... ASC/DESC LIMIT ..., ... 1.2 方式二&a…...

python查询日志,并组装sql,修复缺失的数据

前言 由于mysql链接超时波动,导致数据缺失,需要根据日志填补数据 流程 获取确实数据的订单列表 搜索日志,获取请求日志 根据请求日志拼装sql 打印sql供修复数据 代码 因为我们日志打印的有问题,所以这里用字符串截取获取入…...

RecyclerView进阶知识讲解

在 Android 开发中,RecyclerView 是一种高效的列表和网格布局控件,用于显示大规模数据。尽管基本使用方法简单,但深入理解并掌握其高级进阶用法能大幅提升用户体验和应用性能。下面,我将从布局管理、动画和手势、自定义缓存、优化…...

C语言 函数

时间:2024.11.10-11.11 一、学习内容 1、什么是函数 函数:程序中独立的功能。将反复书写的代码,又不确定什么时候回用到的代码打包起来。 2、函数的基本格式 函数的定义格式(写在main函数外) void 函数名() { 函数…...

windows中docker安装redis和redisinsight记录

创建一个Redis运行容器,命令如下 docker run -it -d --name redis -p 6379:6379 redis --bind 0.0.0.0 --protected-mode no -d 代表Redis容器后台运行 --name redis 给创建好的容器起名叫redis -p 6379:6379 将容器的6379端口映射到宿主机的6379端口,注…...

itextpdf打印A5的问题

使用A5打印的时候,再生成pdf是没有问题的。下面做了一个测试,在打印机中,使用A5的纸张横向放入,因为是家用打印机,A5与A4是同一个口,因此只能这么放。 使用itextpdf生成pdf,在浏览器中预览pdf是…...

qt QUndoView详解

1、概述 QUndoView 是 Qt 框架中用于显示 QUndoStack(撤销堆栈)内容的视图类。它通常与 QUndoStack 一起使用,为用户提供了一个可视化的界面来查看和操作撤销/重做历史。QUndoView 可以显示堆栈中的每个命令,并允许用户通过界面进…...

python+智谱AI-实现钉钉消息自动回复

python智谱AI-实现钉钉消息自动回复 实现了电脑窗口切换,截图识别未读消息,与语言模型交互后,将答案带入到钉钉窗口中。偷个懒,直接贴代码了,后续不断完善注释,如果遇到读不懂的地方,欢迎交流。…...

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件:kafka-eagle-bin-2.0.8.tar.gz 链接:https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码:sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…...

【命令操作】Linux上带宽流量监控nethogs命令详解 _ 统信 _ 麒麟 _ 方德

原文链接:【命令操作】Linux上带宽流量监控nethogs命令详解 | 统信 | 麒麟 | 方德 Hello,大家好啊!今天带来一篇关于Linux上nethogs命令详解的文章。nethogs是一款非常实用的网络流量监控工具,帮助用户实时查看系统中每个进程的网…...

【入门篇】数字统计——多语言版

题目跳转:数字统计 题目解析: 这道题目要求统计在给定范围 [L, R] 内所有整数中数字 2 出现的次数。例如,在范围 [2, 22] 中,数字 2 分别在数 2、12、20、21、22 中出现的次数,最终出现了6次。 题目的输入为两个正…...

探索那些现代C++语法糖

本文来聊聊现代C的一些语法糖。 1.Auto auto x 10; // 推导为 int auto y 3.14; // 推导为 double2.范围-based for 循环 std::vector<int> v {1, 2, 3, 4, 5}; for (auto val : v) {std::cout << val << " "; }3.nullptr int* ptr nullpt…...

【LeetCode】【算法】33. 搜索旋转排序数组

LeetCode 33. 搜索旋转排序数组 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k…...

Python小游戏25——黄金矿工

首先&#xff0c;你需要安装Pygame库。 如果你还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; 【bash】 pip install pygame 【python】代码展示 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 60…...

WPF中Prism框架中 IContainerExtension 和 IRegionManager的作用

在Prism框架中&#xff0c;IContainerExtension和IRegionManager扮演着重要的角色&#xff0c;具体作用如下&#xff1a; IContainerExtension IContainerExtension接口是Prism 7中引入的&#xff0c;用于抽象依赖注入容器的操作。它实现了IContainerProvider和IContainerReg…...

C++实现用户分组--学习

第一步实现&#xff1a;ETL的设计分三部分&#xff1a;数据抽取(Data Extraction)、数据的清洗转换(Data Transformation)、数据的加载(Data Loading). 构建一个数据容器类&#xff0c;其中包含转换后的MNIST手写数据。还实现了一个数据处理程序&#xff0c;该数据处理程序将提…...

鸿蒙华为商城APP案例

模拟器运行效果如下&#xff1a; 鸿蒙版APP-华为商城-演示视频...

回首遥望-C++内存对齐的思考

这一章节主要巩固一下学习C/C时内存对齐相关的内容&#xff01; 文章目录 什么是内存对齐&#xff1f;为什么要有内存对齐&#xff1f;如何进行内存对齐&#xff1f;致谢&#xff1a; 什么是内存对齐&#xff1f; 这里不提及一堆啰嗦概念&#xff0c;就结合实际出发&#xff0…...

力扣 LeetCode 704. 二分查找(Day1:数组)

解题思路&#xff1a; 二分查找主要分为[ left , right ]左闭右闭和[ left , right )左闭右开两种 此处采取[ left , right ]左闭右闭写法 注意&#xff1a; 1. right的初始化取值 2. while中取等 3. right mid -1 ; class Solution {public int search(int[] nums, i…...

【Mode Management】AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解

目录 前言 正文 1.AUTOSAR标准描述 1.1 EcuM_CheckWakeup用来干什么 1.2 EcuM_CheckWakeup在哪里被调用 1.3 EcuM_CheckWakeup的使用场景 1.3.1 GPT中断检测唤醒源 1.3.2 EcuM轮询GPT检测唤醒源 1.3.3 ICU中断检测唤醒源 1.3.4 其他 2.AUTOSR工具相关配置 3.唤醒源…...

Git 本地版本控制极简使用笔记(Qt 项目专用)

核心原则全程仅需掌握5 个核心命令&#xff0c;满足日常开发、版本记录、回滚修复的全部需求&#xff0c;无需复杂操作&#xff0c;适配传感器环筛管理平台项目一、基础准备&#xff08;已完成&#xff0c;备查&#xff09;1. 仓库初始化&#xff08;仅执行 1 次&#xff09;# …...

像素皇城·灵蛇贺岁效果展示:红白机美学融合皇城大门的AI春联生成作品

像素皇城灵蛇贺岁效果展示&#xff1a;红白机美学融合皇城大门的AI春联生成作品 1. 项目概览 Pixel Couplet Gen是一款基于ModelScope大模型开发的创新型春联生成工具。与传统春联设计不同&#xff0c;我们大胆采用了8-bit像素游戏风格&#xff0c;将经典红白机视觉元素与中国…...

Fay-UE5数字人系统架构深度解析:基于Unreal Engine 5的实时交互虚拟人技术实现

Fay-UE5数字人系统架构深度解析&#xff1a;基于Unreal Engine 5的实时交互虚拟人技术实现 【免费下载链接】fay-ue5 项目地址: https://gitcode.com/gh_mirrors/fa/fay-ue5 Fay-UE5是一个基于Unreal Engine 5引擎构建的高性能数字人解决方案&#xff0c;通过深度集成F…...

2025平航杯电子取证实战:从木马溯源到服务器渗透的完整链条分析

1. 木马溯源&#xff1a;从可疑流量到攻击者定位 2025年4月&#xff0c;杭州滨江警方接到一起特殊报案。市民刘晓倩&#xff08;化名倩倩&#xff09;发现自己的手机出现异常发热、电量消耗过快等现象&#xff0c;怀疑设备被人监控。这个看似普通的个人隐私案件&#xff0c;最终…...

Python AI推理延迟骤降62%的秘密:一张未公开的Cuvil架构设计图,含3大专利级调度模块

第一章&#xff1a;Python AI推理延迟骤降62%的秘密&#xff1a;一张未公开的Cuvil架构设计图&#xff0c;含3大专利级调度模块Cuvil 架构并非传统加速器堆叠方案&#xff0c;而是一种面向 Python 原生执行栈深度协同的异构推理引擎。其核心突破在于绕过 PyTorch/TensorFlow 的…...

中文医学知识图谱构建指南:从技术痛点到价值落地

中文医学知识图谱构建指南&#xff1a;从技术痛点到价值落地 【免费下载链接】CMeKG_tools 项目地址: https://gitcode.com/gh_mirrors/cm/CMeKG_tools 破解医学文本处理的三重困境 当前医学NLP领域面临着专业术语识别难、实体边界模糊、关系抽取准确率低的三重挑战。…...

别再死记硬背了!用Verilog手写一个四位加减法器,帮你彻底搞懂补码和逻辑门

从逻辑门到补码运算&#xff1a;Verilog四位加减法器的硬件思维解密 记得第一次在《数字逻辑》课上听到"补码"这个概念时&#xff0c;我和大多数同学一样满脸困惑——为什么计算机要用这么绕的方式处理负数&#xff1f;直到亲手用Verilog实现了一个四位加减法器&…...

Wan2.2-I2V-A14B参数详解:--output路径修改与/workspace目录结构说明

Wan2.2-I2V-A14B参数详解&#xff1a;--output路径修改与/workspace目录结构说明 1. 镜像概述与核心功能 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像&#xff0c;基于RTX 4090D 24GB显存显卡深度调优。这个镜像最大的特点是开箱即用&#xff0c;内置了完整的运…...

OpenClaw健康监测:用Phi-3-mini-128k-instruct分析智能手表数据

OpenClaw健康监测&#xff1a;用Phi-3-mini-128k-instruct分析智能手表数据 1. 为什么选择OpenClaw处理健康数据&#xff1f; 去年体检报告上的几项异常指标让我开始关注日常健康监测。虽然手环和智能手表能记录睡眠、心率等数据&#xff0c;但原始数据报表就像一本天书——我…...

Pixel Language Portal实操手册:自定义天空蓝主题(#e3f2fd)与金币黄按钮配置

Pixel Language Portal实操手册&#xff1a;自定义天空蓝主题(#e3f2fd)与金币黄按钮配置 1. 工具概览 **像素语言跨维传送门(Pixel Language Portal)**是一款基于腾讯Hunyuan-MT-7B核心引擎构建的创新翻译工具。与传统翻译软件不同&#xff0c;它将语言转换过程设计成一场16-…...