跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 数据库查询时使用 group by(不加 order by)后返回的结果默认是按怎样的规则排序的?
未分類
10 5 月 2020

数据库查询时使用 group by(不加 order by)后返回的结果默认是按怎样的规则排序的?

数据库查询时使用 group by(不加 order by)后返回的结果默认是按怎样的规则排序的?

資深大佬 : xiri 51

我知道要让输出结果有序加个 order by 就行,但这里不考虑这一点,就是单纯的想知道 group by 后的输出默认是怎么确定顺序的。

我这里在 oracle 11g 上进行测试,拿它默认的 scott 用户下的 emp 表举例,表中的 EMPNO 是主键。

不加 group by

直接使用select empno,ename from emp;,输出结果如下所示(单独取 EMPNO 或单独取 ENAME 输出的顺序都跟这里是一样的,这里把两列同时取出来方便下面的对比)。

     EMPNO ENAME ---------- --------------------       7369 SMITH       7499 ALLEN       7521 WARD       7566 JONES       7654 MARTIN       7698 BLAKE       7782 CLARK       7788 SCOTT       7839 KING       7844 TURNER       7876 ADAMS       EMPNO ENAME ---------- --------------------       7900 JAMES       7902 FORD       7934 MILLER 

加 group by

使用select ename from emp group by ename;(虽然这样 group by 毫无意义),结果如下。很明显顺序改变了,但是没发现任何规律,不是按字母排的,跟主键 EMPNO 也没有关系

ENAME -------------------- ALLEN JONES FORD CLARK MILLER SMITH WARD MARTIN SCOTT TURNER ADAMS  ENAME -------------------- BLAKE KING JAMES 

比较奇怪的一点是,使用select empno from emp group by empno;时的输出又是有序的,是因为结果都是数字?还是因为 EMPNO 是主键?

     EMPNO ----------       7369       7499       7521       7566       7654       7698       7782       7788       7839       7844       7876       EMPNO ----------       7900       7902       7934 

搜索过程中看到这样一句话“数据库中的一个重要理论就是表中的记录是没有顺序的。 如果你不在查询中用 ORDER BY 指定顺序,则系统会‘随机’给出顺序”
可我感觉就算是“随机”也还是要有一个基础规则的吧,毕竟上面的语句每一次查询输出的结果都是一样的。

也看到有人说默认是按主键排的,但上面的结果很明显不符合,望大佬解答

大佬有話說 (4)

  • 資深大佬 : catror

    看看执行计划

  • 主 資深大佬 : xiri

    @catror 在执行计划里找到原因了,谢谢啦
    select empno 那一句实际上执行的是 sort group by,而 select ename 那一句执行的是 hash group by,这应该算是数据库自己的一种优化吧

  • 資深大佬 : msg7086

    数字归并应该是直接比数字快,所以 sort 后 group。文本归并的话用哈希表更快,扔进桶里再归并。换你自己写数据库的话最后其实也会写成这样的。

    至于随机结果,主要是指结果不固定顺序。如果数据库高兴,他可以按照硬盘或者内存中存储的顺序来排序,那也是一种归并算法。

  • 資深大佬 : guanhui07

    执行计划

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具