Mysql编写过程和解析过程顺序刨析

我们在平时的编写sql语句当中,编写顺序都是知道,先select …… from …… join……where 等等 ,那么它的解析过程顺序是什么样的呢?先说一下mysql解析顺序大致为:

  1. FROM 子句的解析:
    • 解析 FROM 子句时,识别要查询的表及其别名,并建立表之间的关联关系。
    • 检查表和别名的有效性,确保它们存在于数据库中。
    • 确定表之间的连接方式,例如使用 INNER JOIN、LEFT JOIN、RIGHT JOIN 等。
  2. JOIN 子句的解析:
    • 如果存在 JOIN 子句,解析 JOIN 子句中的表及其连接条件。
    • 确定连接条件的列,即 ON 子句中的列名。
    • 确定连接的方式,例如 INNER JOIN、LEFT JOIN、RIGHT JOIN 等。
    • 确定连接的顺序,即表之间的连接顺序。
  3. WHERE 子句的解析:
    • 解析 WHERE 子句中的逻辑条件,确定查询的过滤条件。
    • 识别 WHERE 子句中的列和运算符,以确定比较的对象和条件类型。
    • 确定 WHERE 子句中的逻辑关系,例如 AND、OR、NOT 等。
  4. GROUP BY 子句的解析:
    • 解析 GROUP BY 子句,确定按照哪些列进行分组。
    • 检查 GROUP BY 列的有效性,确保它们存在于查询的结果集中。
    • 确定分组的顺序,即按照哪些列进行先后排序。
  5. HAVING 子句的解析:
    • 解析 HAVING 子句中的逻辑条件,确定分组的过滤条件。
    • 识别 HAVING 子句中的列和运算符,以确定比较的对象和条件类型。
    • 确定 HAVING 子句中的逻辑关系,例如 AND、OR、NOT 等。
  6. SELECT 子句的解析:
    • 解析 SELECT 子句,确定要返回的列及其处理方式(如别名、聚合函数等)。
    • 识别 SELECT 列中的表达式和函数,确定它们的有效性和计算顺序。
  7. ORDER BY 子句的解析:
    • 解析 ORDER BY 子句,确定查询结果的排序方式。
    • 检查 ORDER BY 列的有效性,确保它们存在于查询的结果集中。
    • 确定排序的顺序,即升序还是降序。
  8. LIMIT 子句的解析:
    • 解析 LIMIT 子句,确定返回结果的行数限制。
    • 确定起始位置和返回的行数。

大致就是这样的一个过程:举个例子

假设我们有以下两个表:

表1: customers

customer_id  customer_name
-----------  -------------
1            John
2            Lisa
3            Michael

表2: orders

order_id  customer_id  total_amount
--------  -----------  ------------
1         1            100
2         1            150
3         2            200
4         3            50

我们来看一个稍复杂一点的查询,查询每个顾客的订单总数,并按照订单总数降序排列,只返回前两个结果。

SELECT c.customer_id, c.customer_name, COUNT(o.order_id) AS order_count
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name
HAVING order_count > 0
ORDER BY order_count DESC
LIMIT 2;

该查询的编写和解析过程如下:

  1. FROM 子句的解析:
    • 解析 FROM 子句,识别要查询的表 customers 和 orders,并建立它们之间的关联关系。
  2. JOIN 子句的解析:
    • 在 JOIN 子句中,通过 ON c.customer_id = o.customer_id 指定了表 customers 和 orders 的连接条件。
  3. WHERE 子句的解析:
    • 该查询没有 WHERE 子句,跳过解析 WHERE 子句的过程。
  4. GROUP BY 子句的解析:
    • 在 GROUP BY 子句中,指定了按照 c.customer_id, c.customer_name 列进行分组。
  5. HAVING 子句的解析:
    • 在 HAVING 子句中,指定了过滤条件 order_count > 0,只返回订单总数大于 0 的结果。
  6. SELECT 子句的解析:
    • 在 SELECT 子句中,指定要返回的列 c.customer_id, c.customer_name,以及使用聚合函数 COUNT(o.order_id) 计算订单总数,并给结果列起别名为 order_count
  7. ORDER BY 子句的解析:
    • 在 ORDER BY 子句中,指定按照 order_count 列进行降序排序。
  8. LIMIT 子句的解析:
    • 在 LIMIT 子句中,指定返回结果的行数限制为 2。

解析过程是按照以上顺序进行的,先从 FROM 子句开始,逐步解析其他子句,最后生成执行计划并返回结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CV计算机视觉每日开源代码Paper with code速览-2023.11.22

点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【语义分割】Mobile-Seed: Joint Semantic Segmentation and Boundary Detection for Mobile Robots 论文地址:https://arxiv.or…

7种SQL进阶用法【转】

1.自定义排序(ORDER BY FIELD) 在MySQL中ORDER BY排序除了可以用ASC和DESC之外,还可以使使用自定义排序方式来实现 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DECIMAL(10,2) DEFAULT 50, release date…

