【问题标题】:Why should SELECT * be avoided in SQL? [duplicate]为什么要在 SQL 中避免使用 SELECT *? [复制]
【发布时间】:2013-08-19 12:25:18
【问题描述】:

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

这是为什么呢?如果您尝试选择几乎所有内容,有什么解决方法?

【问题讨论】:

  • 不只是 PHP,任何标记歧义的数据库语句都应该避免。
  • 所以基本上你应该做 SELECT Row1, Row2, Row3... Rowi FROM ... where blah=blah?
  • 是的,你应该这样做:SELECT Row1, Row2, Row3... Rowi FROM ... where blah=blah
  • 谢谢 :) 非常感谢

标签: php sql pdo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这并不是对您的问题“为什么会这样?”的直接回答。 (如果需要,请对答案投反对票。)这是对“如果需要,有什么解决方法”问题的答案。

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

    Office Space 人物 Peter Gibbons 的一句话反过来说:“问题是,Bob,这不是 我不在乎,只是我很懒。”

    在 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.*。但是当语句进入应用程序时, * 被替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2011-03-10
      • 2010-12-23
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多