MySQL如何在WHERE条件中筛选等于指定值或为NULL的记录
问题原因分析
你之前的写法存在三个核心错误,导致返回结果为空:
- 错误1:误用单引号包裹字段名
SQL中单引号用于标记字符串常量,你写的'color' = "red"实际是在比较字符串"color"和"red",而不是取color字段的值做判断,永远不会成立。字段名如果需要转义应该用反引号`包裹,或者直接写字段名不加引号。 - 错误2:用
=判断NULL值
SQL中任何值和NULL做=比较的结果都是UNKNOWN,WHERE子句只会返回判断结果为TRUE的记录,所以color = NULL永远不会匹配到NULL值的记录,判断NULL必须用IS NULL语法。 - 错误3:混淆NULL和空字符串
NULL代表值不存在/未定义,和空字符串""是完全不同的两种值,所以color = ""也无法匹配到NULL记录。
正确写法
以下是几种可行的过滤写法:
- 标准SQL通用写法,兼容性最好,所有SQL数据库都支持:
WHERE `color` = 'red' OR `color` IS NULL
用到你的查询场景中,过滤后就能得到你预期的5条记录:Adam、Craig、Dawn、Edith、Gabriel。
2. MySQL专属简化写法,使用安全等于运算符<=>,可以直接正确匹配NULL值:
WHERE `color` <=> 'red' OR `color` <=> NULL
- 用IFNULL函数做值转换后判断,写法更简洁:
WHERE IFNULL(`color`, 'red') = 'red'
关联查询注意事项
如果你的多表关联用的是LEFT JOIN,请注意过滤条件的位置差异:如果要过滤JOIN后的全部结果集,就把条件写在WHERE子句中;如果要先过滤右表数据再做关联,就把条件写在ON子句中,避免过滤逻辑不符合预期。
内容的提问来源于stack exchange,提问作者zipzit
相关产品推荐
相关产品推荐

