我对Oracle很新。我在这里有一张桌子和一些疑问:
http://sqlfiddle.com/#!4/a7b7c/1
我想知道查询如何:
select distinct name,id from test;
和
select name,id from test group by name,id;
生成相同的输出。如何在oracle中找到执行上述查询的顺序?它是随机的每个数据?或者有一种方法可以为所有数据集执行。
答案 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子句将保证任何语句的顺序相同,无论过滤和处理结果集时发生了什么其他处理。