我正在使用MS SQL Server 2005.对于SQL引擎,
之间是否存在差异SELECT * FROM MyTable;
和
SELECT ColA, ColB, ColC FROM MyTable;
当ColA,ColB和ColC代表表格中的每一列时?
如果它们是相同的,那么你有理由不使用第二个吗?我有一个对LINQ很重的项目,我不确定它生成的标准SELECT *是不是很糟糕,或者我应该总是使用.Select()来指定我想要的cols。
编辑:更改“当ColA,ColB和ColC是表格的所有列?” “当ColA,ColB和ColC代表表格中的每一列?”为清楚起见。
答案 0 :(得分:38)
一般来说,最好是明确的,所以Select col1, col2 from Table
更好。原因是在某些时候,可能会在该表中添加一个额外的列,并导致从查询中返回不需要的数据。
但这不是一个严格的规则。
答案 1 :(得分:17)
1)第二个更明确地返回哪些列。然后,第二个的值是您明确知道哪些列返回的值。
2)当列数多于明确使用的列数时,这可能会返回更少的数据。
3)如果通过添加新列来更改表,则第一个查询会更改而第二个查询不会更改。如果你有“为所有返回的列做...”这样的代码,那么如果你使用第一个而不是第二个,结果会改变。
答案 2 :(得分:9)
问题的两个方面是:显式列规范在添加新列时提供更好的性能,但*规范不需要维护,因为添加了新列。
使用哪个取决于您希望添加到表中的列类型,以及查询的重点。
如果您使用表作为对象的后备存储(似乎可能在LINQ-to-SQL情况下),您可能希望添加到此表中的任何新列都包含在您的对象中,并且反之亦然。你正在并行维护它们。因此,对于这种情况,SELECT子句中的*规范是正确的。显式规范会在每次更改时为您提供额外的维护,如果您没有正确更新字段列表,则会出现错误。
如果查询要返回大量记录,那么出于性能原因,最好使用明确的规范。
如果两者都属实,请考虑进行两次不同的查询。
答案 3 :(得分:9)
我会让很多人对我感到不满,但特别是如果我稍后再添加列,我通常会喜欢使用SELECT * FROM表。因为这个原因,我被称为懒惰,因为如果我对表进行任何修改,我不想追踪使用该表的所有存储过程,只需在我的应用程序中的数据访问层类中进行更改。在某些情况下我会指定列,但在我试图从数据库中获取完整“对象”的情况下,我宁愿只使用“*”。而且,是的,我知道人们会因此而讨厌我,但它让我在为我的应用程序添加字段时更快,更少无bug。
答案 4 :(得分:8)
您应指定显式列列表。 SELECT *将带回更多列,而不是创建更多IO和网络流量,但更重要的是,即使存在非群集覆盖索引(在SQL Server上),它也可能需要额外的查找。
答案 5 :(得分:5)
不使用第一个语句(select *)的一些原因是:
答案 6 :(得分:4)
当您单独选择每个字段时,更清楚的是实际选择了哪些字段。
答案 7 :(得分:3)
一些事情:
答案 8 :(得分:3)
SELECT *在大多数地方都是不好的做法。
这是一个等待发生的错误。
答案 9 :(得分:2)
它有利于向前兼容。
使用时
SELECT * FROM myTable
和“myTable”中有3列。您得到与
相同的结果SELECT Column1, Column2, Column3 FROM myTable
但如果您将来添加新列,则会得到不同的结果。
当然,如果您更改现有列的名称之一,在第一种情况下您会得到结果,在第二种情况下您会收到错误(我认为这是应用程序的正确行为)。
答案 10 :(得分:2)
如果您的代码依赖于特定顺序的某些列,则需要列出列。如果没有,如果你使用“*”或在select语句中写出列名,它就没有什么区别。
例如,如果将列插入表中。
拿这张桌子: 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之间添加一列,则查询将不会返回您要查找的内容。
答案 11 :(得分: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个字节的数据。这是通过网络传回的数据量的巨大差异。
指定列列表还可以更清楚地了解您感兴趣的列。缺点是如果您在表中添加/删除列,则需要确保列列表也更新,但我认为这是与性能提升相比价格较低。
答案 12 :(得分:1)
SELECT * FROM MyTable
select *取决于模式中的列顺序,因此如果您通过集合的索引#引用结果集,那么您将查看错误的列。
SELECT Col1,Col2,Col3 FROM MyTable
此查询会为您提供一个随时间保持不变的集合,但是您多久更改一次列顺序?
答案 13 :(得分:1)
对于LinqToSql,如果您打算稍后修改这些记录,则应将整个记录拉入内存。
答案 14 :(得分:1)
快速查看查询执行计划显示查询是相同的。
一般的经验法则是,您只想将查询限制为只需要返回的字段。
答案 15 :(得分:0)
选择每一列比仅仅更好*因为如果您添加或删除新行,您必须查看代码并查看您对检索到的数据所执行的操作。
此外,它可以帮助您更好地理解您的代码,并允许您使用别名作为列名称(如果您正在执行具有共享名称的列的表连接)
答案 16 :(得分:0)
为什么你从来没有(imho)应该使用SELECT *的例子。这与MSSQL无关,而是与MySQL有关。 5.0.12之前的版本以非标准方式从某些类型的连接返回列。当然,如果您的查询定义了您想要的列以及您没有问题的顺序。想象一下,如果他们不这样做,那就很有趣。
(一个可能的例外:您的查询只从一个表中选择和,您可以通过名称而不是位置来识别所选编程语言中的列。)
答案 17 :(得分:0)
使用“SELECT *”优化程序员输入。而已。这是唯一的优势。