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

SQL逻辑查询语句执行顺序

一、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.zskr.cn/news/53364.html

相关文章:

  • uniapp的rich-text在渲染长数字与长字母时不换行
  • 头部厂商易路AI HR实战解析:从人海战术到智能闭环的合规跃迁
  • 实用指南:【XR硬件系列】影目GO3智能眼镜发布:AI翻译+轻薄设计,重塑人机交互体验
  • 完整教程:PRCV 2025:文本何以成为 AGI 的必经之路?
  • Ubuntu Server 22.04.5 linux系统安装教程
  • 2025年最新苗木批发基地综合实力排行榜单,国槐/樱花/红叶李/苗木/金叶复叶槭/红叶石楠/丝棉木/油松/白蜡/金叶女贞/紫薇种植推荐
  • VideoLLaMA 3新一代前沿多模态基础模型赋能图像与视频深度理解| LLM | 计算机视觉
  • kotlin中HorizontalDivider() ModalBottomSheet background()
  • 11月18号
  • 2025 最新黄锈石实力厂家推荐排行榜:无辐射环保石材权威测评,光面 / 荔枝面 / 路沿石优质供应商精选黄锈石菠萝面/黄锈石滚石/黄锈石蘑菇石公司推荐
  • 毕设项目基于SpringBoot的趣味知识卡片APP\251022(白嫖源码+演示录像)可做计算机毕设JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、文案 - 实践
  • 2025 最新槽钢厂家推荐!权威测评认证的槽钢源头厂家,聚焦定制实力与万吨备货量的优选榜单轨道/导轨/集装箱用/门架/C 型槽钢公司推荐
  • 每日 Emacs Tip:Emacs Lisp 语法详解 —— 反引用(Backquote)
  • 详细介绍:【物联网架构】
  • CF1898F Vova Escapes the Matrix
  • 第四章 栈与队列--栈
  • 每日 Emacs Tip:Abbrev Mode(缩写模式)
  • mns 1118
  • 完整教程:临床研究标志物发现与机制探索:纯数据挖掘与“实验+服务”一站式方案,如何选择?
  • 2025年山东一次性打包碗商用公司权威推荐榜单:一次性餐盒/合肥一次性打包碗订制/南京一次性外卖打包碗源头公司精选
  • 2025.11.17 周作业 44 速通
  • [JOIGST 2024]-卡牌游戏 解题报告
  • 无菌药厂变频升级方案:ModbusTCP转Canopen高效适配方案
  • 31、用户授权 GRANT
  • 理解模型输出配置
  • MapStruct对象属性拷贝
  • 2025 最新薄膜蒸发设备厂家推荐!权威测评认证薄膜蒸发设备品牌排行榜,聚焦工艺创新与品质保障刮板薄膜蒸发设备/高效薄膜蒸发设备/实验室薄膜蒸发设备公司推荐
  • java根据word模板生成word,在根据word文件转换成pdf文件
  • 2025 最新打印机经销商推荐排行榜:长三角标杆企业 + 国内新锐品牌,全包服务与高效响应双重保障彩色打印机/打印机销售/打印机出租/打印机租赁公司推荐
  • 函数速查表