为什么要在SQL中避免使用SELECT *?

时间:2013-08-17 02:14:35

标签: php sql pdo

我正在开发一个应用程序,我正在阅读有关查询如何工作的内容。我在某处读到你应该避免SELECT * FROM ...其中blah = blah

为什么?如果你试图选择几乎所有东西,那么解决方法是什么?

2 个答案:

答案 0 :(得分:0)

最初需要知道您需要哪些数据。虽然,您可以一次选择所有,如果此类请求不会太多。性能上的差异,你只能在繁重的项目中看到。

答案 1 :(得分:0)

这不是你问题的直接答案“为什么?” (如果需要的话,请给出答案。)这是对“如果你需要解决的问题”的答案。

当我需要表中的所有列时,避免SELECT *的唯一解决方法是获取所有列的列表。而这只是我工作的额外忙碌,当我已经很忙的时候我不需要。

Office Space 角色Peter Gibbons的一条线上向下扭转:“事情是,鲍勃,不是那个我不在乎,它只是我懒惰。“

使用MySQL,我通过使用SQLyog右键菜单选项生成包含所有列的骨架SELECT语句,从而减少繁忙工作。

对于引用多个表的SQL语句,我希望每个列引用都使用表别名进行限定,因此我将只使用SQL语句为我检索一个现成的列列表:

SELECT GROUP_CONCAT(CONCAT('t.',c.column_name) 
         ORDER BY c.ordinal_position
       ) AS col_list
  FROM information_schema.columns c
 WHERE c.table_schema = 'mydatabase'
   AND c.table_name = 'mytable'

如果我只需要一些很长的列表,那么我就更容易将它们从垂直列表中删除

SELECT CONCAT(',s.`',c.column_name,'`') AS col_names
  FROM information_schema.columns c
 WHERE c.table_schema = 'mydatabase'
   AND c.table_name = 'mytable'
 ORDER BY c.ordinal_position

当列引用被限定时,只有列名中的“特殊”字符才需要反引号(或者可能是一些奇怪的区分大小写的设置。)

我可以从该列表开始,并删除我知道我不需要的列。

我再次道歉,这并没有回答“为什么?”这个问题。在类似问题的答案中给出了几个很好的理由。对我来说,一个重要的原因是该声明的未来读者不必去寻找其他地方以找出返回的列。当然,他们可以复制语句,然后在不同的环境中运行它,以查看列表。但是如果语句有变量替换,绑定变量,点和双引号以及对mysql_real_escape_string的调用(在mysql_接口的情况下),这比它需要的更麻烦。当然,可以修改代码以在执行之前回显SQL文本,读者可能需要这样做。但有人只是审查代码不应该这样做。并且具有由语句返回的列和表达式的列表,其顺序比表中列的序号位置更合适,我认为这只会使代码更具可读性。 (如果声明返回列很重要,那么我认为列名在查询中显示是合理的。)

(这是关于应用程序代码,将要包含在应用程序中的语句。对于即席查询和开发等,我自由地使用SELECT c.*。但是当一个语句进入时应用程序,*被替换。