oracle sql查询的执行顺序

oracle sql查询的执行顺序,sql,oracle,group-by,distinct,Sql,Oracle,Group By,Distinct,我对甲骨文很陌生。我这里有一个表和一些查询: 我想知道这个问题: select distinct name,id from test; 及 生产相同的产量。如何在oracle中找到执行上述查询的顺序?每个数据都是随机的?或者有一种方法可以对所有的数据集执行。通常,如果要调试性能,可以使用如下解释计划: 解释计划 选择不同的名称、ID 从测试开始 解释计划 选择名称、ID 从测试 分组人(姓名、ID) 这将向您展示查询优化者认为哪种处理方式是最好的,您不能保证总是得到相同的计划,例如,如果您添

我对甲骨文很陌生。我这里有一个表和一些查询:

我想知道这个问题:

select distinct name,id from test;


生产相同的产量。如何在oracle中找到执行上述查询的顺序?每个数据都是随机的?或者有一种方法可以对所有的数据集执行。

通常,如果要调试性能,可以使用如下解释计划:

解释计划 选择不同的名称、ID 从测试开始

解释计划 选择名称、ID 从测试 分组人(姓名、ID)


这将向您展示查询优化者认为哪种处理方式是最好的,您不能保证总是得到相同的计划,例如,如果您添加索引,计划可能会更改,您可以使用提示,但我认为我没有看到它们实际被使用。通常,如果您想调试性能,您会使用这样的解释计划:

解释计划 选择不同的名称、ID 从测试开始

解释计划 选择名称、ID 从测试 分组人(姓名、ID)


这将向您展示查询优化者认为最好的处理方式,您不能保证总是得到相同的计划,例如,如果添加索引,计划可能会改变,您可以使用提示,但我认为我没有看到它们实际被使用

所有查询产生相同结果的原因是因为表具有唯一的值

在这种情况下,使用“分组依据”是没有意义的。要计数或求和(或其他数学运算)时,请使用“分组依据”。下面是这样一个例子:

select name, count(*) ct from test group by name
这将显示名称以及名称在表中出现的次数

关于输出顺序:Oracle将以随机顺序返回行,直到收到指示为止。因此,要指定特定顺序,请使用“order by”子句:

select name,id from test order by name, id; 

然后保证返回的结果将按名称排序。如果名称多次出现,它们将按id排序。

所有查询产生相同结果的原因是表具有唯一的值

在这种情况下,使用“分组依据”是没有意义的。要计数或求和(或其他数学运算)时,请使用“分组依据”。下面是这样一个例子:

select name, count(*) ct from test group by name
这将显示名称以及名称在表中出现的次数

关于输出顺序:Oracle将以随机顺序返回行,直到收到指示为止。因此,要指定特定顺序,请使用“order by”子句:

select name,id from test order by name, id; 
然后保证返回的结果将按名称排序。如果名称出现不止一次,它们将按id排序

如何在oracle中找到执行上述查询的顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行

在SQL中,行的确定顺序是未指定的,除非您使用
orderby
子句显式地请求一个。(如果没有,您将按照找到与您的查询匹配的行的顺序获取行,并且这些行的顺序取决于查询计划。)

[查询]产生相同的输出

这是因为你有身份证。据推测,它们都是不同的,并标记为实际模式中的主键

distinct
,顺便说一句,它是一个
分组,由所有检索字段组成,用于所有目的和目的

无论如何,如果您希望行的顺序一致,您需要类似于
orderbyname,id

如何在oracle中找到执行上述查询的顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行

在SQL中,行的确定顺序是未指定的,除非您使用
orderby
子句显式地请求一个。(如果没有,您将按照找到与您的查询匹配的行的顺序获取行,并且这些行的顺序取决于查询计划。)

[查询]产生相同的输出

这是因为你有身份证。据推测,它们都是不同的,并标记为实际模式中的主键

distinct
,顺便说一句,它是一个
分组,由所有检索字段组成,用于所有目的和目的


无论如何,如果您希望行的顺序一致,那么您需要类似于
按名称排序,id

查看您的SQL FIDLE:您的表中有五条记录,有五个名称和id的组合。因此,您发布的查询只会返回所有行。实际上,它们与此查询相同

select name, id from test;
。。。只有在为nugatory排序消耗额外资源的情况下,数据库才能确保唯一性。添加一条与姓名和ID重复但有不同电子邮件的新记录将帮助您了解发生了什么

您应该了解,在现实生活中使用DISTINCT实际上非常罕见:正确定义的WHERE子句应该足以生成唯一的结果集。GROUP BY通常与COUNT()或SUM()等聚合函数一起使用;例如,有多少NAME+id有多封电子邮件

select name, id from test 
group by name, id having count(*) > 1;
至于排序,执行的查询需要排序,因此结果集的顺序可能与输入顺序不同。Oracle并不保证其结果集的顺序,但排序使其更不可预测。为了获得该担保,有必要指定一个ORDER BY条款:

select distinct name, id from test 
order by name, id 

ORDERBY子句将保证任何语句的顺序相同,而不管在筛选和处理结果集时发生了什么其他处理

看看您的SQL FIDLE:您的表中有五条记录,其中有五种名称和ID组合。因此,您发布的查询只会返回所有行。实际上,它们与此查询相同

select name, id from test;
。。。只有在为nugatory排序消耗额外资源的情况下,数据库才能确保唯一性。添加与名称和ID重复但具有不同名称的新记录