另外提一点,对于大部分聚合函数,参数的类型和返回结果的类型一般是不同的,所以在展开聚合函数的时候一般会在参数列上构造 cast 函数做类型转换,展开后的表达式会保存在作为替换 LogicalAggregation...TiDB 会在 expressionRewriter 的逻辑中做两类操作: 子查询展开 即直接执行子查询获得结果,再利用这个结果改写原本包含子查询的表达式;比如上述的非相关子查询,如果其返回的结果为一行记录...LogicalApply 算子是一类特殊的 LogicalJoin ,特殊之处体现在执行逻辑上:对于 outer plan 返回的每一行记录,取出相关列的具体值传递给子查询,再执行根据子查询生成的 inner...当 `t1.pk` 满足唯一性后,每一行 outer plan 的记录都对应连接结果中的一个分组,所以其聚合结果会和在子查询中的聚合结果一致,这也解释了为什么聚合提升后需要按照 `t1.pk` 做分组。...这是为了在子查询中没有匹配的特殊情况下保证结果的正确性,以上面查询为例,当 `t2` 表没有任何记录满足 `t2.a = t1.pk` 时,子查询中不管是什么聚合函数都会返回 `null` 结果,为了保留这种特殊情况
子查询又分为相关和不相关子查询,如果子查询过滤条件里有外层查询的参数,则是相关子查询,反之则是不相关子查询。...key3 = s2.key3 LIMIT 1); 这种相关子查询也和我们前面想的一样: 外层获取一条记录,用于s2.key3的值。...写入的临时表而且会通过唯一索引去重,如果超过了tmp_table_size则会创建物理磁盘的临时表,索引类型也会变为b+树索引。...Table pullout(子查询中的表上拉) 当子查询的查询列表处只有主键和唯一索引的时候,直接上拉转换一下就好, SELECT * FROM s1 WHERE key2 IN (SELECT...aa,aa,aa,ab,ab,ab,bb,bb,bb,只需要在s1表中s1.key3 = ‘aa’,只需要取相同值第一个值的记录放入结果集,这种取值方式就是松散扫描。
(虽然没查,但怎么知道有多少数据呢,别忘了我们在查询之前计算成本会用到数据统计,但innoDB查询出来的不准确,是估值,所以这里一条只使用memory和myISAM) 使用主键等值匹配或者唯一二级索引等值匹配查询表...按返回的结果集区分子查询 因为子查询本身也是查询,可以吧子查询返回的不同数据分为不同的子查询类型。...IN (SELECT m2, n2 FROM t2); 按照外层关系来区分子查询 不相关子查询:如果子查询结果不依赖外层查询的值,就叫不相关子查询。...我们前面的都是不相关子查询。 相关子查询:如果依赖外层查询的值,就叫相关子查询。...FROM t1 WHERE EXISTS (SELECT 1 FROM t2); 对于子查询来说,我们并不关系子查询返回的结果集,我们关系的是子查询结果集是否存在记录,只要子查询有记录,那么整个表达式就是
number_of_subquery_evaluations 表示子查询的执行次数,因为对于主查询中满足 city_id 的每一条记录,相关子查询都要执行一次,所以,这个字段值等于 parent_fanouts.fanout...其中 0.1 是从主查询中读取一条记录之后,拿到 city_id 字段值,去临时表中查询记录的成本常数,可以通过以下 SQL 获取: SELECT cost_name, cost_value, default_value...8 如果执行子查询查到了记录,说明主查询记录满足 city_id 查询两个条件,把主查询记录返回给客户端,否则,回到步骤 1。...总结 本文主要介绍了以下内容: 不相关子查询转换为相关子查询之后,explain 结果中: 子查询 type 列的值 unique_subquery 是 eq_ref 的别名;index_subquery...子查询 ref 列的值会显示为 func,这是因为主查询 IN 条件字段和子查询 select 子句字段组成的新条件中,IN 条件字段引用了主查询表中的字段,而不是直接使用主查询表中的字段。
定义:主键–唯一标识一条记录,不能有重复的,不允许为空 外键–表的外键是另一表的主键,外键可以有重复的,可以是空值 索引–该字段没有重复值,但可以有一个空值 作用:主键–用来保证数据完整性 外键–用来和其他表建立联系用的...(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。 (2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。...因此非相关子查询比相关子查询效率高 char 和 varchar 的区别? char 是一种固定长度的类型,varchar 则是一种可变长度的类型。...区别: char (M) 类型的数据列里,每个值都占用 M 个字节,如果某个长度小于 M,MySQL 就会在它的右边用空格字符补足。(在检索操作中那些填补出来的空格字符将被去掉)。...varchar (M) 类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为 L+1 字节)。 Mysql 的存储引擎,myisam 和 innodb 的区别。
相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询。...EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。...相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。...然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。 Exists:若子查询的结果集非空时,返回“True”;若子查询的结果集为空时,返回“False” 。...NOT EXISTS :若子查询结果为空,返回“TRUE”值;若子查询的结果集非空时,返回 “FALSE。 嘿嘿嘿好理解多了吧!!!!!!!
子查询的记录都写入临时表之后,从主查询记录中拿到 sub_field 字段值,去临时表中查找,如果找到了记录,sub_field 字段条件结果为 true,否则为 false。...主查询的所有 where 条件都判断完成之后,如果每个 where 条件都成立,记录就会返回给客户端,否则继续读取下一条记录。...使用临时表存放子查询的结果,是为了提升整个 SQL 的执行效率。如果临时表中的记录数量很多,根据主查询字段值去临时表中查找记录的成本就会比较高。...所以,MySQL 还会为临时表中的字段创建索引,索引的作用有两个: 提升查询临时表的效率。 保证临时表中记录的唯一性,也就是说创建的索引是唯一索引。...由上所述,总结一下 MySQL 的优化逻辑: 对于包含子查询的 where 条件字段,如果连续几条记录的字段值都相同,这组记录中,只有第一条记录会根据 where 条件字段值去临时表中查找是否有对应记录
这意味着 Google BigQuery MERGE 命令可让您通过更新、插入和删除 Google BigQuery 表中的数据来合并 Google BigQuery 数据。...这是一个不好的例子,因为由于匹配的表后缀可能是动态确定的(基于表中的某些内容),因此您将需要为全表扫描付费。...以下查询返回在where子句中指定的交易类型 (is_gift) 每天的总信用支出,并且还显示每天的总支出以及所有可用日期的总支出。...它返回连续的排名值。您可以将其与分区一起使用,将结果划分为不同的存储桶。如果每个分区中的行具有相同的值,则它们将获得相同的排名。...,它有助于获取每行相对于该特定分区中的第一个/最后一个值的增量。
主键、外键和索引的区别 定义: 主键–唯一标识一条记录,不能有重复的,不允许为空 外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引–该字段没有重复值,但可以有一个空值...(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。 (2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。...因此非相关子查询比相关子查询效率高 15.char和varchar的区别? char是一种固定长度的类型,varchar则是一种可变长度的类型。...区别: char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足。(在检索操作中那些填补出来的空格字符将被去掉)。...varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。 16.Mysql 的存储引擎,myisam和innodb的区别。
: Property Value 参数值 semiJoinToInThreshold 是否可见 否 参数说明 基于semi-join类型的相关子查询可以转换为IN类型的非相关子查询的场景下,若同时满足内查询没有其他...-- 如果semi-join类型的相关子查询可以转换为IN类型的非相关子查询,如果内查询没有其他where条件,且缓存的内表行数大于参数值时,不对其进行转换 --> 参数作用: 基于semi-join类型的相关子查询可以转换为...IN类型的非相关子查询的场景下,若同时满足内查询没有其他where条件,且缓存的内表行数大于该参数值时,不对其进行转换 serverId 参数说明: Property Value 参数值 serverId...是否可见 是 参数说明 集群节点编号1-N(节点数),集群内唯一 默认值 1 Reload是否生效 否 参数设置: server.xml中serverId参数如下配置: 唯一 --> 参数作用: 用来区分集群里不同计算节点的ID值,该参数设置需从1开始连续且不重复,若设置重复会导致集群启动异常。
【重学 MySQL】四十四、相关子查询 在 MySQL 中,相关子查询(也称为相关子查询或关联子查询)是一种特殊类型的子查询,其执行依赖于外部查询的当前行值。...这意味着相关子查询在外部查询的每一行上都会重新执行一次,并且可以使用外部查询的列值。 相关子查询执行流程 相关子查询的执行流程涉及多个步骤,并且这些步骤在数据库管理系统(DBMS)中是高度优化的。...在外部查询的每一行处理过程中,都会涉及到相关子查询的执行。 执行相关子查询: 对于外部查询中的每一行,DBMS都会执行一次相关子查询。 相关子查询依赖于外部查询的当前行值。...使用相关子查询进行计算 假设我们有一个表 sales,其中包含每个销售员的销售记录。我们想要计算每个销售员的销售总额,并找出销售额超过该销售员平均销售额的记录。...在 select,from,where,having,order by 中使用相关子查询举例 在SQL查询中,相关子查询(也称为相关子选择或相关嵌套查询)是指依赖于外部查询中的值的子查询。
key2 ; 连接查询的执行计划中,出现在前边的表表示驱动表,出现在后边的表表示被驱动表 ---- id 查询语句中每出现一个SELECT关键字,设计MySQL的大叔就会为它分配一个唯一的id值...对于包含子查询的查询语句来说,就可能涉及多个SELECT关键字,所以在包含子查询的查询语句的执行计划中,每个SELECT关键字都会对应一个唯一的id值: explain select * from s1...临时表也是表,只要为表中记录的所有列建立主键或者唯一索引就好了 跟UNION对比起来,UNION ALL就不需要为最终的结果集进行去重,它只是单纯的把多个查询的结果集中的记录合并成一个并返回给用户,所以也就不需要使用临时表...如果子查询不依赖外层查询的值,那么该子查询为不相关子查询,否则为相关子查询。...类似,只不过访问子查询中的表时使用的是普通的索引 这里针对的是子查询返回的列是唯一索引还是普通索引 range : 如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法 index
3 Select子查询的深度解析子查询是嵌套在另一个查询中的查询,也称为内部查询或内查询。MySQL支持多种类型的子查询,每种类型有不同的适用场景和执行特性。...3.1 子查询的分类与语法根据子查询在外部查询中出现的位置和返回的结果类型,子查询可分为三类:WHERE型子查询这类子查询出现在外部查询的WHERE条件中,通常用于进一步的过滤条件。...使用ANY时,表示比子查询返回的任意一个值满足条件即可;使用ALL时,表示需要比子查询返回的所有值都满足条件。FROM型子查询这类子查询出现在FROM子句中,作为派生表使用。...MySQL支持的常见索引类型包括:普通索引:最基本的索引,没有任何限制唯一索引:要求索引列值必须唯一,允许有空值主键索引:特殊的唯一索引,不允许有空值复合索引:包含多个列的索引全文索引:用于全文搜索,适用于文本内容搜索...,提高查询效率:使用最小可能的数据类型(如INT而不是BIGINT,如果值范围允许)使用整型而非字符串类型作为标识符避免使用TEXT/BLOB类型,除非必要使用固定长度的CHAR类型仅当所有值长度相近时规范化与反规范化的平衡数据库规范化减少了数据冗余
18.所有不同类型的索引是什么? 索引有三种类型 1.唯一索引:唯一索引通过确保表中没有两行数据具有相同的键值来帮助维护数据完整性。定义主键时,可以自动应用唯一索引。...数据库查询可以是选择查询或动作查询。 24.什么是子查询? 子查询是另一个查询中的SQL查询。它是Select语句的子集, 其返回值用于过滤主查询的条件。 25.子查询的类型是什么?...子查询有两种类型: 1.关联的:在SQL数据库查询中,关联的子查询是使用外部查询中的值来完成的子查询。因为相关子查询要求首先执行外部查询,所以相关子查询必须为外部查询中的每一行运行一次。...临时表是用于临时存储数据的临时存储结构。 30.如何避免查询中重复记录? SQL SELECT DISTINCT查询仅用于返回唯一值。它消除了所有重复的值。...让我们看一下重要的SQL查询以进行面试 76.如何从表中获取唯一记录?
SELECT user_id FROM orders)是一个子查询,它首先执行并返回所有下过订单的用户ID,然后外层查询根据这些ID从用户表中筛选出对应的用户记录。...子查询类型详解:从标量子查询到相关子查询 在MySQL中,子查询可以根据返回结果的形式和使用方式分为多种类型,主要包括标量子查询、列子查询、行子查询和相关子查询。...标量子查询 标量子查询是最常见的子查询类型之一,它返回单个值,通常用于比较操作或作为表达式的一部分。...限制在于,行子查询必须返回单行,否则会导致错误,且语法较为复杂,可能影响可读性。 相关子查询 相关子查询是一种特殊类型,其执行依赖于外部查询的每一行数据。...外部查询:根据子查询返回的用户ID列表,从users表中筛选出这些用户的详细信息。 结果分析:该查询会返回所有在2025年有过大额订单的用户记录。
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。...主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。...SQL语句中‘相关子查询’与‘非相关子查询’有什么区别? 答:子查询:嵌套在其他查询中的查询称之。 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。...所有的子查询可以分为两类,即相关子查询和非相关子查询 (1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。...(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).
大家好,又见面了,我是你们的朋友全栈君。 1.简介 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。...相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询 EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True...:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。...然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。 EXISTS语句不关心子查询的具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。...NOT EXISTS :若子查询结果为空,返回“TRUE”值;若子查询的结果集非空时,返回 “FALSE。
关键字(key):能唯一标识文件中每条记录的字段或字段集,称为记录的关键字,或者简称为键。...审计功能是一种监视措施,它把用户对数据库的所有操作自动记录下来,存入审计日志中 记录的内容一般包括:操作类型(查询、插入、更新、删除),操作终端标识与操作者标识,操作日期和时间,操作所涉及的相关数据,...2、不相关子查询:不相关子查询的处理一次完成,执行后传递给外部查询。 二、依赖不同 1、相关子查询:相关子查询中的查询条件取决于外部查询中的值。...2、不相关子查询:无关子查询是独立于外部查询的子查询,不依赖于外部查询中的值。 三、效率不同 1、相关子查询:相关子查询可以嵌套在多个层中,但嵌套层越多,效率越低。...如果记录中操作是插入操作,则对其执行删除操作;如果记录中操作是删除操作,则对其执行插入操作;如果记录中操作是修改操作,则用修改前的值代替修改后的值。
大家好,又见面了,我是你们的朋友全栈君。 1、简介 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询。...带Exists的子查询就是相关子查询 Exists表示存在量词:带有Exists的子查询不返回任何记录的数据,只返回逻辑值“True”或“False” 2、表结构 选课表:学号StudentNo、课程号...:先在外层查询中取“学生表”的第一行记录,利用该记录的相关属性值(在exists子查询的where子句中用到的列)处理内层查询,若外层的where子句返回“true”,则本条记录放入结果表中。...然后再取下一行记录,重复上述过程直到外层表遍历完毕。 Exists语句不关心子查询返回的具体内容,因此用“exists(select 1 from)”来判断子查询是否返回记录。...exists()值为true,说明选课表中找不到“S1.StudentNo + C1.CourseNo”这一记录,说明学生S1没有选课程C1,此时内层查询的返回结果集会加上C1,当内层查询的返回结果集不为空时