精华内容
下载资源
问答
  • MySQL SELECT执行顺序

    2021-01-27 07:51:45
    SELECT语句的完整语法为:(7) SELECT(8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) LIMIT 说明:语法前面的序号为SELECT执行顺序MySQLSELECT执行顺序一共分为10步...

    SELECT语句的完整语法为:

    (7) SELECT(8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) LIMIT

    说明:语法前面的序号为SELECT执行顺序

    MySQL的SELECT执行顺序一共分为10步,如上所标注的那样,最先执行的是FROM操作,最后执行的是LIMIT操作。其中每一次操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

    下面我们来具体分析一下查询处理的每一个阶段:

    SELECT a.customer_id, COUNT(b.order_id) astotal_ordersFROM table1 ASaLEFT JOIN table2 ASbON a.customer_id =b.customer_idWHERE a.city = 'hangzhou'

    GROUP BYa.customer_idHAVING count(b.order_id) < 2

    ORDER BY total_orders DESC;

    1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。

    2、ON: 对虚表VT1进行ON过滤,只有那些符合的行才会被记录在虚表VT2中。

    3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。

    4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。

    5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。

    6、HAVING: 对虚拟表VT5应用having过滤,只有符合的记录才会被 插入到虚拟表VT6中。

    7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。

    8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.

    9、ORDER BY: 将虚拟表VT8中的记录按照进行排序操作,产生虚拟表VT9.

    10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。

    展开全文
  • SELECT语句的完整语法为:(7) SELECT(8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) LIMIT 说明:语法前面的序号为SELECT执行顺序MySQLSELECT执行顺序一共分为10步...

    201952292244667.png?201942292323

    SELECT语句的完整语法为:

    (7) SELECT

    (8) DISTINCT

    (1) FROM

    (3) JOIN

    (2) ON

    (4) WHERE

    (5) GROUP BY

    (6) HAVING

    (9) ORDER BY

    (10) LIMIT

    说明:语法前面的序号为SELECT执行顺序

    MySQL的SELECT执行顺序一共分为10步,如上所标注的那样,最先执行的是FROM操作,最后执行的是LIMIT操作。其中每一次操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

    下面我们来具体分析一下查询处理的每一个阶段

    SELECT a.customer_id, COUNT(b.order_id) as total_orders

    FROM table1 AS a

    LEFT JOIN table2 AS b

    ON a.customer_id = b.customer_id

    WHERE a.city = 'hangzhou'

    GROUP BY a.customer_id

    HAVING count(b.order_id) < 2

    ORDER BY total_orders DESC;

    1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。

    2、ON: 对虚表VT1进行ON过滤,只有那些符合的行才会被记录在虚表VT2中。

    3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。

    4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。

    5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。

    6、HAVING: 对虚拟表VT5应用having过滤,只有符合的记录才会被 插入到虚拟表VT6中。

    7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。

    8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.

    9、ORDER BY: 将虚拟表VT8中的记录按照进行排序操作,产生虚拟表VT9.

    10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    本文标题: 简单了解MySQL SELECT执行顺序

    本文地址: http://www.cppcns.com/shujuku/mysql/259985.html

    展开全文
  • Mysql-----from子句-> join子句-> on子句-> where子句 -> group子句-> having子句-> select子句 ->order by子句 -> limit子句(7) SELECT(8) DISTINCT (1) FROM (3) JOIN (2) ON (4) WHERE ...

    Mysql-----from子句-> join子句-> on子句-> where子句 -> group子句-> having子句-> select子句 ->order by子句 -> limit子句

    (7)  SELECT

    (8)  DISTINCT

    (1)  FROM

    (3)  JOIN

    (2)  ON

    (4)  WHERE

    (5)  GROUP BY

    (6)  HAVING

    (9)  ORDER BY

    (10) LIMIT

    说明:语法前面的序号为SELECT执行顺序

    MySQL的SELECT执行顺序一共分为10步,如上所标注的那样,最先执行的是FROM操作,最后执行的是LIMIT操作。其中每一次操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

    转载地址:https://blog.csdn.net/freefish_yzx/article/details/77248583

    展开全文
  • 1.SELECT语句处理顺序 2.where 后条件执行先后顺序 1.SELECT语句处理顺序 (1)from (2)on (3)join (4)where (5)group by (开始使用select中的别名,后面的语句中都可以使用) (6)avg,sum.... (7)having (8...

    目录

    1.SELECT语句处理顺序

    2.where 后条件执行先后顺序


    1.SELECT语句处理顺序

    (1)from

     

    (2)on

    (3)join

    (4)where

    (5)group by (开始使用select中的别名,后面的语句中都可以使用)

    (6)avg,sum....

    (7)having

    (8)select

    (9)distinct

    (10)order by

    (11)limit

    过程解释:

    第一步:首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表vt1(若有3个表以上,选择其中相对小的两表),求笛卡尔积。不论是什么类型的联接运算,首先都是执行交叉连接(CROSS JOIN)

    第二步:接下来便是应用on筛选器,on中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2

    第三步:如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3

    第四步:如果 from 子句中的表数目多于两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3。

    第五步:应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在对于包含outer join子句的查询,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on中指定逻辑表达式只会筛选outer join表的,不会对from的表进行筛选 ,where是最终筛选。

    第六步:group by 子句将中的唯一的值组合成为一组,得到虚拟表vt5。如果应用了group by,那么后面的所有步骤都只能得到的vt5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。这一点请牢记。

    第七步:应用cube或者rollup选项,为vt5生成超组,生成vt6.

    第八步:应用having筛选器,生成vt7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。

    第九步:处理select子句。将vt7中的在select中出现的列筛选出来。生成vt8.

    第十步:应用distinct子句,vt8中移除相同的行,生成vt9。事实上如果应用了group by子句那么distinct是多余的,原因同样在于,分组的时候是将列中唯一的值分成一组,同时只为每一组返回一行记录,那么所以的记录都将是不相同的。

    第十一步:应用order by子句。按照order_by_condition排序vt9,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用order by 子句查询不能应用于表表达式。排序是很需要成本的,除非你必须要排序,否则最好不要指定order by,最后,在这一步中是第一个也是唯一一个可以使用select列表中别名的步骤。

    第十二步: LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

     

     

    2.where 后条件执行先后顺序

    mysql:其条件执行顺序是 从左往右,自上而下 ,所以筛选出数据量少的条件放在最前面、走索引的放在前面

    orcale:其条件执行顺序是从右往左,自下而上

     

     

    展开全文
  • 上一篇讲述了Oracle的SELECT语法的执行顺序,这篇讲述MySQLSELECT语法的执行顺序MySQLSELECT语法的执行顺序和Oracle的基本相同,只是增加了MySQL独有的LIMIT语法。目录一、SELECT语句的处理过程1、 FROM阶段2...
  • 一、典型SELECT语句完整的执行顺序1)from子句组装来自不同数据源的数据;2)使用on进行join连接的数据筛选3)where子句基于指定的条件对记录行进行筛选;4)group by子句将数据划分为多个分组;5)cube, rollup6)使用...
  • SELECT语句的执行的逻辑查询处理步骤:(8)SELECT (9)DISTINCT(11) (1)FROM (3) JOIN (2) ON (4)WHERE (5)GROUP BY (6)WITH {CUBE | ROLLUP}(7)HAVING (10)ORDER BY 1.FROM2.ON3.JOIN4.WHERE5.GROUP BY6.WITH CUBE ...
  • 一、select流程 简述: 1、客户端通过半双工同步的长链接,发送查询sql给连接器,连接器进行库权限的校验; 2、通过校验后请求缓存,命中直接返回,未命中则发送给解析器; 3、解析器进行词法、语法解析生成解析树...
  • mysql where执行顺序

    2021-01-18 23:21:50
    where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个。在用MySQL查询数据库的时候,连接了很多个过滤条件,发现非常慢...
  • MySQL 查询执行顺序

    2021-05-29 16:40:24
    目录前言一、SQL查询执行顺序二、具体步骤执行顺序简介1、执行FROM语句2、执行ON...MySQL 查询执行顺序?好吧,之前都没有看到过的一个知识点 一、SQL查询执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) F
  • MySQL -- SELECT 执行过程

    2021-01-21 00:00:16
    基本架构 大体上,MySQL可以分为 Server层 和 存储引擎层Server层包括 连接器、查询缓存、分析器、优化器和执行器 等涵盖 MySQL 的 大多数核心服务功能 ,以及 所有的内置函数所有的 跨存储引擎的功能 都在这一层...
  • MySql 语句执行顺序

    2021-01-19 19:51:37
    一、手写SQL顺序select from join on where group by having order by limit 二、MySql执行顺序from on join where group by having select distinctorder by limit 三、MySql执行顺序理解第一步:加载from子句的前...
  • 前言:mysql在咱们的开发中基本天天都要面对的,做为开发中的数据的来源,mysql承担者存储数据和读写数据的职责。...本篇博客未来探讨这个问题:mysql本篇博客的目录sql一:mysql执行过程数据库二:mysql执行...
  • 但是有没有办法改变执行顺序?我的查询如下所示:SELECT c.*FROM table1 aINNER JOIN table2 b ON a.id = b.table1_idINNER JOIN table3 c ON b.itemid = c.itemidWHERE a.itemtype = 1AND a....
  • 前言:MySQL在我们的开发中基本每天都要面对的,作为开发中的数据中间件,MySQL承担者存储数据和读写数据的职责。...本篇博客将来探讨这个问题:本篇博客的目录一:MySQL执行过程二:MySQL执行过程中的状态三:MyS...
  • 一、mySql执行顺序mysql执行sql的顺序从 From 开始,以下是执行的顺序流程1、FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp12、JOIN table2 所以先是确定表,再确定关联条件3...
  • 例1(left join && right join):select * from A ...// 最终返回的是 C 表中的数据,附带A、B两表中符合条件的数据// 这边的执行顺序是怎样的?// 我的理解:1. A left join B 返回 A 表数据,附带 B 表中...
  • select,from等关键字执行顺序 参考相关链接原创 SQL 查询的执行顺序是怎样的? 按常规如下: 我们平常写的顺序是这样的: 1. SELECT 2. DISTINCT <select_list> 3. FROM <left_table> 4. <join_...
  • MySQL 语句的执行顺序

    2021-01-20 02:22:04
    (1)SQL语句的语法顺序:SELECT[DISTINCT]FROMJOINONWHEREGROUP BYHAVINGUNIONORDER BYLIMIT(2)SQL的执行顺序FROM:将数据从硬盘加载到数据缓冲区,方便对接下来的数据进行操作。WHERE:从基表或视图中选择满足条件的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 154,151
精华内容 61,660
关键字:

mysqlselect执行顺序

mysql 订阅