16

这是我的 NEWSPAPER 表。

    National News   A   1
    Sports          D   1
    Editorials      A   12
    Business        E   1
    Weather         C   2
    Television      B   7
    Births          F   7
    Classified      F   8
    Modern Life     B   1
    Comics          C   4
    Movies          B   4
    Bridge          B   2
    Obituaries      F   6
    Doctor Is In    F   6

当我运行这个查询

select feature,section,page from NEWSPAPER
where section = 'F'
order by page;

它给出了这个输出

Doctor Is In    F   6
Obituaries      F   6
Births          F   7
Classified      F   8

但是在 Kevin Loney 的 Oracle 10g Complete Reference 中,输出是这样的

Obituaries      F   6
Doctor Is In    F   6
Births          F   7
Classified      F   8

请帮助我了解它是如何发生的?

4

3 回答 3

13

如果您需要在子句的第一列中的两个值相同时发生可靠、可重现ORDER BY的排序,您应该始终提供另一个辅助列来进行排序。虽然您可以假设它们会根据输入的顺序(据我所知几乎总是如此,但请注意 SQL 标准没有指定任何形式的默认排序)或索引,但您永远不应该(除非它是专门针对您正在使用的引擎记录的——即使那样我个人也不会依赖它)。

如果您想在每个页面中按功能按字母顺序排序,您的查询应该是:

SELECT feature,section,page FROM NEWSPAPER
WHERE section = 'F'
ORDER BY page, feature;
于 2012-12-27T16:51:17.850 回答
11

在关系数据库中,表是集合并且是无序的。该order by子句主要用于输出目的(以及其他一些情况,例如包含 的子查询rownum)。

这是一个很好的起点。SQL 标准没有指定当 an 上的键order by相同时会发生什么。这是有充分理由的。可以使用不同的技术进行分类。有些可能是稳定的(保持原始顺序)。有些方法可能不是。

关注集合中是否有相同的行,而不是它们的顺序。顺便说一句,我认为这是一个不幸的例子。这本书的例子不应该有模棱两可的种类。

于 2012-12-27T16:52:07.103 回答
2

当您使用该SELECT语句从表中查询数据时,行在结果集中出现的顺序可能不是您所期望的。

在某些情况下,出现在结果集中的行按照它们在表中物理存储的顺序排列。但是,如果查询优化器使用索引来处理查询,行将按照索引键顺序存储时出现。因此,结果集中的行顺序是不确定的或不可预测的。

查询优化器是数据库系统中的一个内置软件组件,它确定 SQL 语句查询请求数据的最有效方式。

于 2020-08-17T18:57:57.810 回答