应显式列出SELECT字段而非用*,避免冗余数据、结构变动风险、覆盖索引失效;注意大小写、中文/特殊字符需反引号;JOIN时同名字段须用别名;PHP中始终用字段名而非数字索引访问结果;WHERE/ORDER BY/GROUP BY需兼顾兼容性与SQL标准;NULL值须显式判断,优先用COALESCE设默认值。

SELECT 语句里只写需要的字段名,别用 *
直接在 SELECT 后列出具体字段,比如查用户表的姓名和邮箱:SELECT name, email FROM users。用 不仅多传无用数据,还可能因表结构变动导致程序出错(比如新增了大字段 avatar_blob,或字段重命名)。如果后续加了索引覆盖字段, 还会让优化器无法走覆盖索引。
- 字段名区分大小写取决于数据库配置(MySQL 默认不区分,但列别名、严格模式下要注意)
- 中文字段名或含特殊字符必须用反引号包裹:
user_name - 避免字段别名和原字段名冲突,尤其在 JOIN 场景下:
SELECT u.name AS name, o.name AS order_name
PHP 中用 PDO 或 MySQLi 获取指定列结果时,字段顺序以 SQL 为准
PDO 默认返回关联数组(PDO::FETCH_ASSOC),键名就是 SELECT 中写的字段名;若混用数字索引(如 PDO::FETCH_BOTH),下标 0 对应第一个字段,不是表里物理顺序。MySQLi 的 mysqli_fetch_assoc() 同理。
- 错误写法:
echo $row[0]—— 万一 SQL 改成SELECT email, name,逻辑就乱了 - 正确做法始终用字段名访问:
echo $row['name'] - 如果字段来自多个表且同名(如
users.id和orders.id),必须用别名:SELECT u.id AS user_id, o.id AS order_id
WHERE 条件中引用的字段,必须在 SELECT 列表里显式声明(除非只用于过滤)
这个容易被忽略:SELECT 列表本身不影响 WHERE 的可用字段,但如果你打算在 PHP 中复用查询字段做条件拼接,或者用 ORDER BY、GROUP BY,就得注意 SQL 标准限制。
- MySQL 允许
ORDER BY引用未出现在 SELECT 中的字段(只要在 FROM 表里存在),但 PostgreSQL 不允许,写法不通用 -
GROUP BY在严格模式下要求所有非聚合字段都必须出现在 GROUP BY 子句中,也必须是 SELECT 中出现的字段(或其表达式) - 示例陷阱:
SELECT name FROM users ORDER BY created_at在某些环境会报错,应写成SELECT name, created_at FROM users ORDER BY created_at或改用别名
查出来的字段值可能是 NULL,PHP 中要主动判断
即使数据库字段定义为 NOT NULL,JOIN 或 LEFT JOIN 也可能产生 NULL;另外,函数计算(如 COUNT()、COALESCE())结果也需留意类型。
立即学习“PHP免费学习笔记(深入)”;
-
empty($row['email'])会把'0'、0、false都判为真,不安全 - 推荐用
$row['email'] === null或is_null($row['email'])显式判断 NULL - 如果字段允许为空且业务上需默认值,优先在 SQL 层处理:
SELECT COALESCE(phone, '暂无') AS phone FROM users
字段名拼写错误、大小写不一致、别名覆盖、NULL 处理遗漏——这四个点,比语法本身更容易让查询“看起来正常却结果不对”。











