使用“Select *”和“Select [列名清单]”有什么区别?

27

我正在使用MS SQL Server 2005。对于SQL引擎来说,以下两种日期格式是否有区别:

SELECT * FROM MyTable;

SELECT ColA, ColB, ColC FROM MyTable;

如果 ColA、ColB 和 ColC 分别代表表中的每一列,那么它们相同的话,是否有理由仍然使用第二个?我有一个重度依赖于 LINQ 的项目,不确定它生成的标准 SELECT * 是否是一种不好的实践,或者我应该总是在 .Select() 中指定我想要的列。

编辑:为了清晰起见,将“当 ColA、ColB 和 ColC 都是表中的列时?”更改为“当 ColA、ColB 和 ColC 代表表中的每一列时?”


1
参见:https://dev59.com/YnVD5IYBdhLWcg3wKYT- - Annika Backstrom
18个回答

2

如果您的代码依赖于某些列以特定顺序排列,那么您需要列出这些列。如果没有,使用“*”或在选择语句中写出列名并没有太大区别。

一个例子是,如果您向表中插入一列。

以这个表为例:

ColA ColB ColC

您可能会有一个查询:

SELECT *
FROM myTable

然后代码可能是这样的:
rs = executeSql("SELECT * FROM myTable")
while (rs.read())
    Print "Col A" + rs[0]
    Print "Col B" + rs[1]
    Print "Col C" + rs[2]

如果在 ColB 和 ColC 之间添加列,那么查询将不会返回你所要查找的内容。

1

快速查看查询执行计划表明查询是相同的。

一般的经验法则是,您将希望将查询限制为仅返回所需的字段。


1

对于 LinqToSql,如果您计划稍后修改这些记录,则应将整个记录提取到内存中。


1

这取决于你所说的“差异”是什么。显然有语法上的差异,但真正的差异在于性能。

当你使用 SELECT * FROM MyTable 时,你告诉 SQL 查询引擎返回该表中所有列的数据集,而 SELECT ColA, ColB, ColC FROM MyTable 告诉查询引擎只返回该表中的ColA、ColB和ColC列的数据集。

假设你有一个包含100个定义为CHAR[10]的列的表。 SELECT * 将返回100列* 10字节的数据,而 SELECT ColA,ColB,ColC 将返回3列* 10字节的数据。这在通过网络传输的数据量方面是巨大的大小差异。

指定列列表还可以更清楚地表明你感兴趣的列。缺点是如果你从表中添加/删除列,则需要确保列列表也得更新,但我认为这是与性能提升相比的小代价。


1
在这种情况下,性能没有差别。我相信您在问题的第一部分中错过了这个关键信息:“当ColA,ColB和ColC都是表的所有列时?”既然他想要所有的列,那就没有性能差异。其他问题?有。 - Pittsburgh DBA
@匹兹堡数据库管理员:我看到了,但是我的理解是......ColA、ColB和ColC都是表中的列,而不是它们是表中所有列的完整集合。无论如何,我回复中的信息仍然相关(但在这个_具体_情况下,这些信息相互抵消了)。 - Scott Dorman

1
SELECT * FROM MyTable

select * 语句依赖于模式中的列顺序,因此如果您通过集合的索引号引用结果集,则会查看错误的列。

SELECT Col1,Col2,Col3 FROM MyTable

这个查询会给你一个随着时间不变的集合,但是你有多经常改变列的顺序呢?


0

选择每一列比仅使用*更好,因为如果您添加或删除新行,则必须查看代码并查看您正在检索的数据。
此外,它可以帮助您更好地理解代码,并允许您使用别名作为列名(如果您正在执行具有共享名称的列的表的连接)


0

一个关于为什么你永远不应该使用 SELECT * 的例子(在我看来)。这与 MSSQL 无关,而是与 MySQL 有关。在 5.0.12 版本之前的版本中,某些类型的连接返回的列的方式是非标准的。当然,如果你的查询定义了你想要哪些列以及以哪个顺序,那么就没有问题。想象一下,如果他们不定义会有多有趣。

(一个可能的例外情况:你的查询只从一个表中选择 并且 你用名称而不是位置来识别编程语言中的列。)


0

使用 "SELECT *" 优化了程序员的打字速度。这就是它唯一的优点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接