oracle sql查询执行顺序

时间:2013-04-28 11:58:52

标签: sql oracle group-by distinct

我对Oracle很新。我在这里有一张桌子和一些疑问:

http://sqlfiddle.com/#!4/a7b7c/1

我想知道查询如何:

select distinct name,id from test;

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

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

4 个答案:

答案 0 :(得分:1)

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

解释计划 选择DISTINCT NAME,ID 来自测试;

解释计划 选择名称,ID 从测试 GROUP BY(姓名,身份证);

它将向您显示查询优化器认为哪种处理最佳,您不能保证您将始终获得相同的计划,例如,如果您添加索引计划可能会更改,您可以使用提示但我不喜欢我想我已经看到他们真正被使用了

答案 1 :(得分:1)

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

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

select name, count(*) ct from test group by name

这将显示名称以及名称在表格中出现的次数。

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

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

然后,您可以保证按名称排序返回结果。如果名称出现不止一次,则按ID排序。

答案 2 :(得分:1)

  

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

在SQL中,确定行的顺序是未指定,除非您要求明确使用order by子句。 (如果没有,您将按照发现它们与查询匹配的顺序获取行,它们将取决于查询计划。)

  

[查询]生成相同的输出。

这是因为你在那里有id。据推测,它们都是不同的,并标记为实际架构中的主键。

distinct,btw,是group by所有检索到的字段,用于所有意图和目的。

无论如何,如果你想要按顺序排列行,你需要order by name, id

之类的东西

答案 3 :(得分:1)

查看您的SQL小提琴:您的表中有五条记录,其中包含NAME和ID的五种组合。所以你发布的查询只会返回所有行。实际上它们与此查询相同......

select name, id from test;

...只有数据库承诺的nugatory排序的额外资源消耗才能确保唯一性。添加复制NAME和ID但具有不同EMAIL的新记录将有助于您了解正在发生的事情。

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

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 

ORDER BY子句将保证任何语句的顺序相同,无论过滤和处理结果集时发生了什么其他处理。