sql细节之and和or的使用
说明:
之前项目对表有复杂的条件筛选,后面必须通过or和and连接,当时出现了bug,但是好久了,具体什么情况,已经忘了,
但是知道and和or使用需要稍微小心
1.数据库脚本
# 建表语句
CREATE TABLE `demo` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 插入测试数据
insert into demo (id , name , create_time , update_time) values(null , 'root','2020-01-01 22:22:22','2020-02-02 22:22:22');
insert into demo (id , name , create_time , update_time) values(null , 'admin','2020-01-01 22:22:22','2020-02-02 22:22:22');
insert into demo (id , name , create_time , update_time) values(null , 'zs','2020-01-01 22:22:22','2020-02-02 22:22:22');
2.普通查询全表
select * from demo;
±—±------±--------------------±--------------------+
| id | name | create_time | update_time |
±—±------±--------------------±--------------------+
| 1 | root | 2020-01-01 22:22:22 | 2020-02-02 22:22:22 |
| 2 | admin | 2020-01-01 22:22:22 | 2020-02-02 22:22:22 |
| 3 | zs | 2020-01-01 22:22:22 | 2020-02-02 22:22:22 |
±—±------±--------------------±--------------------+
3 rows in set (0.000 sec)
3.全部使用and进行查询
3.1 and的使用
3.1.1 and前后结果都为真
select * from demo where 1=1
select * from demo where 1=1 and 2=2
查出数据
3.1.2 and前后数据都为假
select * from demo where 1 = 2 and 1=2
查不出数据
3.1.3 and前后有至少一个结果为假
select * from demo where 1=1 and 1=2
select * from demo where 1=2 and 1=1
select * from demo where 1=2 and 1=2
查不出数据
说明
and连接查询条件有一个为假就查不出数据
3.2 or的使用
3.2.1 or前后结果都为真
select * from demo where 1=1
select * from demo where 1=1 or 1=1
查出数据
3.2.2 or前后结果都为假
select * from demo where 1=2 or 1=2
查不出数据
3.2.3 or前后结果至少一个结果为假
select * from demo where 1=1 or 1=2
# 查出数据
select * from demo where 1=2 or 1=1
# 查出数据
select * from demo where 1=2 or 1=2
# 查不出数据
3.3 or和and混合使用
select * from demo where 1=1 or 1=2 and 1=2
# 查不出数据
select * from demo where 1=2 or 1=1 and 1=1;
# 查出数据
select * from demo where 1=1 and (1=1 and 1=2);
# 查不出数据
select * from demo where 1=1 or (1=2 and 1=2);
# 查出数据
4.总结
and前后条件都为真结果才为真
or前后条件一个为真结果就为真