统计函数和子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统计函数和子查询相关的知识,希望对你有一定的参考价值。

参考技术A     组函数也叫:统计函数/多行函数/聚合函数

    max(列名):求最大值

    min(列名):求最小值

    sum(列名):求和

    avg(列名):求平均值

    count(*):计算总数

    count(expr):返回在列中有expr指定的非控制的总数

    count(distinct expr):去重,在expr指定的列

         其中需要注意的:avg和sum函数参数类型只能是数字count/max/min参数类型可以是日期,字符和数字组函数会默认忽略控制,可以在组函数中使用nvl来处理空值

    单行函数对查询到每个结果集做处理,而组函数只对分组 数据做处理

    单行函数对每个结果集返回一个结果,而组函数对每个分组返回一个结果

查询分组:用group by 列名1,列名2...。

     需要注意:如果在select语句中包含了组函数,就不能选择单独的列出现在group by 子句中,因为他不知道要跟谁做比较,如果查询语句中出现了组函数和其他列,要查询的列必须出现在group by 语句中(组函数除外)

如果在查询分组中加条件需要用having 关键字

所以完整的查询语句:selcet 列名... from 表名 where 子语句 group by 列名 having 条件 roder by 排序列

约束分组结果:having关键字

如果在查询分组中加条件筛选结果需要用having 关键字

所以完整的查询语句:selcet 列名... from 表名 where 子语句 group by 列名 having 条件 roder by 排序列

         子查询也是一个select语句,他是嵌套在另一个select语句中的子句(把一个查询语句的结果当作条件查询)

需要注意:

    1.子查询语句必须用括号括起来(区分优先级)且在主查询之前执行一次

    2.若需要放在比较中,子查询放在比较条件的右边

    3.子查询的结果被用于主查询

子查询的分类:

    1.单行子查询:子查询语句只返回一行的查询(使用单行比较符)

单行子查询可以使用的运算符:

在子查询中显示多行数据需要注意的:

    2 . 多行子查询 :子查询语句返回多行的查询(使用多行比较符)

     多行子查询使用的比较符号:(能用多行的都可以用连接实现,而且效率更高)

any和all的区别以及用法:

all:代表所有

SQL 引擎按啥顺序执行查询和子查询?

【中文标题】SQL 引擎按啥顺序执行查询和子查询?【英文标题】:In which sequence are queries and sub-queries executed by the SQL engine?SQL 引擎按什么顺序执行查询和子查询? 【发布时间】:2011-01-16 19:37:36 【问题描述】:

您好,我做了一个 SQL 测试并且对一个问题感到怀疑/好奇:

SQL 引擎执行查询和子查询的顺序是什么?

答案是

    主查询->子查询->子子查询等 子子查询 -> 子查询 -> 主查询 一次性解释整个查询 没有固定的解释顺序,查询解析器会即时做出决定

我选择了最后一个答案(只是假设它是最可靠的 w.r.t. 其他人)。 现在的好奇心:

我在哪里可以阅读到这方面的信息,简要介绍一下这一切背后的机制是什么?

谢谢。

【问题讨论】:

【参考方案1】:

这通常取决于您的 DBMS,但是……我认为第二个答案更合理。 没有子查询结果,通常无法计算素数查询。

【讨论】:

而另一方面 - 子查询通常取决于主查询(相关子查询)。 ps:来自phpclub的你好;-)【参考方案2】:

SQL 引擎尝试优化(子)查询的执行顺序。决定这一点的部分称为查询优化器。查询优化器知道每个表中有多少行、哪些表有索引以及在哪些字段上。它使用该信息来决定首先执行哪个部分。

【讨论】:

【参考方案3】:

我认为答案 4 是正确的。有几个注意事项:

子查询的类型 - 是否相关。考虑:

SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
            )

这里,子查询与外部查询不相关。如果 t2.id 中的值数量比 t1.id 少,那么最有效的方法可能是先执行子查询,并将结果保存在内存中,然后扫描 t1 或 t1.id 上的索引,匹配缓存的值。

但如果查询是:

SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
             WHERE  t2.type = t1.type
            )

这里子查询是相关的——除非 t1.type 已知,否则无法计算子查询。由于 t1.type 的值可能因外部查询的每一行而异,因此该子查询可以针对外部查询的每一行执行一次。

然后,RDBMS 可能真的很聪明,并且意识到 t2.type 只有几个可能的值。在这种情况下,如果它可以猜测执行一次子查询的成本会比为每一行执行一次更便宜,它可能仍然使用用于不相关子查询的方法。

【讨论】:

感谢您的回复,关于在哪里阅读的任何想法,最佳来源? 如果在第二个示例中而不是 from t2 我们有 from t2,t1 那么主查询和子查询不相关。我说的对吗? 没错。然后,子查询的 WHERE 中的表达式 t1.type 将被解析为子查询的 FROM 子句中的 t1,而不是外部查询的表达式。子查询将不再有对外部查询的任何引用,因此将是不相关的。【参考方案4】:

选项 4 接近。

SQL 是declarative:你告诉查询优化器你想要什么,它会产生最好的(取决于时间/“成本”等)方法。对于外观相同的查询和表,这可能会有所不同,具体取决于统计信息、数据分布、行数、并行度以及天知道还有什么。

这意味着没有固定的顺序。但这并不完全是“即时”

即使使用相同的服务器、架构、查询和数据,我也看到执行计划不同

【讨论】:

【参考方案5】:

如果您想阅读有关这些主题的内容,请获取 Inside SQL Server 2008:T-SQL 查询的副本。它有两章专门介绍如何在 SQL Server 中对查询进行逻辑和物理处理。

【讨论】:

以上是关于统计函数和子查询的主要内容,如果未能解决你的问题,请参考以下文章

统计函数

数据分析 - 分组统计查询

Oracle 多表查询

Oracle数据库从入门到精通-分组统计查询

MYSQL常用函数查询统计

MySql的回顾三:流程控制函数/统计函数/分组查询