我对甲骨文很陌生。我在这里有一张桌子和一些查询:
http://sqlfiddle.com/#!4/a7b7c/1
我想知道如何查询:
select distinct name,id from test;
和
select name,id from test group by name,id;
产生相同的输出。我如何在 oracle 中找到上述查询的执行顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行。
我对甲骨文很陌生。我在这里有一张桌子和一些查询:
http://sqlfiddle.com/#!4/a7b7c/1
我想知道如何查询:
select distinct name,id from test;
和
select name,id from test group by name,id;
产生相同的输出。我如何在 oracle 中找到上述查询的执行顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行。
通常,如果您想调试性能,您会使用如下解释计划:
说明从测试中选择不同名称、ID 的计划;
EXPLAIN PLAN FOR SELECT NAME, ID FROM TEST GROUP BY (NAME,ID);
这将向您展示查询优化器认为最好的处理类型,您不能保证您将始终获得相同的计划,例如,如果您添加索引,计划可能会更改,您可以使用提示,但我不认为我已经看到它们实际上被使用了
看看你的 SQL Fiddle:你的表中有 5 条记录,有 5 种 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 子句将保证任何语句的顺序相同,无论在过滤和处理结果集时发生什么其他处理。
我如何在 oracle 中找到上述查询的执行顺序?每个数据都是随机的?或者有一种方法可以对所有数据集执行。
在 SQL 中,确定行的顺序是未指定的,除非您使用order by
子句明确要求。(如果没有,您将按照与您的查询匹配的顺序获取行,它们的顺序取决于查询计划。)
[查询]产生相同的输出。
这是因为你在那里有 id。据推测,它们都是不同的,并在您的实际模式中标记为主键。
distinct
,顺便说一句,是group by
所有意图和目的的所有检索字段。
无论如何,如果您希望行的顺序一致,您需要类似order by name, id
.
所有查询产生相同结果的原因是表具有唯一值。
在这种情况下使用“分组依据”是没有意义的。当您想要计数或求和(或其他数学运算)时,请使用“分组依据”。这是一个这样的例子:
select name, count(*) ct from test group by name
这将显示名称以及该名称在表格中出现的次数。
关于输出的顺序:Oracle 将按随机顺序返回行,直到得到指示。所以要指定一个特定的顺序,然后使用“order by”子句:
select name,id from test order by name, id;
然后,您可以保证返回的结果按名称排序。如果名称出现不止一次,它们将按 id 排序。