2012-02-01 59 views
5

我听说这是一般编写查询的错误方式,但我不知道有人对SQL的新用户说些什么。使用`select table_name。*`有什么优点和缺点?

这是真的很糟糕的形式还是只是简单的懒惰?

因此,不要在这方面征求太多的意见,除了不必输入每个字段名称之外,在查询中使用它有什么好的理由。另外,这些原因是否超过了使用中的伤害?

+0

这是一个像任何其他工具。如果你从不使用它,请不要担心。 – 2012-02-01 17:34:15

+0

如果您的模式发生变化并且您的代码取决于数据集中列的排序,它可能会在稍后结束。除此之外,没有任何技术上的错误。 – 2012-02-01 17:35:48

+0

@Marc B.我一直都在使用它,这可能令我担心。 – Matthew 2012-02-01 17:37:39

回答

11

当您的程序在编译时或通过配置了解了表的结构时,使用select *并不是一个好主意:表的结构中的任何更改都可能会破坏查询返回的结果的结构最终导致运行时错误。

然而,有些情况下*是不可或缺的。特别是,如果程序通过读取来自查询的元数据来动态地了解表的结构,那么使用“所有列”请求可让您的程序动态获取对表的更改。

毫无疑问,使用*作为您最喜欢的SQL Studio/SQLPlus/etc的临时查询。非常普通和方便。

+0

这是一个很好的例子,说明为什么我认为我最近一直在做的事情没问题。我有通用的Java类,它们获取查询结果并为字段获取getter。如果我使用*,则这些对象将拾取添加到表中的任何新字段。 – Matthew 2012-02-01 17:43:01

+0

@Matthew - 但大概你需要编写消耗这些额外列的代码,否则你最终会带回一堆永不被使用的数据?那么,为什么不在扩展代码的同时改变查询呢? – 2012-02-01 17:45:57

+0

@Mthethew你说得对,你的例子是在程序中使用'select *'来获得结果的经典案例,否则需要付出更多的努力。 – dasblinkenlight 2012-02-01 17:47:28

3

当使用通配符*时,系统必须处理该表的所有列名,并返回它们。

因此,使用*的性能会比实际手动输入全部更差。

如果不需要,一般的规则是避免使用它,而是指定实际需要的列。

+6

无论如何,db已经必须处理字段名称的表,以确保您不要求不存在的字段。问题在于额外的数据检索 - 加载/解码/格式化字段中的任何一点都没有意义,因为用户只需要一个字段而不是表中的其他50个字段,所以这些字段只会被丢弃。 – 2012-02-01 17:39:23

+0

@Marc B您的评论也适用于这样一个事实,即如果表格更改并且字段被删除,则较少的代码因为它而被破坏。 – Matthew 2012-02-01 17:56:04

+0

@marcB,你的评论不正确,当你使用select *的时候会有性能问题。 – HLGEM 2012-02-01 18:11:12

1

使用select *依赖于保留列的顺序。从关系的角度来看,列的顺序是不相关的。当对它们进行操作时,以下两个表格相同:

create table alpha (int id, int value); 
create table beta (int value, int id); 

它们之间唯一不同的是列的顺序。列名称&类型是相同的。列的顺序在所有情况下都应该作为内部实现细节来处理,因此永远不应该编程。

有偶尔的情况下,你只想选择所有列,没有关于订单。 (例如,数据分析程序可能会执行某些类型的查询来确定表的结构 - 但同样,结构是列的名称/数据类型,而不是它们的顺序。

请勿使用它。

1

本书SQL Antipatterns涵盖了篇“隐列”。

在查询中最典型的使用通配符的字段名写一个即席查询时,在深入这个话题。这是更快要输入'*'而不是输入你想要返回的每个字段名称,程序员的时间相当昂贵,所以在运行临时查询时不必担心性能会有轻微的增益,会浪费更多时间输入姓名。

但是,您仍然应该对数据库模式有所了解,因为等待大量行上的blob列中的值可能会浪费大量时间,特别是如果您想要的只是主键值。

使用SELECT *,您可能会在特定的查询中获得良好的性能,因为它返回的结果集可能只有几百个字节,但是,为某些其他函数添加一些blob字段到表中,也许现在结果集是数百万字节,并且突然间查询速度很慢,即使您实际使用的数据非常小。为避免此问题,请在查询中命名列。

如果您使用的是SELECT *,那么您在添加新列时会自动获得新列的值,但仍然会成为上述情况的受害者。这是一种折衷,你必须选择。

只要你有一个原因,除了懒惰不是一个有效的理由,它是有效的使用SELECT *

+0

不要担心,我绝不会建议在所有情况下都使用它。然而,我最近大量使用它。我相信我已经取得了足够的进展,并且当我从一张桌子“需要获取某些数据”时,我不再使用它了。 – Matthew 2012-02-01 18:01:23

相关问题