P8安全基本理论A001-CIA安全模型-使用PGP描述网络安全CIA模型之私密性、完整性案例

【教学资源名称】 CIA安全模型-使用PGP描述网络安全CIA模型之私密性、完整性案例 【预备知识】 在信息安全等级保护工作中,根据信息系统的机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)来划分信息系统的安全等级,三个性质简称CIA。 私密性(Confi…

ES 8.x开始(docker-compose安装、kibana使用、java操作)

学习文档地址 一、Docker安装 这里使用docker-compose来安装,方便后续迁移,Elasticserach和kibina一起安装。 1、创建安装目录 configdataplugins 2、配置文件 配置文件有两个,一个是ES的配置文件,一个docker-compose的配置文件 …

大厂做项目的过程,你真的知道吗?

文章目录 明确需求排期代码设计技术选型写代码迭代更新 一线大厂的项目是如何从0-1被做出来的,了解大厂项目开发的详细流程;自己开发项目那是单打独斗,没人管你;但进入企业中开发项目那是开团打本,大家都在一股绳上&am…

龙芯loongarch64服务器编译安装pyarrow

1、简介 pyarrow是一个高效的Python库,用于在Python应用程序和Apache Arrow之间进行交互。Arrow是一种跨语言的内存格式,可以快速高效地转移大型数据集合。它提供了一种通用的数据格式,将数据在内存中表示为表格,并支持诸如序列化和分布式读取等功能。 龙芯的Python仓库安…

Ubuntu 22.03 LTS 安装deepin-terminal 分屏

安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口,鼠标点击可以切换…

[ BUG ] 踩坑 Axios Delete 请求传参

踩坑 Axios Delete 请求传参 问题描述 今天在写前后端交互时,我想将 data 数据通过 delete 进行传参 axios.delete("/info", data),但是发现后端一直提示参数错误,我看了看代码也没错啊。跟 post、patch 一样的写法为什么会出现参…

三方支付接口成为了电商竞争力的新动力

在当前快速发展的互联网时代,随着电子商务行业的兴起,支付体验已经成为企业获取竞争优势的重要因素。一个快速、安全、便捷的支付环节不仅可以提升用户的体验,还能有效促进交易的完成。在众多支付解决方案中,三方支付接口因其独特…

18.Spring框架中的单例bean是线程安全的吗?(阿里一面)

Spring框架中的单例bean是线程安全的吗?(阿里一面) 不是,Spring框架中的单例bean不是线程安全的。spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。 实际上大部分时候 spring bean 无状态的(比如 dao 类),所以某种程度上来说 bea…

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

linux 内核线程

内核线程类似于用户进程,通常用于并发处理些工作,它是一种在内核空间实现后台任务的方式,并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理,也可以睡眠等待某事件的发生,内核线程可以访问内核函数和…

Linux操作系统使用及C高级编程-D17D18编译与调试

编译 当有线程创建时编译:gcc test.c -o test -lpthread 分文件编写时主要是分为:.c(函数声明的具体实现)、.h(说明性文件:#define 结构体共用体 声明)、.c(main) 条件编译 一般情况下&#x…

激光线提取

在做单线激光三维重建,和多线激光三维重建的时候都会设计到激光线提取算法的实现,如何保持高速和高精度是关键 ,最近优化了steger中心线提取算法,通过并行化实现在cpu版本可以做到2m,GPU版本可以做到0.6ms左右,完全可…

Flask 运用Xterm实现交互终端

Xterm是一个基于X Window System的终端仿真器(Terminal Emulator)。Xterm最初由MIT开发,它允许用户在X Window环境下运行文本终端程序。Xterm提供了一个图形界面终端,使用户能够在图形桌面环境中运行命令行程序。而xterm.js是一个…

Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

23. Spring源码篇之环境变量Environment

简介 在开发过程中,我们通常会把一些变化的数据,或者说不同环境值不一样的数据抽离出来,代码可以根据需要通过配置动态的方式获取不同的值,这个值可以是在配置文件中,数据库中等 在spring中定义了一个统一的环境变量…

android 9 adb安装过程学习(三)

PackageManagerService 一、PackageManagerService.installStage 接下来,进入 PackageManagerService 阶段。从PackageInstallerSession.java的commitLocked调用 这里的 IPackageInstallObserver2 observer 是前面创建的本次 localObserver: 位置&…

详解FreeRTOS:互斥信号量和递归互斥信号量(高级篇—3)

目录 1、互斥信号量 1.1、互斥信号量运作机制 1.2、创建互斥信号量

[SpringCloud] SpringCloud配置中心的核心原理

SpringCloud是什么时候去拉取配置中心的配置中心客户端的配置信息为什么要写在bootstrap文件中对象中注入的属性是如何动态刷新的一些开源的配置中心是如何整合SpringCloud的 文章目录 1.从SpringBoot的启动过程说起1.1 大致过程 2.准备Environment的核心操作2.1 前置操作 3.pr…