sql的where查询条件同时使用and、or,注意使用括号括住查询条件,不然查询结果与预想的会不一样。
如下sql,自己本意想查询asset_status = 'SETTLED'、settle_date 为空,或者asset_status = 'SETTLED'、settle_type为空的数据
结果查询结果当中,asset_status有overdue的数据,与预期不符
SELECT * FROM acc_cus.cus_repay_summary
WHERE project_no = 'BUWS10043190001'
AND asset_status = 'SETTLED'
AND settle_date IS NULL OR settle_type IS NULL;
做以下改进后,查询结果与预期一致。
SELECT due_bill_no FROM acc_cus.cus_repay_summary
WHERE (settle_date IS NULL OR settle_type IS NULL)
AND project_no = 'BUWS10043190001'
AND asset_status = 'SETTLED';
原因
MySQL中,AND的执行优先级高于OR。也就是说,在没有小括号()的限制下,总是优先执行AND语句,再执行OR语句。
select * from table where 条件1 AND 条件2 OR 条件3;
等价于
select * from table where ( 条件1 AND 条件2 ) OR 条件3;
假设下表要查询 sex = 2 且年龄为17或18的人员信息
create table user_info(
id int auto_increment primary key comment '主键id',
name varchar(20) comment '姓名',
sex tinyint comment '性别 1 男 2 女',
age int comment '年龄',
id_card varchar(20) comment '身份证号',
create_time datetime comment '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC comment '用户信息表';
insert into user_info(name, sex, age, id_card, create_time) values ('小明',1,18,null,now()),
('小红',2,16,null,now()),
('小张',1,17,null,now()),
('小花',1,18,null,now()),
('小李',2,16,null,now()),
('小王',1,17,null,now()),
('小白',2,17,null,now()),
('笑笑',1,17,null,now());
这样查询:
select * from user_info where sex = 2 and age = 17 or age = 18;
结果是:
上面的sql查询过程如下:
首先查询:select * from user_info where sex = 2 and age = 17;
然后查询:select * from user_info where age = 18;
所以查询结果当中有sex为1的数据。
修改成:
select * from user_info where sex = 2 and (age = 17 or age = 18);
查询结果
修改后的sql,先查询sex = 2
在此基础上再查询age = 17 or age = 18
小结
sql查询where条件中同时使用and、or,就使用括号把or条件括起来。
参考:https://blog.csdn.net/weixin_43846827/article/details/125083886
标签:17,age,sql,sex,查询,注意事项,now,where From: https://www.cnblogs.com/Uni-Hoang/p/17028670.html