2013-04-28 96 views
0

我对Oracle很陌生。我有一个表,这里的一些疑问:oracle sql查询执行顺序

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

我不知道如何查询:

select distinct name,id from test; 

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

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

回答

1

通常,如果你想进行性能调试,你会使用像这样的解释计划:

解释计划 SELECT DISTINCT姓名,身份证 来自测试;

解释计划 SELECT NAME,ID FROM TEST GROUP BY(NAME,ID);

这将告诉你查询优化器认为哪种处理是最好的,你不能保证你总是会得到相同的计划,例如,如果你添加索引计划可能会改变,你可以使用提示,但我不会我不认为我已经看到他们实际上正在使用

1

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

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

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

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

关于输出的顺序:Oracle将按照随机顺序返回行,直到指示为止。因此,要指定一个特定的顺序,那么“按订单”子句中使用如:

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

然后你保证的结果将返回按名称排序。如果名称不止一次出现,它们将按ID排序。

1

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

在SQL中,其中行确定的顺序是不确定除非你要求一个明确使用order by条款。 (如果没有,你会在他们找到符合您的查询的顺序得到行,以及他们将取决于查询计划。)

[查询都是]生产相同输出为

这是因为你有id。据推测,它们都是独特的,并被标记为实际模式中的主键。

distinct,顺便说一句,是一个group by所有检索字段的所有意图和目的。

无论如何,如果你想要的行顺序一致,你想要的东西像order by name, id

1

看看你的SQL小提琴:表中有五条记录,包含NAME和ID的五种组合。所以你发布的查询只会返回所有行。有效它们是相同的,因为这查询...

select name, id from test; 

...只为多少价值排序数据库承诺确保其唯一性的额外资源消耗。添加一个复制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子句将保证相同的顺序进行任何声明,无论在过滤时会发生什么其他的处理和处理结果集。