首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL 子查询怎么优化?写的很深!

---- 子查询 (Subquery)的优化一直以来都是 SQL 查询优化中的难点之一。关联子查询的基本执行方式类似于 Nested-Loop,但是这种执行方式的效率常常低到难以忍受。...集合比较(Quantified Comparision) 子查询:特指 IN、SOME、ANY 的查询,返回一个布尔值,常用的形式有:x = SOME(Q) (等价于 x IN Q)或 X ALL...实际执行时,查询计划执行器(Executor)在执行到 Filter 时,调用表达式执行器(Evaluator);由于这个条件表达式中包含一个标量子查询,所以 Evaluator 又会调用 Executor...但某些情况下,可能无法肯定子查询一定能返回 0 或 1 行结果(例如,想象一下 Query 2 如果 c_custkey 不是唯一的),为了确保 SQL 语义,还要在 Apply 右边加一个 Max1RowMax1Row...虽然理论上任意子查询都可以处理,但是实际上,没有任何一个已知的 DBMS 实现了所有这些变换规则。 ► HyPer 和 SQL Server 的做法有什么异同?

3.7K30

T-SQL基础(一)之简单查询

SELECT语句用于指定返回到查询结果集中的列,生成查询结果表。注意,在SELECT子句之前执行的子句无法使用SELECT子句中的列的别名,否则会返回Invalid column name错误。...TOP不是标准SQL,是T-SQL专有功能,用于限制查询返回的指定行数或百分比: -- 返回Table中的10条数据 SELECT TOP(10) * FROM Table; -- 返回Table中10%...CASE表达式有两种使用方式: CASE后面带有列名 这种情况下,WHEN子句中只能使用标量或返回标量的表达式,这种形式称为简单格式。...最外面的查询结果集返回给调用者,称为外部查询。内部查询的结果集被用于外部查询,称为子查询。...表表达式 派生表、公用表表达式、视图等 聚合函数 聚合函数对多行数据进行运算后返回标量(聚合),只有SELECT、HAVING、ORDER BY语句中可以使用聚合函数; 开窗函数 开窗函数是对基本查询中的每一行按组

