SELECT * 能快速查出表中全部字段,但生产环境应避免使用,因其导致性能损耗、耦合风险和安全隐忧;推荐明确列出所需字段,如 SELECT id, username FROM users。

直接用 SELECT * 就能查出表里全部数据,但不是所有情况都适合这么写。
星号在 SELECT 中的作用
星号(*)是通配符,代表“当前表中所有字段”。执行 SELECT * FROM users; 时,MySQL 会返回 users 表定义里的全部列,顺序按建表时的字段顺序排列。
- 语法简洁,适合快速查看表结构或调试时临时使用
- 不依赖你是否记得具体字段名,省去手动罗列的步骤
- 注意:它查的是“物理定义的所有列”,包括你可能根本不需要的字段(比如大文本、二进制、冗余日志字段)
带条件查全部字段
星号可以和 WHERE 配合,只取满足条件的完整行:
SELECT * FROM products WHERE status = 'on_sale';SELECT * FROM orders WHERE created_at >= '2025-12-01';- 字符串值必须用单引号包裹,日期格式推荐
'YYYY-MM-DD'或完整时间戳
为什么生产环境要慎用 *
看似方便,实际容易带来三类问题:
-
性能损耗:多查了不用的字段(如
description TEXT),增加磁盘 I/O、网络传输和内存占用 - 耦合风险:表结构一旦新增或重排字段,应用层接收到的列顺序/数量可能意外变化,引发解析错误
-
安全隐忧:可能无意中暴露敏感字段(如
password_hash、id_card),尤其在 API 直接透出查询结果时
更稳妥的替代做法
明确写出需要的字段,哪怕看起来多打几个字:
- 查用户基本信息:
SELECT id, username, email, created_at FROM users; - 配合排序分页获取最新几条:
SELECT title, author, publish_time FROM articles ORDER BY publish_time DESC LIMIT 10; - 不确定字段名?先用
DESC users;或SHOW COLUMNS FROM users;看结构










