应明确指定SELECT字段而非使用*,以提升性能、保障安全、避免歧义;多表JOIN需加表别名前缀;表达式与函数结果须用AS指定别名;可借助工具生成字段列表,但禁止运行时拼接SQL。

SELECT 后面直接写字段名,别用 *
SELECT * 看起来省事,但实际会拖慢查询、暴露不该查的字段(比如密码哈希、内部状态码),还可能让应用层因字段顺序变化而崩。真要只查指定字段,就老老实实把名字列出来,用英文逗号分隔:SELECT id, name, created_at。
- 字段名大小写敏感与否取决于数据库:MySQL 在 Linux 下区分,PostgreSQL 始终小写化未加引号的字段,SQL Server 默认不敏感
- 别漏掉表别名前缀——多表 JOIN 时
SELECT u.id, o.amount比SELECT id, amount更安全,避免歧义报错Column 'id' is ambiguous - 如果字段是表达式或函数结果,记得加别名:
SELECT COUNT(*) AS total_count,否则某些 ORM 或导出工具会拿不到列名
带计算或函数的字段怎么写
SELECT 后不仅能写原始字段,还能放表达式、内置函数、甚至子查询(只要单值)。关键是要保证每个“列”有明确含义和可读名。
- 字符串拼接:
SELECT CONCAT(first_name, ' ', last_name) AS full_name(MySQL);PostgreSQL 用first_name || ' ' || last_name - 时间处理:
SELECT DATE(created_at) AS date_only,把2024-05-20 14:30:00截成2024-05-20 - 条件计算:
SELECT price * (1 - discount_rate) AS final_price,别在应用层重复算,也别漏括号导致运算优先级错误 - 注意 NULL 参与运算结果仍是 NULL——
SELECT price + tax如果任一为 NULL,结果就是 NULL,必要时用COALESCE(price, 0)填补
字段太多写起来麻烦?用工具生成,别手敲
手动列几十个字段极易漏、易错位、难维护。与其硬扛,不如利用数据库客户端或命令行工具自动生成:
- MySQL 命令行里先
DESCRIBE table_name看字段列表,复制粘贴后删掉不需要的 - DBeaver / TablePlus 等 GUI 工具右键表 → “Generate SQL” → “SELECT”,勾选要的字段
- 用
INFORMATION_SCHEMA.COLUMNS动态拼接(慎用于生产环境):SELECT GROUP_CONCAT(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'users' AND column_name NOT IN ('password_hash', 'deleted_at') - 别把这种生成逻辑塞进应用代码里——运行时拼 SQL 易 SQL 注入,且失去语法校验
字段越少,网络传输越轻,数据库缓存命中率越高,应用反序列化越快。但别为了“只查几个字段”就把关联数据全拆成多次查询——N+1 问题比多传几个字段更伤性能。该 JOIN 的还得 JOIN,只是 SELECT 后只留真正需要的。

















