MySQL中select 中关键字的查询的顺序(附带证明)

您所在的位置:网站首页 查询结果的排序子句是 MySQL中select 中关键字的查询的顺序(附带证明)

MySQL中select 中关键字的查询的顺序(附带证明)

2024-06-11 20:38| 来源: 网络整理| 查看: 265

目录

前言:

1.查询顺序的结论

2.证明执行顺序

1.证明 from 比select 先执行

2.证明from 比where 先执行

3.证明where 比select先执行 

 3.SQL的执行原理

前言:

          在学习SQL的时候,一定要动手去敲代码,然后要善于思考,为什么要这样做?这样做有什么好处?只有带着问题去学习,我们的收获才能最大化。希望你再阅读完本篇文章之后,你会把查询字段执行的顺序真正地理解,而不是简单的记住。

        路漫漫其修远兮,吾将上下而求索。与诸君共勉 

1.查询顺序的结论

在SQL92语法中:

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

在SQL99语法中:

SELECT ...,....,... FROM ... JOIN ... ON 多表的连接条件 JOIN ... ON ... WHERE 不包含组函数的过滤条件 AND/OR 不包含组函数的过滤条件 GROUP BY ...,... HAVING 包含组函数的过滤条件 ORDER BY ... ASC/DESC LIMIT ...,... #其中: #(1)from:从哪些表中筛选 #(2)on:关联多表查询时,去除笛卡尔积 #(3)where:从表中筛选的条件 #(4)group by:分组依据 #(5)having:在统计结果中再次筛选 #(6)order by:排序 #(7)limit:分页

各个字段执行的顺序:

2.证明执行顺序

1.证明 from 比select 先执行

思路:

         给表起一个别名,通过测试 你会发现,若想说明一个字段它属于哪一个表中,此时这个表名必须是新名字的表名。

类似这样:

2.证明from 比where 先执行

思路:

        给表名起别名后,然后在where语句中说明字段属于哪一个表

类似这样:

3.证明where 比select先执行 

思路:

        在select中给字段起别名后,看看在where中能否使用

其他字段也可以从逻辑上来说明执行的先后顺序:

例如这样:

查询数据之前,要先from 找到表,接着用where 来筛选你要查的数据,

然后你也可以用group by 来分组 ,之后可以 having 来过滤你不要的数据,

得到你想要的数据后,可以用select 去查询显示出来 

查询的数据没有顺序,可以使用order by 来排序

数据又太多,可以使用limit来分页;

(仔细理解 希望能帮助你形象记忆一下)

 3.SQL的执行原理

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

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

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

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

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

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

当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段 。

         首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和 vt5-2 。

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3