<p>最基础的查询语句是SELECT FROM 表名;,用于获取表中所有字段和行,但需注意性能、权限及稳定性问题,如大表应加LIMIT和ORDER BY,导出宜用专用工具而非直接SELECT 。</p>

直接查表所有数据用 SELECT * FROM 表名
这是最基础也最常用的写法,适用于开发调试、临时查看或小表导出。但要注意:* 会拉取所有字段,如果表有大字段(如 TEXT、BLOB)或字段数极多,可能拖慢查询、占用大量内存或触发客户端超时。
常见错误现象:执行后卡住、MySQL Workbench 显示“正在获取数据…”不动、命令行返回结果异常截断。
- 优先确认表大小:
SELECT table_rows, data_length FROM information_schema.tables WHERE table_schema = '数据库名' AND table_name = '表名'; - 若表行数超过几万,建议加
LIMIT先看前几条:SELECT * FROM users LIMIT 10; - 生产环境避免在无
WHERE条件下查大表,尤其不能在应用代码里直接执行SELECT *全查
查大表时必须加 LIMIT 和 ORDER BY
没 ORDER BY 的 LIMIT 是不稳定的——MySQL 不保证返回哪几行,每次执行可能不同。这对分页、比对、导出都埋了坑。
使用场景:需要快速抽样、验证数据分布、做初步统计。
- 安全写法:
SELECT * FROM orders ORDER BY id LIMIT 100;(假设id是主键或有索引) - 避免写成:
SELECT * FROM logs LIMIT 1000;(无排序,结果不可复现) - 如果表没合适排序字段,至少用主键:
SELECT * FROM products ORDER BY PRIMARY KEY LIMIT 50;(注意不同引擎语法略有差异)
导出全部数据别只靠 SELECT *
SELECT * 在命令行或客户端里看一眼还行,真要导出全量,得走专门工具。手动复制粘贴、截图、甚至用 Excel 拉取,都会丢数据或乱码。
性能与兼容性影响:客户端字符集设置不对时,中文字段显示为 ???;大结果集可能被 MySQL 配置 max_allowed_packet 截断。
- 命令行导出推荐:
mysqldump -u 用户名 -p 数据库名 表名 > table.sql - 若只要 CSV:
mysql -u 用户名 -p -e "SELECT * FROM 表名" 数据库名 | sed 's/\t/,/g' > data.csv(注意字段含逗号时需转义) - Web 界面(如 phpMyAdmin)导出前务必勾选“包含列名”和“使用 UTF-8 编码”
权限不足时 SELECT 会报错 ERROR 1142 (42000): SELECT command denied
不是语法错,是账号没授权。常见于测试账号只给了 INSERT 或 UPDATE,或者 DBA 限制了对敏感表的读取。
检查方式很简单,不用猜:
- 先看当前用户:
SELECT USER(); - 再查权限:
SHOW GRANTS FOR CURRENT_USER; - 如果输出里没有
GRANT SELECT ON `数据库名`.`表名`,那就确实没权限
真正麻烦的是有些表被视图或行级策略(如 MySQL 8.0 的 CREATE POLICY)拦截,这时即使有 SELECT 权限也查不到数据——得去查 information_schema.role_table_grants 或策略定义。


















