精华内容
下载资源
问答
  • 2020-08-14 08:42:45

    from
    on
    join
    where
    having
    group by
    select
    distinct
    order by
    limit
    避免笛卡尔积的方法
    内连接

    更多相关内容
  • 深入分析mysql各个关键字执行顺序


    mysql关键字执行顺序如下:

    from
    on/using
    join
    where
    group by
    having
    select
    distinct
    union
    order by
    limit
    

    一、解释关键字执行顺序

    这些关键字涉及的sql笔者这里就不一一去写了。
    Mysql会先执行from,然后根据on关键字去筛选目标表,筛选出的结果再进行join或者using,这样就会形成一个临时表。然后去执行where条件去筛选这个临时表,这样基本就筛选出需要的数据了。然后就可以对数据进行group by进行分组,同时若是有必要就会再执行having对数据进行进一步筛选,这里执行完数据基本就是一定定型了,下面就需要select去筛选目标列了,完事之后需要使用distinct进行去重这样一个表的查询基本就结束了。若是需要多表查询则还需要使用union或者union all来进行连接多表的结果。然后就是对数据进行排序的order by ,排完顺序自然就是取分页了。这样就会将一个完整的sql执行完毕了。

    二、关于执行顺序可能会有的疑问

    对于上面这个执行顺序,都是无需置疑的,不过对于为什么是这样一个顺序笔者曾经也是困惑过的,下面笔者总结了一下可能会产生困惑点,这里列下。

    1 on和join 为什么先执行on

    我最开始一直认为没有使用join形成一个临时表,那是如何对数据使用on进行条件筛选呢一直不太明白。后来才知道其实在使用left join 或者 right join 时临时表的主体数据本来就是确定的,比如使用left join 那么主表就是左表,那主表已经确定了,所以可以先执行on条件去筛选另一个表的数据,筛选完成后再将两个结果拼接形成一个临时表,mysql这么做就说的通了。rigint join 与left join类似,这里就不重复说了。
    上面是用left join 说的例子。那cross join 与 inner join 好像都是会形成笛卡尔积的。所以若是两个表在inner join执行前是不知道临时表的数据的,那怎么来使用on条件进行筛选呢?这种情况就不对了啊。所以根据这个点很多人可能会认为应该限制性join 再执行on,其实则不然。

    对于inner join 和 cross join 在他们后面使用on条件时,mysql都会将on后面的条件优化到where里,也就是说其实mysql在执行cross join 或者 inner join 时是不会有 on的,这里写on其实写的就是where。所以说cross join 和 inner join 里不存在on语句的,自然就没有先用on条件筛选的场景了。使用 inner join 或者 corss join 无论在on里写什么条件都会被翻译成where语句。所以到这里应该就会明白mysql先执行on关键字再执行 join 关键字是没有问题的了。
    下面展示下inner join on 被优化前后的sql对比。
    原始sql:

    select a.user_id from sys_user  a 
    inner join sys_user_role  b on a.user_id = b.user_id; 
    

    被执行优化器优化后的sql(mysql真正执行的语句):

    select `sunacwy_cockpit`.`a`.`user_id` AS `user_id` from `sunacwy_cockpit`.`sys_user` `a` 
    join `sunacwy_cockpit`.`sys_user_role` `b` where (`sunacwy_cockpit`.`a`.`user_id` = `sunacwy_cockpit`.`b`.`user_id`)
    

    通过上面的例子,就可以验证上面笔者说的内容了。有兴趣的同学可以在测试下非等值连接,自然连接等其他场景。

    2 on和where 有什么区别,哪些场景是相同的

    当on使用在left join 和 right join 后面时,会对连接数据先进行筛选,然后才会把符合on条件的数据进行连接。连接完成后才会执行where后面的筛选条件。
    当on使用在cross join 和 inner join 后面时,就不一样了。此时on和where效果一致,因为这里的on会被sql执行优化器,优化成where,所以这里的on和where是相同的。这一点上面的例子中已经证明了,这里就不重复写了。

    3 where和having 的区别

    where 和 having在一定程度上可以做一些相同的事,那他们有什么不同呢,其实having最主要的目的是用来执行分组后的聚合函数的,因为where关键字在group by之前执行,所以没法在where后面使用聚合函数,所以才有了having关键字。当然having关键字不仅可以执行聚合函数,同时也可以做与where一样的条件筛选。不过这里需要说明的事,若是非聚合函数的筛选条件一般不要出现在having里,这样会影响sql性能,这种数据筛选一般在where阶段就应该过滤掉,而不应该是执行到having了再去过滤这部分数据。

    三、关键字对于sql优化的启示

    我们知道更多的数据在越早的阶段被过滤掉越好,sql性能也越高。所以根据这一原则,我们根据sql关键字的执行顺序可以总结出这么一句话:

    1.能写在on里的条件,不要写在where里,能写在where里的条件不写在having里

    这个很好理解根据各个关键字的执行顺序,很容易就可以看出来先执行on再执行where最后执行haing,所以条件越靠前月有利于sql的执行。

    2.能使用left join 或者right join 的不使用inner join 或者 cross join

    这个是为什么呢?这篇文章里就两个sql,这两个sql揭示的是内连接中使用on的真实面目。其实我们在inner join 或者cross join中使用on其实就是使用where,因为mysql的执行优化器最后都回将on解析成where。所以说我们想使用on对数据进行提前筛选的目的就落空了,这样就导致了若我们使用inner join 或者 cross join 时本来在on中进行条件筛选的目的就落空了,而inner join 和cross join 又都会有笛卡尔积产生。这样就导致了一旦使用inner join 或者 cross join 无论你怎么写条件其实底层都是在笛卡尔积上进行数据筛选的,而笛卡尔积对于数据量大的表则是一个灾难性的后果。但是left join 和 right join 的on条件并不会被解析成where,使用左连或者右连时,on还是on,这样就能达到数据提前筛选的目的(先执行on再执行join),也不会有笛卡尔积产生。所以我们在可以使用left join 或者 right join时请不要使用inner join 或者 cross join。

    展开全文
  • mysql关键字执行顺序

    2021-05-18 15:18:57
    ​ SQL查询中用到的...书写顺序: ​ select->distinct->from->join->on->where->group by->having->order by->limit ​ 必须字段:select、from ​ 可选字段:distinct、join、on、

    ​ SQL查询中用到的关键词:select、distinct、from、join、on、where、group by、having、sum、count、max、avg、order by、limit

    书写顺序:

    ​ select->distinct->from->join->on->where->group by->having->order by->limit

    ​ 必须字段:select、from

    ​ 可选字段:distinct、join、on、where、group by、having、sum、count、max、avg、order by、limit

    执行顺序

    ​ from->on->join->where->group by(开始使用select中的别名,后面的语句中都可以使用别名)->sum、count、max、avg->having->select->distinct->order by->limit
    ————————————————
    版权声明:本文为CSDN博主「低僧」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_34512248/article/details/113032162

    展开全文
  • MySQL 关键字执行顺序

    千次阅读 2018-06-03 19:15:04
    在SQL语句中每个关键字都会按照顺序往下执行,而每一步操作,会生成一个虚拟表,最后的虚拟表就是最终结果。 基本sql 语句如下 : (8)SELECT (9)DISTINCT <select_list> (1)FROM <left_...

    在SQL语句中每个关键字都会按照顺序往下执行,而每一步操作,会生成一个虚拟表,最后的虚拟表就是最终结果。

    基本sql 语句如下 :

    (8)SELECT (9)DISTINCT <select_list>
    (1)FROM <left_table>
    (3) <join_type> JOIN <right_table>
    (2)       ON <join_condition>
    (4)WHERE <where_condition>
    (5)GROUP BY <group_by_list>
    (6)WITH{CUBE|ROLLUP}
    (7)HAVING <having_condition>
    (10)ORDER BY <order_by_list>
    (11)LIMIT <limit_number>
    

    常用的的执行顺序:

    1. FROM : 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1;
    2. ON : 对虚拟表VT1进行ON筛选,只有那些符合条件的行才会被记录在虚拟表VT2中;
    3. JOIN :如果是OUT JOIN,那么将保留表中(如左表或者右表)未匹配的行作为外部行添加到虚拟表VT2中,从而产生虚拟表VT3;
    4. WHERE :对虚拟表VT3进行WHERE条件过滤,只有符合的记录才会被放入到虚拟表VT4;
    5. GROUP BY:根据GROUP BY子句中的列,对虚拟表VT4进行分组操作,产生虚拟表VT5;
    6. CUBE|ROLLUP:对虚拟表VT5进行CUBE或者ROLLUP操作,产生虚拟表VT6;
    7. HAVING :对虚拟表VT6进行 HAVING 条件过滤,只有符合的记录才会被插入到虚拟表VT7中;
    8. SELECT :执行SELECT操作,选择指定的列,插入到虚拟表VT8中;
    9. DISTINCT :对虚拟表VT8中的记录进行去重,产生虚拟表VT9;
    10. ORDER BY :将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10;
    11. LIMIT :取出指定行的记录,产生虚拟表VT11,并将结果返回。
    展开全文
  • mysql 关键字执行顺序

    2019-10-30 15:50:58
    今天写sql语句的时候,先使用的select 查询数据,但是查询的数据中有不是当前表字段的字段;...后来知道sql的执行顺序mysql)是这样的; from -> join--> on --> where -->groupby --> with --&g...
  • FROM, including JOINs WHERE GROUP BY HAVING WINDOW functions SELECT DISTINCT UNION ORDER BY LIMIT and OFFSE 【源:谷歌】
  • 一、关键字执行顺序1、查询中用到的关键词主要包含六个,并且他们的顺序依次为 :select--from--where--group by--having--order by 其中select和from是必须的,其他关键词是可选的。这六个关键词的执行顺序,与sql...
  • MySQL关键字执行顺序

    2019-09-16 20:00:56
    1)Mysql语法顺序,即当sql中存在下面的关键字时,它们要保持这样的顺序: select[distinct] ...2)Mysql执行顺序,即在执行时sql按照下面的顺序进行执行: from on join where group by having select...
  • Mysql 的SQL关键字执行顺序图解执行顺序详解:1. FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt12. ON: 对vt1表应用ON筛选器只有满足 join_condition 为真的行才被插入vt23. OUTER(JOIN):如果指定了 OUTER ...
  • MySQL查询语句各关键字执行顺序

    千次阅读 2018-08-20 21:21:50
    一、书写顺序和执行顺序 书写sql语句时各关键字的顺序: select from where group by having order by 执行顺序: from where group by having select order by 二、实例分析 SELECT lord 主公ID,...
  • MySQL查询语句关键字执行的优先级问题

    多人点赞 热门讨论 2022-04-20 20:56:22
    查询语句关键字执行顺序问题
  • SQL各个关键字执行顺序: (8)SELECT(9)DISTINCT <select_list> (1)FROM <left_table> (3)<join_type> JOIN <right_table> (2)ON <join_condition> (4)WHERE <where_...
  • 查询中用到的关键词...其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行from--where--group by--having--select--order by, f...
  • mysql数据库各关键字执行顺序

    千次阅读 2018-10-22 21:55:17
    在SQL语句中每个关键字都会按照顺序往下执行,而每一步操作,会生成一个虚拟表,最后的虚拟表就是最终结果。 基本sql 语句如下 : (8)SELECT (9)DISTINCT &lt;select_list&gt; (1)FROM &lt;left_table...
  • SQL关键字执行顺序

    2020-04-21 21:05:02
    Mysql 的SQL关键字执行顺序 对于很长SQL的语句,我们要知道SQL关键字的执行顺序,从而能够更好的理解。 图中非常清晰描述了SQL关键字的过程。 图解 执行顺序详解: FROM:对FROM子句中前两个表执行笛卡尔积生成...
  • Mysql 常见关键字使用顺序

    千次阅读 2019-03-13 09:43:11
    MySQL 关键字执行顺序 ( 8 ) SELECT ( 9 ) DISTINCT < select_list > ( 1 ) FROM < left_table > ( 3 ) < join_type > JOIN < right_table > ( 2 ) ON < join_condition > ( 4 ) WHERE ...
  • 在hive SQL中 select 不能控制group by 和 having 聚合函数的条件;而MySQL却可以。 其书写顺序执行顺序如下:
  • SQL关键字执行顺序

    万次阅读 多人点赞 2018-04-23 15:36:54
    纸上得来终觉浅1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西? 在开发中涉及到数据库,基本上...学习下面几点:1)Mysql执行顺序,这个是写sql的核心,之前遇到的一些错误就是因为对其不了解;2)如何...
  • 执行顺序依次为 where > group by > having > order by
  • 如下所示: from 表 where 条件 group by 字段 形成虚拟的表及字段,聚合及字段添加 having 筛选数据 distinct 去重 order by 字段 asc,desc limit 限制条数 ...补充知识:mysql where条件and的执行顺序从左到

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,734
精华内容 31,893
关键字:

mysql关键字执行顺序

mysql 订阅