SELECT 语句最简写法是什么?
能跑起来的最小
SELECT语句就是:
SELECT * FROM table_name;。它不加条件、不排序、不去重,只做最基础的数据拉取。但实际中几乎没人这么用——
*带来性能隐患,字段不可控,还容易因表结构变更导致应用报错。
推荐起步写法:
SELECT id, name, created_at FROM users;。明确列出需要的字段,既提升查询效率,也增强可维护性。
WHERE 条件里 NULL 怎么判断?
直接写
WHERE status = NULL是无效的,MySQL 中
NULL不参与任何等值比较,结果恒为
UNKNOWN,被当作假值过滤掉。
必须用专门的空值判断语法:
WHERE status IS NULL(判断为空)
WHERE status IS NOT NULL(判断非空) 别用
=、
!=或 跟
NULL比较
常见翻车点:前端传参时把空字符串
''和
NULL混为一谈,后端没做区分,查不到数据还找不到原因。
ORDER BY 和 LIMIT 的顺序不能错
ORDER BY必须在
LIMIT之前,否则会报语法错误。MySQL 不支持
LIMIT 10 ORDER BY created_at DESC这种倒置写法。
正确顺序是:
SELECT * FROM logs ORDER BY created_at DESC LIMIT 10;
注意两点:
LIMIT在分页场景下要配合
OFFSET,但大偏移量(如
LIMIT 100000, 20)性能极差,应改用游标分页或延迟关联
ORDER BY字段如果没有索引,会导致 filesort,查得越慢
GROUP BY 后 SELECT 的字段有限制
开启 SQL 标准模式(
sql_mode=STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY)后,
SELECT列表里所有非聚合字段都必须出现在
GROUP BY子句中。
比如这个会报错:
SELECT user_id, name, COUNT(*) FROM orders GROUP BY user_id;—— 因为
name没参与分组,也没套聚合函数。
解决办法只有三个:
把name加进
GROUP BY(适合真正按多字段分组) 用聚合函数包裹,如
MAX(name)或
ANY_VALUE(name)(MySQL 5.7+ 支持) 关掉
ONLY_FULL_GROUP_BY(不推荐,掩盖逻辑问题)
最容易被忽略的是:开发本地关了严格模式,上线后突然报错,连带整个接口崩掉。
