SELECT 最简形式怎么写
不加任何修饰的
SELECT语句只能用于常量或表达式,不能直接查表。比如
SELECT 1 + 1;或
SELECT NOW();是合法的;但
SELECT *;单独执行会报错
ERROR 1096 (HY000): No tables used。
真正查数据必须带
FROM子句,哪怕只查一个表:
SELECT * FROM users;
常见错误是漏掉
FROM,尤其在快速测试时容易手误。
WHERE 条件里字符串和数字怎么写才安全
MySQL 会隐式转换,但依赖它容易出问题。比如
WHERE id = '123'看似没问题,但如果
id是
BIGINT类型,而传入超长字符串(如
'123abc'),MySQL 可能截断后匹配,也可能报错,行为不稳定。
正确做法是类型严格对应:
数字字段用纯数字字面量:WHERE age = 25字符串字段用单引号包裹:
WHERE name = '张三'避免用双引号,除非已设置
SQL_MODE包含
ANSI_QUOTES日期建议用标准格式字符串:
WHERE created_at >= '2024-01-01',不要用函数包裹条件(如
DATE(created_at) = '2024-01-01')以免索引失效
ORDER BY 和 LIMIT 的位置与性能影响
ORDER BY必须在
WHERE之后、
LIMIT之前;
LIMIT必须在最后。顺序写错会直接报语法错误。
性能上要注意:
ORDER BY字段如果没有索引,大表排序会非常慢,可能触发
Using filesort
LIMIT 10不代表只扫描 10 行——MySQL 仍需先找到所有满足
WHERE的行,再排序取前 10 分页深翻(如
LIMIT 10000, 20)效率低,应改用游标方式(基于上一页最大
id查询)
SELECT 中的 NULL 和空字符串容易混淆的点
NULL不等于空字符串
'',也不等于数字
0。用
=判断
NULL永远返回
NULL(即 false),必须用
IS NULL或
IS NOT NULL。
实际查询中常见陷阱:
WHERE email = ''查不到
NULL邮箱,要分开写:
WHERE email = '' OR email IS NULL
COALESCE(email, '未知')可以把
NULL转成默认值,但对
''无效 聚合函数如
COUNT(email)会忽略
NULL,但不会忽略
''
建表时就该明确字段是否允许
NULL,避免业务逻辑里反复处理两种“空”状态。
