关于MySQL中AND和OR的优先级的问题

SQL比知必会一书中写到:在使用AND和OR的时候,尽量用括号使语句的意思表达明白。

Mysql数据库会优先处理AND操作符

我们探究下这个问题

实际表数据

关于MySQL中AND和OR的优先级的问题

语句如下:

select * from book where bid in (1,3,4) or  bname like 'Java%' and price = 30

关于MySQL中AND和OR的优先级的问题

因为Mysql先处理AND操作符,所以先判断bname like 'Java%' and price = 30,没有符合该条件的记录,和bid in (1,3,4)做或运算,结果如图所示。

用另一种情况验证一下。

交换AND和OR的顺序

select * from book where bid in (1,3,4) and  bname like 'Java%' or price = 30

关于MySQL中AND和OR的优先级的问题

先处理bid in (1,3,4) and  bname like 'Java%',查询出bid=1和3两条记录,price = 30查询出bid=7的记录,并集如图所示。

综上两种情况,Mysql是优先处理AND操作符

附录:

建表语句

CREATE TABLE `book` (
  `bid` char(32) NOT NULL,
  `bname` varchar(100) DEFAULT NULL,
  `price` decimal(5,1) DEFAULT NULL,
  `author` varchar(20) DEFAULT NULL,
  `image` varchar(200) DEFAULT NULL,
  `cid` char(32) DEFAULT NULL,
  PRIMARY KEY (`bid`),
  KEY `cid` (`cid`),
  CONSTRAINT `book_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据sql:

INSERT INTO `book` VALUES ('1', 'Java编程思想(第4版)', '75.6', 'qdmmy6', 'book_img/9317290-1_l.jpg', '1');
INSERT INTO `book` VALUES ('2', 'Java核心技术卷1', '68.5', 'qdmmy6', 'book_img/20285763-1_l.jpg', '1');
INSERT INTO `book` VALUES ('3', 'Java就业培训教程', '39.9', '张孝祥', 'book_img/8758723-1_l.jpg', '1');
INSERT INTO `book` VALUES ('4', 'Head First java', '47.5', '(美)塞若', 'book_img/9265169-1_l.jpg', '1');
INSERT INTO `book` VALUES ('5', 'JavaWeb开发详解', '83.3', '孙鑫', 'book_img/22788412-1_l.jpg', '2');
INSERT INTO `book` VALUES ('6', 'Struts2深入详解', '63.2', '孙鑫', 'book_img/20385925-1_l.jpg', '2');
INSERT INTO `book` VALUES ('7', '精通Hibernate', '30.0', '孙卫琴', 'book_img/8991366-1_l.jpg', '2');
INSERT INTO `book` VALUES ('8', '精通Spring2.x', '63.2', '陈华雄', 'book_img/20029394-1_l.jpg', '2');
INSERT INTO `book` VALUES ('9', 'Javascript权威指南', '93.6', '(美)弗兰纳根', 'book_img/22722790-1_l.jpg', '3');