我知道通常在 SQL 中使用 SELECT * 是一个坏主意。有没有例外情况?谢谢!
3 回答
当您需要当前和未来的每一列时,考虑到可能会添加或删除一些列。
通常,这种情况仅适用于完全需要数据库信息的工具,例如模式列表器,或者如果您正在执行分析以尝试找出您需要的信息实际位于何处。
“真正的”应用程序几乎从不需要它,它应该只知道并要求他们需要什么。
您不希望您的应用程序因为数据库的其他一些用户决定他们需要在每一行中添加 42 个 2GB BLOB 列而陷入尖叫堆中:-)
通常只有在移动大量数据时才重要,因为这样你的吞吐量就会被最大化。
我经常使用它,因为就您的应用程序原型设计而言,它使 ALTERing 表变得轻松。
就处理而言,这无关紧要 - 由于 MySQL 的性质。
所以不用担心。
如果使用它的代码能够自动提取列名并随后映射所有名称以便在您的应用程序中进一步使用,那么您可以使用SELECT *
.
但是,这通常是个坏主意,因为假设您想要检索的列的位置可能很诱人(取决于您使用的 DB API,它可能是基于索引的而不是基于名称的)。为了可读性,通常最好明确地写下您想要检索的内容。
使用时可能会出现一些问题SELECT *
:
- 如果列标签没有明确定义(例如
SUM(...)
,来自视图或 CTE 的操作或其他操作), - 如果选择中的多个列具有相同的名称(例如,连接或视图/CTE 与
AS
子句)。
JavaResultSet
对名称的描述如下:
可以使用列的索引号或列的名称来检索值。一般来说,使用列索引会更有效。
[...]
当使用列名调用 getter 方法并且多个列具有相同名称时,将返回第一个匹配列的值。列名选项设计为在生成结果集的 SQL 查询中使用列名时使用。对于查询中未明确命名的列,最好使用列号。如果使用列名,程序员应该注意保证它们唯一地引用预期的列,这可以通过 SQL AS 子句来保证。