4.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SQL聚合函数 MAX

    SQL聚合函数 MAX 返回指定列中最大数据值的聚合函数。...它提供了SQL-92兼容性。 expression - 任何有效的表达式。 通常是包含要返回的最大值的值的列的名称。...描述 MAX聚合函数返回表达式的最大值。 通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。 MAX可以在引用表或视图的SELECT查询或子查询中使用。...与大多数其他聚合函数不同,ALL和DISTINCT关键字,包括MAX(DISTINCT BY(col2) col1),在MAX中不执行任何操作。 它们是为了SQL-92的兼容性而提供的。...对于数值,返回的刻度与表达式刻度相同。 在派生MAX聚合函数值时,数据字段中的NULL值将被忽略。 如果查询没有返回行,或者返回的所有行的数据字段值为NULL,则MAX返回NULL。

    1.2K20

    用SQL代替DSL查询ElasticSearch怎样?

    如果你和我一样「熟悉SQL,但不咋会写DSL」 or 「想要用SQL简化查询」,本文会介绍一下官方对ES SQL的支持,希望对你有所帮助~ ES7.x版本的x-pack自带ElasticSearch...SQL的执行顺序为: 获取所有 FROM中的关键词,确定表名。 如果有WHERE条件,过滤掉所有不符合的行。 如果有GROUP BY条件,则分组聚合;如果有HAVING条件,则过滤聚合的结果。...我们主要看下聚合,分组,全文搜索相关的常用函数。 全文匹配函数 MATCH:相当于DSL中的match and multi_match查询。...聚合后的复杂字段(比如包含聚合函数)也是不能用在排序条件上的。...子查询中包含GROUP BY or HAVING 或者比SELECT X FROM (SELECT ...)

    1.7K20

    查询ElasticSearch:用SQL代替DSL

    如果你和我一样「熟悉SQL,但不咋会写DSL」 or 「想要用SQL简化查询」,本文会介绍一下官方对ES SQL的支持,希望对你有所帮助~ ES7.x版本的x-pack自带ElasticSearch SQL...SQL的执行顺序为: 获取所有 FROM中的关键词,确定表名。 如果有WHERE条件,过滤掉所有不符合的行。 如果有GROUP BY条件,则分组聚合;如果有HAVING条件,则过滤聚合的结果。...我们主要看下聚合,分组,全文搜索相关的常用函数。 全文匹配函数 MATCH:相当于DSL中的match and multi_match查询。...聚合后的复杂字段(比如包含聚合函数)也是不能用在排序条件上的。...子查询中包含GROUP BY or HAVING 或者比SELECT X FROM (SELECT ...)

    3.6K20

    SQL中的聚合函数使用总结

    大家好,又见面了,我是你们的朋友全栈君。 一般在书写sql的是时候很多时候会误将聚合函数放到where后面作为条件查询,事实证明这样是无法执行的,执行会报【此处不允许使用聚合函数】异常。...其原因很简单: having放在group by 的后面 group by 后面只能放非聚合函数的列 where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据...,条件中不能包含聚组函数,使用where条件显示特定的行。...那聚合函数在什么情况下使用或者应该处在sql文中的哪个位置呢 聚合函数只能在以下位置作为表达式使用: select 语句的选择列表(子查询或外部查询); compute 或 compute by 子句...常见的几个聚合函数 求个数:count 求总和:sum 求最大值:max 求最小值:min 求平均值:avg 当然还有其他类型的聚合函数,可能随着对应sql server不同,支持的种类也不一样。

    1.9K10

    视图索引

    对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图更为可观。...不能在多个视图列中指定用作简单表达式的表的列名。如果对列的所有(或只有一个例外)引用是复杂表达式的一部分或是函数的一个参数,则可多次引用该列。...行集函数。 UNION 运算符。 子查询。 外联接或自联接。 TOP 子句。 ORDER BY 子句。...COMPUTE 或 COMPUTE BY 子句。 如果没有指定 GROUP BY,则视图选择列表不能包含聚合表达式。...如果这个执行语句的连接没有适当的选项设置,则 SQL Server 生成错误并回滚任何会影响视图结果集的 INSERT、UPDATE 或 DELETE 语句。

    1.2K30

    SQL中的聚合函数介绍

    大家好,又见面了,我是你们的朋友全栈君。 什么是聚合函数(aggregate function)? 聚合函数对一组值执行计算并返回单一的值。 聚合函数有什么特点?...除了 COUNT 以外,聚合函数忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。 所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。...标量函数:只能对单个的数字或值进行计算。主要包括字符函数、日期/时间函数、数值函数和转换函数这四类。 常见的聚合函数有哪些? 1、求个数/记录数/项目数等:count() 例如: 统计员工个数?...1、 select 语句的选择列表(子查询或外部查询); 2、having 子句; 3、compute 或 compute by 子句中等; 注意: 在实际应用中,聚合函数常和分组函数group by结合使用...数据类型详见: SQL Server 数据类型的详细介绍及应用实例1 SQL Server 数据类型的详细介绍及应用实例2 SQL Server 数据类型的详细介绍及应用实例3 例如: select

    2.2K10

    SQL聚合函数 AVG

    SQL聚合函数 AVG 返回指定列值的平均值的聚合函数。...如果expression是DOUBLE类型,AVG返回DOUBLE; 否则,它返回NUMERIC。 描述 AVG聚合函数返回表达式值的平均值。...通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。 AVG可以用于引用表或视图的SELECT查询或子查询。...AVG通常应用于具有数值值的字段或表达式,例如数字字段或日期字段。 默认情况下,聚合函数使用逻辑(内部)数据值,而不是Display值。...如果查询没有返回行,或者返回的所有行的数据字段值为NULL, AVG返回NULL。 对单个值求平均值 如果提供给AVG的所有表达式值都是相同的,那么结果的平均值取决于访问表中的行数(除数)。

    3.3K51

    sparksql源码系列 | 生成resolved logical plan的解析规则整理

    任何不包含CTE或已内联所有CTE的主查询或子查询显然都不会有任何`WithCTE`节点。如果有的话,“WithCTE”节点将与最外层的“With”节点所在的位置相同。...join策略hint计划节点将插入到与指定名称匹配的任何关系(别名不同)、子查询或公共表表达式的顶部。hint解析的工作原理是递归遍历查询计划,找到与指定关系别名之一匹配的关系或子查询。...GlobalAggregates Resolution fixedPoint 将包含聚合表达式的投影转换为聚合。...UpdateOuterReferences Subquery Once 推送引用外部查询块的子查询中的聚合表达式下到外部查询块进行评估。...基本上,我们只需要将Alias作为Project(Project列表)或聚合(聚合表达式)或窗口(窗口表达式)中的顶级表达式。

    3.7K40

    SQL聚合函数 MIN

    SQL聚合函数 MIN 返回指定列中的最小数据值的聚合函数。...ALL对MIN返回的值没有影响。提供它是为了与SQL-92兼容。 DISTINCT - 可选-指定考虑每个唯一值。DISTINCT对MIN返回的值没有影响。它是为SQL-92兼容性提供的。...%AFTERHAVING - 可选-应用HAVING子句中的条件。 MIN返回与表达式相同的数据类型。 描述 MIN聚合函数返回表达式的最小值(最小值)。...通常,表达式是查询返回的多行中的字段名称(或包含一个或多个字段名称的表达式)。 MIN可以在引用表或视图的SELECT查询或子查询中使用。...与大多数其他聚合函数不同,ALL和DISTINCT关键字(包括MIN(DISTINCT BY(Col2)col1))在MIN中不执行任何操作。它们是为了与SQL-92兼容而提供的。

    1.3K20

    常用SQL语句和语法汇总

    SQL常用规则3 COUNT(*)会得到包含NULL的数据行数,而COUNT()会得到NULL之外的数据行数 聚合函数会将NULL排除在外,但是COUNT(*)例外。...子句未使用的列和聚合函数 SQL语句的书写顺序(重点!!!)...定义视图时不要使用ORDER BY子句 视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新 子查询作为内层查询会首先执行 标量字查询就是返回单一值的子查询 在细分的组内进行比较时,需要使用关联子查询...函数(截取日期元素) CAST函数(类型转换) COALESCE函数(将NULL转换为其他值) CASE 表达式 SQL常用规则6 谓词就是返回值为真值的函数 通常指定关联子查询作为EXIST的参数 作为...EXIST参数的子查询中经常会使用SELECT * CASE表达式中的END不能省略 SQL常用规则7 集合运算会除去重复的记录,但可以使用ALL选项,保留重复行 进行联结时需要在FROM子句中使用多张表

    2.5K50

    SQL聚合函数 SUM

    SQL聚合函数 SUM 返回指定列值之和的聚合函数。...注意:SUM可以指定为聚合函数,也可以指定为窗口函数。 本参考页面描述了SUM作为聚合函数的使用。 SUM作为一个窗口函数在窗口函数概述中描述。 描述 SUM聚合函数返回表达式值的和。...通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。 SUM可以在引用表或视图的SELECT查询或子查询中使用。...默认情况下,聚合函数使用逻辑(内部)数据值,而不是显示值。 SUM通常应用于具有数值的字段或表达式。 因为只执行最小的类型检查,所以有可能(尽管很少有意义)对非数字字段调用它。...在派生SUM聚合函数值时,数据字段中的NULL值将被忽略。 如果查询没有返回任何行,或者返回的所有行的数据字段值为NULL, SUM返回NULL。

    1.4K20

    TiDB 源码阅读系列文章(二十一)基于规则的优化 II

    这里的逻辑是当聚合函数按照具有唯一性属性的一列或多列分组时,下层算子输出的每一行都是一个单独的分组,这时就可以将聚合函数展开成具体的参数列或者包含参数列的普通函数表达式,具体的代码实现在 rule_aggregation_elimination.go...另外提一点,对于大部分聚合函数,参数的类型和返回结果的类型一般是不同的,所以在展开聚合函数的时候一般会在参数列上构造 cast 函数做类型转换,展开后的表达式会保存在作为替换 LogicalAggregation...TiDB 会在 expressionRewriter 的逻辑中做两类操作: 子查询展开 即直接执行子查询获得结果,再利用这个结果改写原本包含子查询的表达式;比如上述的非相关子查询,如果其返回的结果为一行记录...LogicalApply 算子是一类特殊的 LogicalJoin ,特殊之处体现在执行逻辑上:对于 outer plan 返回的每一行记录,取出相关列的具体值传递给子查询,再执行根据子查询生成的 inner...这是为了在子查询中没有匹配的特殊情况下保证结果的正确性,以上面查询为例,当 `t2` 表没有任何记录满足 `t2.a = t1.pk` 时,子查询中不管是什么聚合函数都会返回 `null` 结果,为了保留这种特殊情况

    1.4K40

    那些年我们写过的T-SQL(中篇)

    本系列包含上中下三篇,内容比较驳杂,望大家耐心阅读: 那些年我们写过的T-SQL(上篇):上篇介绍查询的基础,包括基本查询的逻辑顺序、联接和子查询 那些年我们写过的T-SQL(中篇):中篇介绍表表达式、...表表达式Table Expression是一种命名的查询表达式,代表一个有效的关系表与其他表的使用类似。SQL Server支持4种类型的表表达式:派生表、公用表表达式、视图等。...在对两个(或多个)查询结果集进行集合操作时,需要注意其中的查询并不支持ORDER BY操作,如果还是需要这样的功能可以使用外部的ORDER BY或者是使用TOP等操作符将返回的游标转化为结果集。...实际SQL SERVER还不支持这种类型的操作,理解起来有点复杂,简单来说就是如果我的子查询A, B都有重复数据,一个是3条,一个是5条, 那么其INTERSECT ALL操作结果应该为3条,EXCEPT...开窗函数 其根据基础查询的行子集计算,为子集中每行计算一个标量结果值,行子集被称为"窗口",通过OVER字句进行相关操作,简单来说以前对分组查询操作GROUP BY的粒度仅限于一个聚合函数(子查询操作也类似

    3.7K70

    常用SQL语句和语法汇总

    .; SQL常用规则3 COUNT(*)会得到包含NULL的数据行数,而COUNT()会得到NULL之外的数据行数 聚合函数会将NULL排除在外,但是COUNT(*)例外。...MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG只适用于数值类型的列 想要计算值得种类时,可以在COUNT函数前使用关键字DISTINCT 聚合键中包含NULL时,在结果中会以不确定(空行)...子句未使用的列和聚合函数 SQL语句的书写顺序(重点!!!)...,因此通过汇总得到的视图无法进行更新 子查询作为内层查询会首先执行 标量字查询就是返回单一值的子查询 在细分的组内进行比较时,需要使用关联子查询 ABS函数(求绝对值) ABS(数值) MOD函数(求余...ELSE 表达式> END SQL常用规则6 谓词就是返回值为真值的函数 通常指定关联子查询作为EXIST的参数 作为EXIST参数的子查询中经常会使用SELECT * CASE表达式中的END不能省略

    3.1K80

    客快物流大数据项目(九十七):ClickHouse的SQL语法

    在GROUP BY不包括聚合函数,并对全部SELECT部分都包含在GROUP BY中时的作用一样。...可以使用包含在括号里的子查询来替代表,在这种情况下,子查询的处理将会构建在外部的查询内。不同于SQL标准,子查询后无需指定别名。...SELECT,HAVING,ORDER BY子句中的表达式列表必须来自于这些“key”或聚合函数。被选择的列中不能包含非聚合函数或key之外的其他列。...如果查询表达式列表中仅包含聚合函数,则可以省略GROUP BY子句,这时会假定将所有数据聚合成一组空“key”。GROUP BY子句会为遇到的每一个不同的key计算一组聚合函数的值。...在这一行中将包含所有key的默认值(零或者空值),以及所有聚合函数对所有被选择数据行的聚合结果。

    3.3K61

    SQL 聚合查询

    另外聚合本身也有一定逻辑复杂度,而 SQL 提供了聚合函数与分组聚合能力,可以方便快速的统计出有业务价值的聚合数据,这奠定了 SQL 语言的分析价值,因此大部分分析软件直接采用 SQL 作为直接面向用户的表达式...举个例子,查询每个国家的 GDP 总量: SELECT COUNT(GDP) FROM amazing_table GROUP BY country 返回的结果就会按照国家进行分组,这时,聚合函数就变成了在组内聚合...比如要筛选出平均分大于 60 学生的成绩总和,如果不使用子查询,是无法在普通查询中在 WHERE 加聚合函数实现的,比如下面就是一个语法错误的例子: SELECT SUM(score) FROM amazing_table...WHERE AVG(score) > 60 不要幻想上面的 SQL 可以执行成功,不要在 WHERE 里使用聚合函数。...总结 聚合函数 + 分组可以实现大部分简单 SQL 需求,在写 SQL 表达式时,需要思考这样的表达式是如何计算的,比如 MAX(c1), c2 是合理的,而 SUM(c1), c2 这个 c2 就是无意义的

    2.4K31

    SQL CASE 表达式

    a = b 的特例,因为无法书写任何符号,只要条件换成 a > b 就无法胜任了,而搜索表达式不但可以轻松胜任,甚至可以写聚合函数。...CASE 表达式里的聚合函数 为什么 CASE 表达式里可以写聚合函数?...FROM test 只要 SQL 表达式中存在聚合函数,那么整个表达式都聚合了,此时访问非聚合变量没有任何意义。...'no' END AS abc FROM test 原因是,只要 SQL 中存在聚合表达式,那么整条 SQL 就都是聚合的,所以返回的结果只有一条,而我们期望查询结果不聚合,只是判断条件用到了聚合结果...由于返回行结果是混在一起的,像这个例子,可以根据 isPower 字段是否为 1 判断,是否按照城市、区域进行了聚合,如果没有其他更显著的标识,可能导致无法区分不同行的聚合粒度,因此谨慎使用。

    81730
    领券