我正在开发一个应用程序,并且正在阅读有关查询如何工作的信息。我在某处读到你应该避免 SELECT * FROM... where blah = blah
这是为什么?如果您尝试选择几乎所有内容,解决方法是什么?
这并不是您“为什么会这样?”的问题的直接答案。(因此,如果需要,请对答案投反对票。)这是对“如果需要,有什么解决方法”问题的答案。
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.*
自由使用。但是当语句进入应用程序时,它*
会被替换。
最初需要知道您将需要哪些数据。虽然,你可以一次选择所有,如果这样的要求不会太多。性能上的差异,你只会在繁重的项目中看到。