事实上,正是子查询的创新让人们产生了将早期 SQL 称为“结构化查询语言”的最初想法。 3.分类 根据子查询的结果可以将其分为多种类型。...此外,JSON_TABLE() 函数会生成一个表,提供了另一种创建派生表的方法: SELECT * FROM JSON_TABLE(arg_list) [AS] tbl_name ... 4.关联子查询...6.横向派生表 对于派生表而言,它必须能够单独运行,而不能依赖其他表。...从 MySQL 8.0.14 开始,派生表支持 LATERAL 关键字前缀,表示允许派生表引用它所在的 FROM 子句中的其他表。...再给每个部门员工按照工资排序并编上部门内部排名 rn 后,将结果作为派生表 t,通过 SELECT 查询出所有部门内薪资排名第一的员工。 最后和部门表连表查询出每个部门内月薪最高的员工。
事实上,正是子查询的创新让人们产生了将早期 SQL 称为“结构化查询语言”的最初想法。 3.分类 根据子查询的结果可以将其分为多种类型。...JSON_TABLE() 函数生成一个表,并提供另一种创建派生表的方法: SELECT * FROM JSON_TABLE(arg_list) [AS] tbl_name ......6.横向派生表 对于派生表而言,它必须能够单独运行,而不能依赖其他表。...从 MySQL 8.0.14 开始,派生表支持 LATERAL 关键字前缀,表示允许派生表引用它所在的 FROM 子句中的其他表。...再给每个部门员工按照工资排序并编上部门内部排名 rn 后,将结果作为派生表 t,通过 SELECT 查询出所有部门内薪资排名第一的员工。 最后和部门表连表查询出每个部门内月薪最高的员工。
,对表的权限管理并不能限制到某个行某个列,但是通过视图可以简单实现 数据独立: 一旦视图的结果确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,...---- 临时表原理 什么是临时表:MySQL用于存储一些中间结果集的表,临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。...,从mysql5.7.6之后默认为innodb存储引擎,之前版本默认为myisam存储引擎)。...,以下类型的视图是不可更新的 包含以下关键字的SQL语句: 聚合函数(SUM,MIN,MAX,COUNT等),DISTINCT。...---- 删除视图 前提拥有删除该视图的DROP权限 drop view v1,v2,v3... ---- 查看视图 show tables命令从mysql 5.1开始,会显示表和视图,不存在单独的show
,越先被执行 3、id相同和不同的,同时存在:相同的可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行 mysql将select查询分为简单和复杂类型,复杂类型可以分成3大类...UNION结果总是放在一个匿名临时表中,之后mysql将结果读取到临时表中。临时表并不在原sql中出现,因此它的id列是null。...通常意味着mysql将扫描整张表,从头到尾,去找到需要的行。 index 这个跟全表扫描一样,只是mysql扫描表时按索引次序进行而不是行。...举例来说,如果你通过将某一行的主键放入where子句里的方式来选取此行的主键,mysql就能把这个查询转换为一个常量。...NULL 这中访问方式意味着mysql能在优化阶段分解查询语句,在执行阶段甚至不用再访问表或者索引,例如,从一个索引列里选取最小值可以通过单独查找索引来完成,不需要在执行时访问表。
剔除字段值重复的条数 注意: 1)当使用组函数的select语句中没有group by子句时,中间结果集中的所有行自动形成一组,然后计算组函数; 2)组函数不允许嵌套,例如:count(max(...4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...规则: ①出现在SELECT子句中的单独的列,必须出现在GROUP BY子句中作为分组列 ②分组列可以不出现在SELECT子句中 ③分组列可出现在SELECT子句中的一个复合表达式中 ...我们可以将group by操作想象成如下的一个过程:首先系统根据select语句得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。...+---------+----------+ 1)HAVING可以单独使用而不和GROUP BY配合,如果只有HAVING子句而没有GROUP BY,表中所有的行分为一组 2)HAVING子句中可以使用组函数
剔除字段值重复的条数 注意: 1)当使用组函数的select语句中没有group by子句时,中间结果集中的所有行自动形成一组,然后计算组函数; 2)组函数不允许嵌套,例如:count(max(...[where 查询条件] [group by 字段名] [having 过滤条件] 1、group by子句 根据给定列或者表达式的每一个不同的值将表中的行分成不同的组,使用组函数返回每一组的统计信息...规则: ①出现在SELECT子句中的单独的列,必须出现在GROUP BY子句中作为分组列 ②分组列可以不出现在SELECT子句中 ③分组列可出现在SELECT子句中的一个复合表达式中 ...我们可以将group by操作想象成如下的一个过程:首先系统根据select语句得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。...+---------+----------+ 1)HAVING可以单独使用而不和GROUP BY配合,如果只有HAVING子句而没有GROUP BY,表中所有的行分为一组 2)HAVING子句中可以使用组函数
EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。...subquery的查询要受到外部表查询的影响 derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌select table列 显示的查询表名,如果查询使用了别名,...,返回匹配某个单独值的所有行。...Ref列: 如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为...字段上增加函数,则字段上的索引用不了,需考虑改变写法 去掉不影响查询结果的表 慢查询日志 开启慢查询日志,分日里面执行时间很长语句 , 可以针对性的对常用语句进行建立索引 开启方法my.cnf
,主要用于地理空间数据类型,通常使用较少 Full-text:全文索引也是MyISAM的一个特殊索引,主要用于全文索引,InnoDb从MySql5.6开始提供支持全文索引 MySql目前不支持函数索引,...面试回答数据库优化问题从以下几个层面入手 (1)、根据服务层面:配置mysql性能优化参数; (2)、从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。...,同时在应用操作时也浪费物理内存mysql,可以使用函数procedure analyse对当前的表进行分析 //输出的每一类信息都对数据表中的列的数据类型提出优化建议。...好的索引和其他方法经常能够解决性能问题,而不必采用反规范这种方法 采用的反规范化技术 增加冗余列:指在多个表中具有相同的列,它常用来在查询时避免连接操作 增加派生列:指增加的列来自其他表中的数据,由其他表中的数据经过计算生成...增加的派生列其他作业是在查询时减少连接操作,避免使用集函数 重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表查询组成一个表来减少连接而提高性能 分割表 维护数据的完整性 批处理维护是指对复制列或派生列的修改积累一定的时间后
,执行查询会返回执行计划的信息,而不是执行这条 SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 官网:https://dev.mysql.com/doc/refman/...将查询分为简单查询和复杂查询: 简单查询:就是单独的select语句,没有子查询这些 复杂查询: 简单子查询 派生表(在from中的子查询) UNION查询 1、简单查询 explain select...'derived_merge=on'; #还原默认配置 我们看结果,发现id为1的这行数据有一个tablederived3是没有的数据库表,这个表是派生表,相当于临时表,3代表的是从id为3的数据那生成的...例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表 为空的情况: 选取最小值或最大值值 查询中where语句永远不会为真 从字面上返回值的查询 explain select min...哪些列或常量被用于查找索引列上的值, 如果ref是一个函数,则使用的值是函数的结果。要想查看是哪个函数,可在EXPLAIN语句之后紧跟一个SHOW WARNING语句。
EXPLAIN命令是查看查询优化器是如何决定执行查询的主要方法,从它的查询结果中可以知道一个SQL语句每一步是如何执行的,都经历了些什么,分为哪几步,有没有用到索引,哪些字段用到了什么样的索引,是否有一些可优化的地方等...否则,内层的SELECT语句一般会顺序编号。 id列分为三种情况: 1)id相同 如下普通查询,没有子查询。...,MySQL会递归执行并将结果放到一个临时表中,称其为“派生表”,因为该临时表是从子查询中派生而来的。...如果将主键置于where列表中,mysql就能将该查询转换为一个const。...SQL如何使用索引 复杂SQL的执行顺序 查询扫描的数据函数 …… 当面临不够优的SQL时,我们首先要查看其执行计划,根据执行计划结果来分析可能存在哪些问题,从而帮助、指导我们是否添加索引、是否调整SQL
4 | +---------------+ ③count(distinct 列):返回列值非空的、并且列值不重复的行的数量 mysql> select count(distinct salary) from...[where 查询条件] [group by 字段名] [having 过滤条件] 1、group by子句 根据给定列或者表达式的每一个不同的值将表中的行分成不同的组,使用组函数返回每一组的统计信息...规则: ①出现在SELECT子句中的单独的列,必须出现在GROUP BY子句中作为分组列 ②分组列可以不出现在SELECT子句中 ③分组列可出现在SELECT子句中的一个复合表达式中 ...我们可以将group by操作想象成如下的一个过程:首先系统根据select语句得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。...+---------+----------+ 1)HAVING可以单独使用而不和GROUP BY配合,如果只有HAVING子句而没有GROUP BY,表中所有的行分为一组 2)HAVING子句中可以使用组函数
列表中的查询 derived 派生表 该临时表是从子查询派生出来的 等等 type:表示MySQL在表中查找数据的方式,或者叫访问类型,以下对于type取值的说明 从上往下性能由最差到最好...COUNT()是一个特殊的函数,有两种不同的作用,它可以统计某个列值的数量,也可以统计行数。 在统计列值的时候要求列值是非空的,也就是不统计null。 ...:MyiSAM的count()函数总是非常快。 ...那么mysql内部会将count(列)表达式优化为count(*)。 ...,它就会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集。
COUNT( )是一个特殊的函数,有两种不同的作用,它可以统计某个列值的数量,也可以统计行数。 在统计列值的时候要求列值是非空的,也就是不统计null。...:MyiSAM的count( )函数总是非常快。...那么mysql内部会将count(列)表达式优化为count(*)。...如果count(列)中的字段是索引的话,count(列)和count(*)一样快,否则count(列)走全表扫描。...,它就会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集。
select SUBQUERY 子查询中的第一个SELECT,结果不依赖于外部查询 DEPENDENT SUBQUERY 子查询中的第一个SELECT,依赖于外部查询 DERIVED 派生表的SELECT...如将主键置于where列表中,MySQL就能将该查询转换为一个常量。 system: 表中仅有一行,这是const联结类型的一个特例。平时不会出现,这个也可以忽略不计。...NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。 一般保证查询至少达到range级别,最好能达到ref。...而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成排序操作称为“文件排序” Using temporary 使用了临时表保存中间结果,mysql在查询结果排序时使用临时表。...注: EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况 EXPLAIN不考虑各种Cache EXPLAIN不能显示MySQL在执行查询时所作的优化工作 部分统计信息是估算的
5.GROUP BY 子句 GROUP BY 子句中的数据列应该是 SELECT 指定的数据列中的所有列,除非这列是用于聚合函数,如 SUM()、AVG()、COUNT()等。...但是,如果 SELECT 指定的数据列,没有用于聚合函数也不在 GROUP BY 子句中,按理说会报错,但是 MySQL 会选择第一条显示在结果集中。...如果希望按照降序排序,可以使用 DESC(descend)关键字,随机使用随机数函数RAND()。 在指定待排序的列时,不建议使用列位置(从1开始),因为该语法已从SQL标准中删除。...MySQL 规定,当非聚合函数中的列不存在于 GROUP BY 子句中,则选择每个分组的第一行。 (3)COUNT DISTINCT 统计符合条件的记录数量。...UNION 只能作用于 SELECT 结果集,不能直接作用于数据表,而 JOIN 则恰恰相反,只作用于数据表,不能直接作用于 SELECT 结果集(可以将 SELECT 结果集指定别名作为派生表)。
子查询 在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。 根据是否依赖外部查询,可将子查询分为自包含子查询和相关子查询。...或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效....所有列必须显式指定名称 所有列名必须唯一 表表达式分为:派生表、公用表表达式、视图三种类型。其中,派生表与公用表表达式只适用于单语句范围,即,只存在于当前查询语句中。视图则可以被多条查询语句复用。...因此,在视图中使用SELECT语句时尽可能显式的指定所需列,而不是使用SELECT *。...关于是否应该使用视图,仁者见仁,智者见智: 使用SQL Server视图的优缺点 为什么mysql中很少见到使用视图功能?
子查询 在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。 根据是否依赖外部查询,可将子查询分为自包含子查询和相关子查询。...子句在视图、内联函数、派生表、子查询和公用表表达式中无效....所有列必须显式指定名称 所有列名必须唯一 表表达式分为:派生表、公用表表达式、视图三种类型。其中,派生表与公用表表达式只适用于单语句范围,即,只存在于当前查询语句中。...因此,在视图中使用SELECT语句时尽可能显式的指定所需列,而不是使用SELECT *。...关于是否应该使用视图,仁者见仁,智者见智: 使用SQL Server视图的优缺点 为什么mysql中很少见到使用视图功能?
MySQL将 select 查询分为简单查询和复杂查询。复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。...(派生表的SELECT, FROM子句的子查询); (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)。...,例如从一个索引列里选取最小值可以通过单独索引查找完成。...Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤。...Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”,对结果使用一个外部索引排序,而不是按索引次序从表里读取行。
数据的读取可以分为两种:快照读和当前读。...因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。...(master)和从服务器(slaver),如图,其工作步骤主要分为三步: 首先主服务器(master)将对数据的操作都记录到二进制日志(binary log)中。...(派生表的SELECT, FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) Table:输出行所引用的表 表示MySQL...,例如从一个索引列里选取最小值可以通过单独索引查找完成。
explain 中的列 接下来我们将展示 explain 中每个列的信息。...MySQL将 select 查询分为简单查询(SIMPLE)和复杂查询(PRIMARY)。 复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。...MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义) 用这个例子来了解 primary、subquery 和 derived 类型 mysql> explain select...例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表 mysql> explain select min(id) from film; ?...Using filesort:mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。
领取专属 10元无门槛券
手把手带您无忧上云