SQL逻辑查询语句执行顺序

news/2025/11/18 18:29:49/文章来源:https://www.cnblogs.com/Ciyang-Wu/p/19238869

一、select 语句关键字的定义顺序

View Code
SELECT DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

二、select 语句关键字的执行顺序

执行顺序
(7)     SELECT 
(8)     DISTINCT <select_list>
(1)     FROM <left_table>
(2)     <join_type> JOIN <right_table>
(3)     ON <join_condition>
(4)     WHERE <where_condition>
(5)     GROUP BY <group_by_list>
(6)     HAVING <having_condition>
(9)     ORDER BY <order_by_condition>
(10)    LIMIT <limit_number>

三、准备表和数据

1.新建一个测试数据库TestDB;

create database TestDB;

2.创建测试表table1和table2;

create table table1(
customer_id varchar(10) not null,
city varchar(10) not null,
primary key (customer_id)
)engine=innodb default charset=UTF8;create table table2(
order_id int not null auto_increment,
customer_id varchar(10),
primary key(order_id)
)engine=innodb default charset=utf8;

3.插入测试数据

INSERT INTO table1(customer_id,city) VALUES('163','hangzhou');
INSERT INTO table1(customer_id,city) VALUES('9you','shanghai');
INSERT INTO table1(customer_id,city) VALUES('tx','hangzhou');
INSERT INTO table1(customer_id,city) VALUES('baidu','hangzhou');INSERT INTO table2(customer_id) VALUES('163');
INSERT INTO table2(customer_id) VALUES('163');
INSERT INTO table2(customer_id) VALUES('9you');
INSERT INTO table2(customer_id) VALUES('9you');
INSERT INTO table2(customer_id) VALUES('9you');
INSERT INTO table2(customer_id) VALUES('tx');
INSERT INTO table2(customer_id) VALUES(NULL);

查看table1 , table2

mysql> select * from table1;
+-------------+----------+
| customer_id | city     |
+-------------+----------+
| 163         | hangzhou |
| 9you        | shanghai |
| baidu       | hangzhou |
| tx          | hangzhou |
+-------------+----------+
4 rows in set (0.00 sec)mysql> select * from table2;
+----------+-------------+
| order_id | customer_id |
+----------+-------------+
|        1 | 163         |
|        2 | 163         |
|        3 | 9you        |
|        4 | 9you        |
|        5 | 9you        |
|        6 | tx          |
|        7 | NULL        |
+----------+-------------+
7 rows in set (0.00 sec)

四、准备SQL逻辑查询测试语句

查询来自杭州,并且订单数少于2的客户
SELECTa.customer_id,count( b.order_id ) AS total_orders 
FROMtable1 AS aLEFT JOIN table2 AS b ON a.customer_id = b.customer_id 
WHEREa.city = 'hangzhou' 
GROUP BYa.customer_id 
HAVINGcount( b.order_id ) < 2 
ORDER BYtotal_orders DESC;

五、执行顺序分析

在这些SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果(这是重点),
我们现在就来跟踪这个虚拟表的变化,得到最终的查询结果的过程,来分析整个SQL逻辑查询的执行顺序和过程。

执行FROM语句

第一步,执行FROM语句。我们首先需要知道最开始从哪个表开始的,这就是FROM告诉我们的。现在有了<left_table><right_table>两个表,我们到底从哪个表开始,还是从两个表进行某种联系以后再开始呢?它们之间如何产生联系呢?——笛卡尔积

关于什么是笛卡尔积,请自行Google补脑。经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表,暂且叫VT1(vitual table 1),内容如下:

 mysql> select * from table1 join table2;
+-------------+----------+----------+-------------+
| customer_id | city     | order_id | customer_id |
+-------------+----------+----------+-------------+
| 163         | hangzhou |        1 | 163         |
| 9you        | shanghai |        1 | 163         |
| baidu       | hangzhou |        1 | 163         |
| tx          | hangzhou |        1 | 163         |
| 163         | hangzhou |        2 | 163         |
| 9you        | shanghai |        2 | 163         |
| baidu       | hangzhou |        2 | 163         |
| tx          | hangzhou |        2 | 163         |
| 163         | hangzhou |        3 | 9you        |
| 9you        | shanghai |        3 | 9you        |
| baidu       | hangzhou |        3 | 9you        |
| tx          | hangzhou |        3 | 9you        |
| 163         | hangzhou |        4 | 9you        |
| 9you        | shanghai |        4 | 9you        |
| baidu       | hangzhou |        4 | 9you        |
| tx          | hangzhou |        4 | 9you        |
| 163         | hangzhou |        5 | 9you        |
| 9you        | shanghai |        5 | 9you        |
| baidu       | hangzhou |        5 | 9you        |
| tx          | hangzhou |        5 | 9you        |
| 163         | hangzhou |        6 | tx          |
| 9you        | shanghai |        6 | tx          |
| baidu       | hangzhou |        6 | tx          |
| tx          | hangzhou |        6 | tx          |
| 163         | hangzhou |        7 | NULL        |
| 9you        | shanghai |        7 | NULL        |
| baidu       | hangzhou |        7 | NULL        |
| tx          | hangzhou |        7 | NULL        |
+-------------+----------+----------+-------------+

总共有28(table1的记录条数 * table2的记录条数)条记录。这就是VT1的结果,接下来的操作就在VT1的基础上进行。

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

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

相关文章

解码死锁的产生与解决

死锁 死锁是多线程 / 多进程并发编程中常见的严重问题,指两个或多个线程 / 进程因互相争抢资源而陷入无限等待状态,若无外力干预将永久无法继续执行。其本质是资源分配与调度不当导致的 “资源僵局”,典型现实类比是…

uniapp的rich-text在渲染长数字与长字母时不换行

