SQL:使用Select*

SQL:使用Select*,sql,Sql,可能重复: 使用Select*是否是一种不良做法 我正在浏览一些旧代码,看到一些“SELECT*”语句。我以前的同事告诉我Select*是一种糟糕的做法,但我真的看不出原因,除非我只需要返回几个字段。但是对于完整的“细节检索”按Id类型获取查询,选择*似乎是正确的。是的,这被认为是不好的做法 最好指定一个显式的列列表,尤其是当表包含许多列,而您实际上只需要其中的一些列时。即使您需要选择所有列,也最好指定它们,而不是使用“选择*”如果发生任何架构更改,则添加额外的列,这些列将被应用程序捕获。例如

可能重复:

使用Select*是否是一种不良做法


我正在浏览一些旧代码,看到一些“SELECT*”语句。我以前的同事告诉我Select*是一种糟糕的做法,但我真的看不出原因,除非我只需要返回几个字段。但是对于完整的“细节检索”按Id类型获取查询,选择*似乎是正确的。

是的,这被认为是不好的做法


最好指定一个显式的列列表,尤其是当表包含许多列,而您实际上只需要其中的一些列时。

即使您需要选择所有列,也最好指定它们,而不是使用“选择*”

如果发生任何架构更改,则添加额外的列,这些列将被应用程序捕获。例如,如果将网格动态绑定到数据表,这可能是不可取的。此外,它还会增加网络通信的开销

即使您现在选择的是所有列,也要按名称定义这些列—其可读性和明确性。任何附加列都不会对代码造成任何问题。

这是一种不好的做法

如果您的模式发生了变化,那么调用应用程序可能会得到更多字段,而不知道该如何处理

此外,您获得的信息比您需要的要多,这会影响性能

此外,它还意味着您不知道列是什么。

使用SELECT*是不好的做法,原因有两个:

它可以返回您不需要的额外列,浪费带宽 如果有人添加列,它可能会破坏您的代码
是的,选择*是一种不好的做法。首先,其他开发人员不清楚您真正使用的是哪些列。你真的用了所有的吗?当您添加列时会发生什么?您是否也在使用这些列?这使得在需要时重构列名变得更加困难。其次,在某些情况下,某些数据库系统会记住在创建对象时存在哪些列。例如,如果使用Select*创建存储过程,它将在编译时烘焙表中存在的列。如果表发生更改,则不会在存储过程中反映这些更改。除了懒惰之外,没有任何理由使用Select*。

当您使用Select*时,您会选择在基础查询发生更改从而打破依赖代码/查询的情况下,以更快的速度编写查询来换取潜在的维护效率。这种做法的缺点是一种风险管理活动。

我几乎认为这是一种优势。我必须向我的表中添加一个字段,现在我必须进入代码以更改新字段的sql查询,而不是使用Select*则不必进行任何更改。@snow-确实,尽管您应该使用存储过程来调用这些内容,而不是硬编码的sql,在这种情况下,您更改了存储过程并更新了所有调用。@snow,这是一个巨大的缺点,您可能会向用户公开您不希望他们看到的信息。此外,如果一些yo-yo决定重新排列表中的列,它可能会打破这一点。是的,有白痴这样做,现在您正在将数据从姓氏插入到名字列,反之亦然。Selct*很糟糕。我从来没有听说过在存储过程中使用select*来“烘焙”列。。。注意。如果您需要完整的详细信息,请使用select*——特别是如果您需要不知道名称的未来详细信息列。不@Lou Franco,即使在那时,这也是一种糟糕的做法。您不知道将来会添加什么。您可能添加了用于管理目的的列,您不希望用户看到这些列。使用select*始终是一种糟糕的做法。定义列通常对性能也有好处,因为数据库不必查找它们,如果有联接,则至少有一列是重复的,这意味着返回它是在浪费带宽。