多条件SQL DELETE语句AND/OR逻辑错误修正与正确写法
问题分析
原SQL存在两类错误,导致逻辑不符合预期:
- 逻辑优先级错误:SQL中
AND运算符优先级高于OR,未做分组的情况下,实际执行逻辑为(日期在指定区间 AND 姓名以an结尾) OR 姓名以An开头,所有姓名以An开头的记录无论出生日期是否符合要求都会被匹配。 - 基础语法错误:
- 日期常量未加单引号:
2001-10-01会被解析为算术表达式(计算结果为1990),无法按日期值做比较 - 通配符使用错误:SQL中匹配任意长度任意字符的通配符为
%,原语句中使用的…、.不属于SQL通配符,无法实现模糊匹配 OR分支语法错误:OR 'An...'直接写字符串常量,在SQL布尔判断中非空字符串会被判定为真,等价于逻辑恒成立,会进一步扩大匹配范围。
- 日期常量未加单引号:
正确实现方案
通过括号明确条件分组,修正所有语法错误,正确语句如下:
DELETE FROM people WHERE `date` > '2001-10-01' AND `date` < '2010-10-01' AND ( names LIKE '%an' OR names LIKE 'An%' );
注意事项
date是SQL标准保留关键字,建议用反引号包裹,避免不同数据库下的语法冲突- 日期值必须用单引号包裹,才能被正确解析为日期类型常量
- 括号内的两个姓名条件为或关系,整体和外层的日期范围条件为且关系,完全匹配需求逻辑
- 执行删除前强烈建议先替换为查询语句校验匹配结果,确认无错后再执行删除,避免误删:
-- 预校验查询语句 SELECT * FROM people WHERE `date` > '2001-10-01' AND `date` < '2010-10-01' AND ( names LIKE '%an' OR names LIKE 'An%' );
内容的提问来源于stack exchange,提问作者Roman Parkhomenko
相关产品推荐
相关产品推荐

