例如,我有一个表格,我想知道它是按字母顺序降序还是升序排列的,是否有内置函数可以做到这一点?
信件 | 数字 |
A | 1 |
B | 2 |
信件 | 数字 |
B | 2 |
A | 1 |
谢谢。
例如,我有一个表格,我想知道它是按字母顺序降序还是升序排列的,是否有内置函数可以做到这一点?
信件 | 数字 |
A | 1 |
B | 2 |
信件 | 数字 |
B | 2 |
A | 1 |
谢谢。
表中的数据不按任何顺序排列。
选择数据时必须明确指定顺序。如果您在选择数据时未指定顺序,则返回的顺序既不可预测也不可靠。
其他答案是正确的,即逻辑级别的 SQL 不能保证行以任何顺序存储。
但在物理层面上,数据当然是以某种顺序存储的。MyISAM 和 InnoDB 中的大多数索引都是 B-tree 数据结构,根据定义,它们按升序存储值。在 InnoDB 中,表本身按主键顺序存储为聚集索引。
因此,以下针对 InnoDB 表的两个查询以相同的顺序返回结果:
SELECT * FROM innodb_table;
SELECT * FROM innodb_table ORDER BY primary_key;
但这是存储实现的巧合,而不是基于 SQL 语言中的任何内容。
如果您对非主键执行仅索引查询,则问题会更加复杂。以下查询将按用作覆盖索引的索引按升序返回行:
SELECT indexed_column FROM innodb_table;
但是,一旦您破坏了覆盖索引,它就会恢复为默认顺序的其他选择(可能再次聚集索引顺序):
SELECT indexed_column, non_indexed_column FROM innodb_table;
MyISAM 完全不同,因为它不使用聚集索引。所以默认顺序是存储顺序——不一定是插入顺序。
表不按特定顺序存储数据。排序是为了查看数据,所以这就是你使用order by
子句的地方。
To add my voice to the concert of answers...
In relational databases (such as MySQL) tables must be seen as unordered set of rows.
As a matter on fact, you shouldn’t even rely on the fact that two identical SELECT
statements will return the rows in the same order.
If you want to retrieve or sort your rows according to a particular order, you will have to explicitly request it (i.e.: using the adequate ORDER BY
clause) and provide a column that allow to deterministically order the rows.
在明确使用 ORDER BY 子句之前,您永远不应该依赖于数据的检索方式