在rich-text的容器上新增 容器 容器 容器 不是rich-text组件本身word-break: break-all; word-wrap: break-word; 出现此问题是因为浏览器将其视为了一个单词所以未进行换行

头部厂商易路AI HR实战解析:从人海战术到智能闭环的合规跃迁

在连锁零售与餐饮行业,食品安全是企业的生命线,而员工健康证管理则是保障这条生命线的第一道防线。对于拥有数千家门店、数万名员工的行业巨头而言,健康证管理绝非一项简单的事务性工作,它关乎企业合规的基石、品牌…

【微信小程序 + 登录流程】微信小程序授权登录完整流程,一篇搞定!(含代码实现) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

linux auto

您提到的“Linux auto”可能是指“Linux 自动化”或“Linux 自动化工具”,我将为您介绍一些常见的 Linux 自动化工具和命令,帮助您实现自动化任务。一、Linux 自动化工具 1. Ansible功能:基于 YAML 的自动化工具,支…

记录相关的操作

details summary::before { content: "▶"; position: absolute; left: 8px; transition: all 0.3s ease } details[open] summary::before { transform: rotate(90deg) } summary { list-style: none; curs…

P9846 [ICPC 2021 Nanjing R] Paimons Tree

派蒙题。 首先发现填完权值后的直接必定是原树直径中的某一条,但是无法确定是其中哪一条,所以这个发现是没用的/tx。 发现按照题目的染色方法,每个时刻染色的边必然为一条路径。 观察到 \(n\) 的范围很小,首先考虑…

linux audio

在 Linux 系统中,音频相关操作可以通过多种方式实现,包括使用内核音频驱动、 ALSA(Advanced Linux Sound Architecture)或 JACK 音频服务器等。以下是一些常见的 Linux 音频操作命令和脚本示例,适用于大多数 Linu…

不同方向的箭头符号

1. 基础方向箭头 ▶ 右箭头 (U+25B6) ◀ 左箭头 (U+25C0) ▼ 下箭头 (U+25BC) ▲ 上箭头 (U+25B2)2. 实心箭头 🔺 实心上三角 (U+1F53A) 🔻 实心下三角 (U+1F53B) ⏩ 快进右箭头 (U+23E9) ⏪ 快退左箭头 (U+23EA)3…

11.13 表子查询 内连接补充 事务

SELECT xx.*FROM(SELECT。。。。。; 内连接出来的是笛卡尔积,必须用条件消除 事务就是捆绑的操作集合 事务操作 SELECT @@autocommit ==1,自动提交 SET @@zutocommit=0; 手动提交: commint; 执行失败要回滚事务 ro…

Elasticsearch 7.17 集群添加账号密码

Elasticsearch 7.17 集群添加账号密码1. 环境信息 1.1 主机列表IP 主机名 操作系统 JAVA_HOME10.0.0.22 SY-AFP-ES01 Red Hat Enterprise Linux release 8.6 (Ootpa) /opt/app/middles/jdk1.8.0_47110.0.0.23 SY-AFP-E…

实用指南:【XR硬件系列】影目GO3智能眼镜发布:AI翻译+轻薄设计,重塑人机交互体验

实用指南:【XR硬件系列】影目GO3智能眼镜发布:AI翻译+轻薄设计,重塑人机交互体验pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

深入解析:推荐给硬件工程师的技术书籍

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

全球可观测厂商怎么选?2025年可观测性平台深度分析

在Gartner发布的《2025可观测性平台关键能力报告》中,评估维度涵盖数据摄取与存储、交互式探索、成本控制、LLM可观测性等核心能力,为全球企业选型提供了权威参考 根据Gartner报告描述的这几个核心能力,我们做了一个…

完整教程:PRCV 2025:文本何以成为 AGI 的必经之路?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ubuntu Server 22.04.5 linux系统安装教程

Ubuntu Server 22.04系统镜像下载本教程的Ubuntu Server 22.04系统镜像是从Ubuntu官网下载的,下载链接如下:https://ubuntu.com/download/server/step1打开VMware Workstation Pro ,打开创建新的虚拟机3.点击自定义…

2025 ICPC 沈阳区域赛 游记

2025 ICPC 沈阳区域赛 游记 计院没钱了,ICPC不给报销,遂开放报名。重金获得一次参赛机会。 为了节省住宿钱,我们选择星期六早上出发,星期天晚上回,只住一晚,订了个三人间。 Day 0 三个人都是两点钟睡觉六点钟起床…

在树莓派中配置X11桌面的HDMI配置

在Linux系统中配置X11的HDMI输出,主要通过修改Xorg配置文件或使用xrandr命令实现。以下是具体方法:一、通过Xorg配置文件固定HDMI分辨率‌生成分辨率模型‌ 使用cvt命令生成所需分辨率的模型参数(如19201080@60H…

2025年最新苗木批发基地综合实力排行榜单,国槐/樱花/红叶李/苗木/金叶复叶槭/红叶石楠/丝棉木/油松/白蜡/金叶女贞/紫薇种植推荐

行业权威榜单发布,优质苗木供应商全景解析 随着城乡绿化建设持续推进,苗木批发行业迎来新一轮发展机遇。基于近三年市场表现、供应链能力及客户反馈等维度,专业调研机构对国内苗木批发基地进行综合评估,现发布2025…

VideoLLaMA 3新一代前沿多模态基础模型赋能图像与视频深度理解| LLM | 计算机视觉

VideoLLaMA 3是基于Llama 3的前沿多模态基础模型,深度融合视觉、听觉与语言理解能力,支持高分辨率图像和长视频的端到端分析。其核心技术包括统一的视听语言架构、高效长视频词元化和万亿级多模态预训练,具备复杂的…