当前位置: 首页 > 面试题库 >

“ SELECT * FROM table_name;”的MySQL行顺序是什么?

宋正真
2023-03-14
问题内容

假定以下查询已发布到MySQL数据库

SELECT * FROM table_name;

注意, 没有 ORDER BY给出 任何 子句。

我的问题是:

MySQL是否能保证结果集行的顺序?

更具体地说,我是否可以假定行将按插入顺序返回?即行插入表的顺序相同。


问题答案:

不,没有保证。除非您使用ORDER BY子句指定顺序,否则该顺序完全取决于内部实现细节。即,对于RDBMS引擎最方便的是什么。

实际上,这些行 可能
以其原始插入顺序(或更准确地说,该行在物理存储中的存在顺序)返回,但是您不应依赖于此。如果您将应用程序移植到其他品牌的RDBMS,或者即使升级到可能实现存储方式不同的MySQL的较新版本,行也可能以其他顺序返回。

对于任何符合SQL的RDBMS,后一点都是正确的。

这是行在存储中的顺序与创建顺序的关系的说明:

CREATE TABLE foo (id SERIAL PRIMARY KEY, bar CHAR(10));

-- create rows with id 1 through 10
INSERT INTO foo (bar) VALUES
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing'), 
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing');

DELETE FROM foo WHERE id BETWEEN 4 AND 7;

+----+---------+
| id | bar     |
+----+---------+
|  1 | testing |
|  2 | testing |
|  3 | testing |
|  8 | testing |
|  9 | testing |
| 10 | testing |
+----+---------+

所以现在我们有六行。此时的存储区在第3行和第8行之间有一个间隙,该间隙在删除中间行之后保留。删除行不会对这些间隙进行碎片整理。

-- create rows with id 11 through 20 
INSERT INTO foo (bar) VALUES
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing'), 
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing');

SELECT * FROM foo;

+----+---------+
| id | bar     |
+----+---------+
|  1 | testing |
|  2 | testing |
|  3 | testing |
| 14 | testing |
| 13 | testing |
| 12 | testing |
| 11 | testing |
|  8 | testing |
|  9 | testing |
| 10 | testing |
| 15 | testing |
| 16 | testing |
| 17 | testing |
| 18 | testing |
| 19 | testing |
| 20 | testing |
+----+---------+

请注意,在将新行追加到表末尾之前,MySQL如何重新使用通过删除行打开的空格。还要注意,第11至14行以相反的顺序插入到这些空间中,从末尾向后填充。

因此,行的存储顺序与它们插入的顺序不完全相同。



 类似资料:
  • 问题内容: 我有以下查询: 我有以下问题: USING语法与ON语法同义吗? 这些联接是从左到右评估的吗?换句话说,此查询是否说:x =公司加入了用户;y = x JOIN工作;z = y加入用户帐户; 如果对问题2的回答为“是”,那么可以安全地假设“公司”表中包含“公司ID”,“用户ID”和“工作ID”列? 我不明白在引用别名“ j”时,如何使用WHERE子句来选择公司表上的行 任何帮助,将不胜

  • 问题内容: 我在语句中使用序列有问题。 给我一个错误: 00000-“此处不允许使用序列号” 原因:在此语句中,指定的序列号(CURRVAL或NEXTVAL)不合适。操作:删除序列号。 我做错了可能很明显,因此希望这是一个简单的答案。 问题答案: 您不能在带有的查询中使用序列。 删除或放入子查询中:

  • 所以我有一个方法,返回一个完整的未来。在返回之前,该方法添加了一个带有accept的块,该块在CompletableFuture完成后执行。 此方法的调用者还添加了另一个块,其中包含

  • 问题内容: 我试图弄清楚为什么我的一个css类似乎覆盖了另一个(而不是相反) 这里我有两个CSS类 在我看来,我打电话给 字体(重叠元素)显示为10px而不是20px-有人可以解释为什么会这样吗? 问题答案: 有几条规则(按此顺序应用): 内联css(html样式属性)覆盖样式标签和css文件中的css规则 较具体的选择器优先于较不具体的选择器 如果两个规则具有相同的特异性,则稍后出现在代码中的规

  • 本文向大家介绍什么是Python中的顺序表,包括了什么是Python中的顺序表的使用技巧和注意事项,需要的朋友参考一下 1、顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入、删除时需要移动大量元素。顺序表可以分配一段连续的存储空间Maxsize,用elem记录基地址,用length记录实际的元素个数,即顺序表

  • 问题内容: 如果我有一行这样的代码 和…一样吗 要么 ? 问题答案: 这应该使事情更清晰。简单地说,投优先除法运算,所以这将 是同样的事情 给输出相同 编辑: 正如knoight所指出的,这在技术上与没有括号的操作不一样,因为它们也具有优先权。但是,出于本示例的目的,它将提供相同的结果,并且对于所有意图和目的都是等效的。