精华内容
下载资源
问答
  • 2018-08-12 03:40:57

    MySQL的语句执行顺序

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

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

    1. FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
    2. ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。(即内连接查询,完全匹配)
    3. JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, 如果from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
    4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
    5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
    6. CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
    7. HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
    8. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
    9. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
    10. ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
    11. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

    总结:优先进行筛选条件join-condition和where-condition,然后对返回的列字段进行筛选,最后对返回数据进行排序并限制返回的条数。

    更多相关内容
  • 无论什么语言,不管什么框架,在这个大数据的时代,最终都会和数据库打...今天我们一起讨论一下mysql查询语句执行顺序,这对项目开发中编写sql语句非常重要,知道sql语句里各个关键字的作用,从此写sql不是问题!!!

    推荐好文:
    2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计

    使用高并发利器redis—解决淘宝/微博的【热门搜索】和【最近搜索】的功能

    SpringCloud核心组件概述(五大神兽)

    1. 前言

    无论什么语言,不管什么框架,在这个大数据的时代,最终都会和数据库打交道,所以对于数据库的深入了解显得尤为重要。
    今天我们一起讨论一下mysql查询语句的执行顺序,这对项目开发中编写sql语句非常重要,知道sql语句里各个关键字的作用,从此写sql不是问题!!!

    2. sql语句的查询格式

    Select [distinct] 字段名,[fun(字段名)] from 表1 [<join类型>join 表2 on <join条件> where <where条件> group by <字段> with having <having条件> order by <排序字段> limit <起始偏移量,行数>]
    注:[]表示可选,没有在语句中指定某一个子句,那么将会跳过相应的步骤。
    fun表示聚合函数,例如最大值max(),最小值min(),平均值avg(),计数count(),求和sum()

    3. sql语句的执行顺序

    (9)Select
    (10)distinct 字段名1,字段名2,
    (7)[fun(字段名)]  
    (1)from 表1
    (3)<join类型>join 表2 
    (2)on <join条件> 
    (4)where <where条件> 
    (5)group by <字段> 
    (6)with <cube|rollup> 
    (8)having <having条件> 
    (11)order by <排序字段> 
    (12)limit <起始偏移量,行数>
    

    4. 各个关键字的含义

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

    2.ON:
    对虚表1进行ON筛选,只有那些符合<join条件>的行才会被记录在虚表2中。

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

    ①left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
    ②right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
    ③inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
    ④full join:全连接,返回两个表中的并集,left join + right join。
    ⑤cross join:结果是笛卡尔积,就是第一个表的行数与第二个表的行数相乘,
    结果集中的每一行都是第一个表中的行与第二个表中的行的组合,结果集列是两个表列数相加。
    

    特别注意:

    ①在使用left join时,on和where条件的区别如下:
    1、 on条件是在生成临时表前使用的条件,它不管on中的条件是否为真,都会返回左边表中所有的记录,但是这里注意右表的数据,如果on中对右表的条件是false的数据,在生成临时表中右表的数据将显示为null。
    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义了,
    左边表的记录条件不为真的就全部被过滤掉了。
    ②在使用 inner join 时,不管是对左表还是右表进行筛选,on and和on where都会对生成的临时表进行过滤
    ③当使用 left join 时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,
    两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null
    ④当使用 right join 时,on与where类似,只不过是全部返回右表的所有记录
    ⑤当使用 inner join 时,on与where完全相同
    

    4.WHERE
    对虚拟表3进行WHERE条件过滤。只有符合<where条件>的记录才会被插入到虚拟表4中。
    ①where后面的条件可以用>、<、>=、<=、!=等多种比较运算符,多个条件之间可以用or、and等逻辑运算符

    5.GROUP BY:
    按照某个字段进行分组
    ①开始使用select中的别名,后面的语句中都可以使用
    ②根据group by子句中的列,对虚拟表4中的记录进行分组操作,产生虚拟表5.
    ③group by关键字 表示要进行分类聚合的字段。比如要按照部门分类统计员工数量,部门就应该写在group by 后面。

    6.CUBE | ROLLUP:
    对虚拟表5进行cube或者rollup操作,产生表虚拟表6.
    ①with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总

    7.fun:
    聚合函数:最大值max(),最小值min(),平均值avg(),计数count(),求和sum()插入到虚拟表6
    聚合函数无法用在where子句中

    8.HAVING
    having 关键字表示对group by分组之后的(求和,平均值等)结果再进行条件过滤。
    对虚拟表6应用having过滤,只有符合<having条件>的记录才会被 插入到虚拟表7中。

    注意:

    on、where、having的区别
    on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。
    on是在生成中间的临时表时起作用的,where,having是生成临时表之后对连接表再进行过滤
    on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的
    where也应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。
    

    9.SELECT
    执行select操作,选择指定的列,插入到虚拟表8中。

    10.DISTINCT
    对虚拟表8中的记录进行去重。产生虚拟表9.
    ①.distinct必须放在最开头
    ②.distinct只能使用需要去重的字段进行操作。 ----也就是说我sidtinct了name,age两个字段,我后面想根据id进行排序,是不可以的,因为只能name,age两个字段进行操作.
    ③.distinct去重多个字段时,含义是:几个字段 同时重复 时才会被 过滤。

    11.ORDER BY:
    将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表10.
    ①.desc 降序排列,asc 升序排列
    ②.order by 后面可以跟多个不同的排序字段,每个排序字段都可以有不同的排序顺序。
    ③.如果排序字段的值一样,则相同的字段按照第二个排序字段进行排序。
    ④.如果只有一个排序字段,则字段相同的记录将会无序排列。

    12.LIMIT
    取出指定行的记录,产生虚拟表11, 并将结果返回。
    默认情况下,起始偏移量为0,只写记录行数就可以。

    5. 子查询的执行顺序

    子查询分为相关子查询非相关子查询

    1. 非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询,并且它是优先于外部查询先执行的,他执行了再执行外部。
    2. 先执行主查询,再针对主查询返回的每一行数据执行子查询,如果子查询能够返回行,则这条记录就保留,否则就不保留。说白了也就是子查询根据主查询的结果进行遍历并过滤。

    6. 分组后每组显示前几条数据

    1. 表结构:
      在这里插入图片描述
    2. 表数据:
      在这里插入图片描述
    3. 求:查询每门课程的成绩位居前2名的学生,怎么解?
    	SELECT a.*
    	FROM t_grade a
    	WHERE (
    	    SELECT COUNT(1)
    	    FROM t_grade b
    	    WHERE b.grade <= a.grade AND b.class_id = a.class_id
    	    ) <= 2
    	ORDER BY a.class_id;
    
    1. 结果如下:
      在这里插入图片描述
    2. sql分析:
      (1)要查询出每门课程的成绩位居前2名的学生,可以转换成:算出比每一个学生成绩高的学生数量
      比如,有一名学生A,比他成绩高的学生数量是1个(B学生),那么B学生就是第一名,就没其它人成绩比B学生更好。
      比如,有一名学生A,比他成绩高的学生数量是2个(B学生和C学生),那么B学生和C学生就是前两名。
      因此,where语句可以理解为,把表中的每一行记录,都去与给定的where条件作对比,满足的再查出来。也就是主查询遍历所有的学生成绩,子查询根据主查询的class_id当作条件,并且找出要比每一学生成绩高的学生数量,如果要找出成绩位居前2名的学生,那么子查询就比较比每一个学生成绩高的学生数量<=2的条件。
      (2)要查询出每门课程的成绩倒数后2名的学生,就是找出要比每一学生成绩低的学生数量
    	SELECT a.*
    	FROM t_grade a
    	WHERE (
    	    SELECT COUNT(1)
    	    FROM t_grade b
    	    WHERE b.grade >= a.grade AND b.class_id = a.class_id
    	    ) <= 2
    	ORDER BY a.class_id;
    

    推荐好文:
    2.3万字讲解设计模式
    netty搭建websocket实现服务器主动推送
    优雅的消除代码中的if else通过公司代码审核

    如果看到这里,说明你喜欢这篇文章,请转发,点赞。关注微信公众号微信搜索[老板来一杯java]回复[进群]或者扫描下方二维码即可进入无广告交流群!回复[java]即可获取java基础经典面试一份!

    展开全文
  • 目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 一、sql执行顺序 (1)from ...
  • 一、sql语句执行顺序 1.sql语句执行顺序 (7)select (8)distinct 字段名1,字段名2... (5)[fun 字段名] (1)from 表名 (2)inner|left|right|full|cross join on 连接条件 (3)where 筛选条件 (4)group by 分组条件...

    一、sql语句的执行顺序

    1.sql语句的执行顺序

    (7)select 
    (8)distinct 字段名1,字段名2...
    (5)[fun 字段名]
    (1)from 表名
    (2)inner|left|right|full|cross join on 连接条件
    (3)where 筛选条件
    (4)group by 分组条件
    (6)having 分组后的筛选条件
    (9)order by 排序条件
    (10)limit <起始偏移量,条目数>
    

    2.各个关键字的含义

    2.1 from

    from后面是表名,可以是从表或主表

    2.2 on

    on后面跟的是表和表之间的连接条件

    2.3 join

    • left 【outer】 join :左外连接,后面跟的是从表
    • right 【outer】join:右外连接,后面跟的是主表
    • full 【outer】join:全外连接,返回的结果是left join + right join
    • 【inner】join 内连接:一般inner省略不写,取两连接表的交集
    • cross join:结果是笛卡尔乘积

    2.4 where

    where后面跟筛选条件,条件运算符可以为 > < >= <= <>(不等于) between and,多个筛选条件可以用or 或者 and连接。

    2.5 group by

    group by后面跟分组条件,比如分组之后求出每一个组的最大值(max)、最小值(min)、平均值(avg)、每个组的个数(count)。

    2.6 having

    having后面跟的也是筛选条件,但是having和where不同点为:having是对分过组之后的虚拟表在进行过滤筛选,而where是在分组之前筛选。

    2.7 select

    select 后面跟要查询的列。

    2.8 distinct

    • distinct 后跟查询字段,必须放在查询字段的开头
    • distinct不会过滤掉null值,返回结果包含null值
    • distinct和聚簇函数使用:SELECT COUNT(distinct 字段名)from 表名,这个查询语句则会过滤掉null项。

    2.9 order by

    • order by 后跟排序字段名,一般是数值类的字段名
    • asc 升序排序,desc 降序排序,如果不显示写asc或desc,则默认为升序
    • order by后可以跟多个不同的排序字段,每个字段都可以有自己的排序方式,先按第一个字段排序、当第一个字段比较结果相等时,按第二个字段排序,以此类推

    2.10 limit

    limit offset,size;

    公式:
    要显示的页数是page,每一页的条目(item)数是size

    select 查询列表
    from 表名
    limit (page-1)*size,size;
    
    size=10
    page      起始索引
    1           0
    2           10
    3           20
    

    #案例1:查询前5条员工的信息
    SELECT *
    FROM employees
    LIMIT 0,5;

    #案例2:查询第11条~第25条
    SELECT *
    FROM employees
    LIMIT 10,15;

    #案例3:有奖金的员工信息,并且工资较高的前10名显示出来
    SELECT *
    FROM employees
    WHERE commission_pct IS NOT NULL
    ORDER BY salary DESC
    LIMIT 10;

    二、rank() over,dense_rank() over,row_number() over的区别

    注意:MySQL8.0才能运行下述三个内置函数!

    1.DENSE_RANK() OVER

    • dense_rank() over :当两名同学的成绩相等时,下一位同学并不空出所占的名次

    首先创建一个表:Scores:表中有两个字段id(int)、score(double)

    SELECT Score, DENSE_RANK() OVER (ORDER BY Score DESC ) AS 'Rank'
    FROM Scores;
    

    结果如图1:

    在这里插入图片描述
    图1:DENSE_RANK() OVER的结果

    2.RANK() OVER

    • rank() over:和dense_rank() over不同的是,下一位同学空出所占的名词
    SELECT Score, RANK() OVER(ORDER BY Score DESC) AS 'Rank'
    FROM Scores;
    

    结果如图2:
    在这里插入图片描述

    ​ 图2:RANK() OVER的结果

    3.3.row_number() over

    • 这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名
    SELECT Score, row_number() over(ORDER BY Score DESC) AS 'Rank'
    FROM Scores;
    

    结果如图3:

    在这里插入图片描述

    ​ 图3:row_number() over的结果

    展开全文
  • MySQL语句执行顺序

    2017-12-07 16:32:34
    MySQL语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是...


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

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

    1. FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
    2. ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
    3. JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。
    4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
    5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
    6. CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
    7. HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
    8. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
    9. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
    10. ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
    11. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。
    展开全文
  • MySQL 查询执行顺序

    2021-05-29 16:40:24
    目录前言一、SQL查询执行顺序二、具体步骤执行顺序简介1、执行FROM语句2、执行ON过滤3、添加外部行(外联结)4、执行WHERE过滤5、执行GROUP BY分组6、执行HAVING过滤7、SELECT列表8、执行DISTINCT子句9、执行ORDER ...
  • MySQL语句执行顺序

    千次阅读 2022-01-10 11:14:42
    语句中各子句完整执行顺序概括(按照顺序号执行): 每个子句执行顺序分析 语句中各子句完整执行顺序概括(按照顺序号执行): from (注:这里也包括from中的子语句) join on where group by(开始使用select中...
  • 关于sql和MySQL语句执行顺序(必看)

    万次阅读 多人点赞 2016-03-29 12:15:09
    目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 一、sql执行顺序 (1)from (3)...
  • Mysql 语句执行顺序

    千次阅读 2022-01-19 15:46:31
    一、Mysql 语法顺序 ...二、Mysql执行顺序 from on join where group by having select distinct union order by 注: 1)使用distinct要写在所有要查询字段的前面,后面有几个字段,就代表
  • MySQL查询语句关键字执行的优先级问题

    多人点赞 热门讨论 2022-04-20 20:56:22
    查询语句关键字执行顺序问题
  • 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 的 SQL 语句执行顺序 from join on where group by (可以使用 select 中的别名,后面的语句中都可以使用) count、sum、svg… having select distinct limit 1、确定范围:确定查询范围,过滤不想要...
  • select语句完整语法: SELECT DISTINCT <select_list> FROM <join> JOIN ON WHERE GROUP BY HAVING ORDER BY ...执行顺序: from →join →on →where →group by→having→select→order
  • mysql语句的书写顺序和执行顺序有很大差异。 书写顺序,mysql的一般书写顺写为: select <要返回的数据列> from <表名> <join> join on where group by <分组条件> having <分组后的筛选条件> ...
  • MySQL,SQL语句执行顺序

    千次阅读 2021-01-19 16:30:59
    1.SQL执行顺序:select 考生姓名, max(总成绩) asmax总成绩fromtb_Gradewhere 考生姓名 is not nullgroup by考生姓名having max(总成绩) > 600order by max总成绩(1). 首先执行 FROM 子句, 从 tb_Grade 表组装...
  • 1. 子查询 MySQL 的子查询比较多,但是一般...2. 查询语句的书写与执行顺序 前面我们学到查询语句可以通过不同的子句来筛选相应的数据,那么当它们出现在一个 SQL 语句中时,应该遵循什么书写顺序呢?应该遵循下面的
  • 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览: 架构最好看图,再配上必要的说明文字。 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解。   从...
  • MySQL查询语句语法虽然是描述性语言,但是在使用的时候,我发现如果语句书写顺序不正确的话,还是很容易发生报错的,如果您已经学了查询语句的概念,但是写代码的时候有些模糊,那我后面写的可能会对您有所帮助!...
  • MySQL中SQL语句执行顺序

    千次阅读 2018-06-15 12:46:44
    【1】SQL执行语法顺序 --查询组合字段 (5)select (5-2) distinct(5-3) top(&lt;top_specification&gt;)(5-1)&lt;select_list&gt; --连表 (1)from (1-J)&lt;left_table&gt;&lt;join_...
  • 主要给大家介绍了SQL语句执行的相关内容,文中一步步给大家深入的讲解,包括MySQL架构总览->查询执行流程->SQL解析顺序,需要的朋友可以参考下
  • 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* select中文意思为选择,即为从表中选择处列以显示(输出),用法如下 SELECT [列名],[列名],[列名] SELECT后必跟着要...
  • 在解释这条语句执行流程之前,我们看看mysql的基础架构。 图来自极客时间的mysql实践,该图是描述的是MySQL的逻辑架构。 server层包括连接器、查询缓存、分析器、优化器、执行器涵盖 MySQL 的大多数核心服务功能,...
  • Mysql----SQL查询语句执行顺序

    千次阅读 2016-08-22 16:17:17
    SQL查询语句执行顺序
  • Mysql查询语句执行过程及运行原理

    万次阅读 多人点赞 2018-10-22 22:36:21
    Mysql查询语句执行原理 数据库查询语句如何执行? DML语句首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树。 语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是否具有操作...
  • MySQL查询语句执行顺序WHERE、JOIN等

    千次阅读 2018-12-12 23:36:37
    执行顺序 from join on where group by (从此处开始可以使用select中指定的别名) avg、sum、max having select distinct order by 举例 select sum(goods.number) from order left join goods on goods.order_id ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 176,580
精华内容 70,632
关键字:

mysql查询语句执行顺序

mysql 订阅
友情链接: PHP入门到精通.zip