2013-08-17 46 views
1

我正在开发一个应用程序,我正在阅读有关查询如何工作。我在某处读到你应该避免选择* FROM ... where blah = blah为什么要在SQL中避免SELECT *?

这是为什么?如果你想挑选几乎所有东西,那么解决方法是什么?

+6

请参阅:http://stackoverflow.com/questions/3639861/why-is-select-considered-harmful – vee

+1

不仅仅是PHP,任何标记歧义的数据库语句都应该避免。 –

+0

所以基本上你应该只做SELECT Row1,Row2,Row3 ... Rowi FROM ... where blah = blah? – user2352165

回答

0

最初需要知道您需要什么数据。尽管如此,如果这样的请求不会太多,您可以一次选择全部。在性能上的差异,你只会看到重型项目。

0

这不是对您的问题的直接回答“为什么?” (如果需要的话,请降低答案)。这是“如果您需要的话,什么是解决方法”问题的答案。

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

为了把一个向后捻从办公空间 charaacter彼得·吉本斯一行:“事实是,鲍勃,这并不是说我不在乎,它只是我很懒”。

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

对于引用多个表的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 

当列引用合格,反引号时,才需要为“特殊“字符(或者可能是一些奇怪的区分大小写的settin g)

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

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

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

相关问题