在MySQL的SELECT、UPDATE、DELETE等语句中,AND和OR是用于组合多个查询条件的核心运算符,两者的组合逻辑直接影响最终筛选出的数据结果,很多查询异常问题都源于对两者优先级和组合规则的不熟悉。

AND和OR的基本作用
AND运算符用于连接多个条件,只有当所有条件都满足时,对应的数据行才会被筛选出来,逻辑上等同于且的关系。OR运算符同样用于连接多个条件,只要其中一个条件满足,对应的数据行就会被筛选出来,逻辑上等同于或的关系。
比如我们要查询学生表中年龄大于18岁并且性别为男的学生,就需要用AND连接两个条件:
-- 查询年龄大于18且性别为男的学生 SELECT * FROM student WHERE age > 18 AND gender = '男';
如果要查询成绩大于90分或者出勤率大于95%的学生,就需要用OR连接条件:
-- 查询成绩大于90或出勤率大于95的学生 SELECT * FROM student WHERE score > 90 OR attendance > 95;
AND和OR的优先级规则
MySQL中AND运算符的优先级高于OR运算符,也就是说在一个查询条件中,会先计算所有AND连接的条件组合,再计算OR连接的条件。这个规则是很多开发者容易忽略的点,也是导致查询结果不符合预期的常见原因。
比如我们想查询年龄小于20岁的女生,或者所有年龄大于25岁的男生,错误的写法可能会写成:
-- 错误写法,不符合预期逻辑 SELECT * FROM student WHERE age < 20 OR gender = '女' AND age > 25 OR gender = '男';
按照优先级规则,上面的语句会先计算gender = '女' AND age > 25,再和前后的OR条件组合,最终逻辑变成了查询年龄小于20岁的学生,或者年龄大于25岁的女生,或者所有男生,和我们的预期完全不符。
正确的组合写法
当我们需要混合使用AND和OR时,一定要用括号明确指定运算的先后顺序,括号的优先级高于所有逻辑运算符,这样可以确保条件按照我们预期的逻辑执行。
还是上面的需求,查询年龄小于20岁的女生,或者所有年龄大于25岁的男生,正确的写法应该是:
-- 正确写法,用括号明确优先级 SELECT * FROM student WHERE (age < 20 AND gender = '女') OR (age > 25 AND gender = '男');
再举一个常见的业务场景,查询订单表中状态为已支付,并且支付金额大于100元,或者支付渠道为官方渠道的订单,正确写法如下:
-- 查询符合条件的订单 SELECT * FROM order_table WHERE status = '已支付' AND (pay_amount > 100 OR pay_channel = '官方渠道');
常见使用注意事项
- 混合使用AND和OR时,务必用括号明确优先级,不要依赖默认的优先级规则,避免后续维护时产生误解。
- 如果OR连接的条件涉及同一字段的多个取值,优先使用IN运算符代替OR,比如查询部门为研发部或者测试部的员工,写成
department IN ('研发部','测试部')比department = '研发部' OR department = '测试部'执行效率更高,可读性也更好。 - 当OR连接的条件过多时,可能会导致查询无法有效使用索引,此时可以考虑将查询拆分为多个子查询后使用UNION合并结果,提升查询性能。
总结
MySQL中AND和OR的组合使用核心要记住两点,一是AND优先级高于OR,二是混合使用时必须用括号明确运算顺序。实际开发中只要遵循这两个原则,再结合业务场景合理选择运算符,就能写出逻辑正确、性能合格的查询语句,避免因为条件组合错误导致的数据问题。