Sql 使用*和列名的不同查询结果

Sql 使用*和列名的不同查询结果,sql,oracle,sql-order-by,Sql,Oracle,Sql Order By,当使用*和列名时,两种情况下的查询结果都不同。可能只是顺序不同,但原因是我们没有使用任何命令对数据进行排序 SELECT * FROM employees; 但当我查询时,first_name,last_name列: SELECT first_name,last_name FROM employees; 最后,当我添加一个有索引的列时 结果又不同了 SELECT employee_id, first_name,last_name FROM employees; 为什么结果不同 我无法

当使用*和列名时,两种情况下的查询结果都不同。可能只是顺序不同,但原因是我们没有使用任何命令对数据进行排序

SELECT * FROM employees;

但当我查询时,first_name,last_name列:

SELECT first_name,last_name FROM employees;

最后,当我添加一个有索引的列时

结果又不同了

SELECT employee_id, first_name,last_name FROM employees;

为什么结果不同

我无法理解名、姓列值的顺序。
感谢和问候。

只有使用order by才能保证按特定顺序显示

SELECT employee_id, first_name,last_name FROM employees order by first_name asc

大多数DBMS存储的数据不一定按顺序排列。当您运行查询时,dbms使用执行计划来提高性能和收集数据的方式。因此,不能保证每次都获得相同的有序数据。相反,使用
order
命令来获取您想要的内容。

数据存储在Oracle表中的未排序集合中。

因此,当您执行
选择*
选择列名
时,可能会以不同的顺序检索数据,但数据并不不同。这有点像你只看了50行,然后比较


如果您想要一致的数据,那么您必须在两个查询中使用相同的
ORDER BY
,您将发现相同的数据。

数据是相同的,只是顺序不同

我要补充的是,看起来您在
(姓、名)
上有一个索引。在您的案例中,Oracle认识到它可以使用此索引进行查询——它是一个覆盖索引


这就是为什么只有这两个列名的结果看起来是有序的。当然,你不能依赖这一点。结果集是无序的,除非在
SELECT
中明确包含
orderby
子句。似乎您至少有两个索引,一个是关于员工id,另一个是关于姓氏。 在第一个选项中,选择:

SELECT * FROM employees;
数据是按员工id排序的。 在第二个屏幕上,选择:

SELECT first_name,last_name FROM employees;
数据是按姓氏排序的。 关于最后一点:

SELECT employee_id, first_name,last_name FROM employees;
数据是按主键索引employee_id排序的,它在默认情况下似乎具有更高的优先级,就像第一次选择一样


为了确保数据返回时如何使用“order by”。

不使用order by NOR order是有保证的,所以在查询中使用order by是员工表还是视图?