关于MySQL中AND和OR的优先级的问题
SQL比知必会一书中写到:在使用AND和OR的时候,尽量用括号使语句的意思表达明白。
Mysql数据库会优先处理AND操作符
我们探究下这个问题
实际表数据
语句如下:
select * from book where bid in (1,3,4) or bname like 'Java%' and price = 30
因为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
先处理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');