MySQL中 AND 与 OR 的优先级

tech2022-09-30  54

MySQL中 AND 与 OR 的优先级

在一般的编程语言中 AND 与 ``OR 的优先级是相同的,在运算的时候按照顺序从左到右开始运算,如Java,python等,但是在 MySQL 中 对 AND 和 OR 的优先级做了一下调整.使得 AND 的运算优先级高于 OR 的优先级.

在实际执行的过程中,同时遇到 AND 和 OR 运算符的时候,会优先执行 AND 运算符,然后再执行 OR 运算.如下:

SELECT * FROM TABLE t1 WHERE 条件1 AND 条件2 OR 条件3 -- 等价于 SELECT * FROM TABLE t1 WHERE ( 条件1 AND 条件2 ) OR 条件3 ----------------------------------------------------------- SELECT * FROM TABLE t1 WHERE 条件1 AND 条件2 OR 条件3 AND 条件4 -- 等价于 SELECT * FROM TABLE t1 WHERE ( 条件1 AND 条件2 ) OR ( 条件3 AND 条件4 )

举个栗子:

-- ---------------------------- -- Table structure for t1 -- ---------------------------- SET NAMES utf8mb4; DROP TABLE IF EXISTS `t1`; CREATE TABLE `t1`( id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, c1 boolean NULL, c2 boolean NULL, c3 boolean NULL, c4 boolean NULL, PRIMARY KEY(`id`) USING BTREE )ENGINE = InnoDB CHARACTER SET = utf8mb4; -- ---------------------------- -- Records of t1 -- ---------------------------- INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,TRUE,TRUE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,TRUE,TRUE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,TRUE,FALSE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,TRUE,FALSE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,FALSE,TRUE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,FALSE,TRUE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,FALSE,FALSE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(TRUE,FALSE,FALSE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,TRUE,TRUE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,TRUE,TRUE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,TRUE,FALSE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,TRUE,FALSE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,FALSE,TRUE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,FALSE,TRUE,FALSE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,FALSE,FALSE,TRUE); INSERT INTO `t1`(c1,c2,c3,c4) VALUES(FALSE,FALSE,FALSE,FALSE);

查询方式1

SELECT * FROM t1 WHERE c1=TRUE OR c2=TRUE AND c3=FALSE; -- 错误理解 SELECT * FROM t1 WHERE (c1=TRUE OR c2=TRUE) AND c3=FALSE; -- 正确的解析方式 SELECT * FROM t1 WHERE c1=TRUE OR (c2=TRUE AND c3=FALSE);

执行结果:

查询方式2:

SELECT * FROM t1 WHERE c1=TRUE AND c2=FALSE OR c3=TRUE and c4=TRUE; -- 等价于 SELECT * FROM t1 WHERE (c1=TRUE AND c2=FALSE) OR (c3=TRUE and c4=TRUE);

总结

MySQL AND 与 OR 的优先级差异是由于MySQL 为了对查询效率做出的优化,因为和平常认知的同类运算符的运算优先级一致有所不同.故这里是算是一个坑,在编写SQL时需要留意一下.以确保结果与预期保持一致.

参考资料

MySQL中 AND 与 OR 的优先级

最新回复(0)