选择所有列()

询问

SELECT * FROM stack;

结果

+------+----------+----------+
| `id`   | username | password |
+------+----------+----------+
|    1 | admin    | admin    |
|    2 | stack    | stack    |
+------+----------+----------+
2 rows in set (0.00 sec)

你可以通过执行以下操作从联接中的一个表中选择所有列:

SELECT stack.* FROM stack JOIN Overflow ON stack.id = Overflow.id;

最佳实践除非你正在调试或将行提取到关联数组中,否则不要使用*,否则架构更改(ADD / DROP /重排列)可能会导致令人讨厌的应用程序错误。此外,如果你在结果集中提供所需的列列表,MySQL 的查询计划程序通常可以优化查询。

优点:

  1. 添加/删除列时,你无需在使用 SELECT *的位置进行更改
  2. 写的时间更短
  3. 你也看到了答案,那么 SELECT *的用法是否合理?

缺点:

  1. 你返回的数据超出了你的需要。假设你添加每行包含 200k 的 VARBINARY 列。你只需要在一个地方为单个记录提供此数据 - 使用 SELECT *你最终可以返回每 10 行不需要的 2MB
  2. 明确使用什么数据
  3. 指定列意味着删除列时会出错
  4. 查询处理器必须做更多的工作 - 弄清楚表中存在哪些列(感谢 @vinodadhikary)
  5. 你可以更轻松地找到列的使用位置
  6. 如果使用 SELECT *,则会获得连接中的所有列
  7. 你无法安全地使用序数引用(尽管使用列的序数引用本身就是不好的做法)
  8. 在使用 TEXT 字段的复杂查询中,查询可能会因不太理想的临时表处理而变慢