首页 > 数据库 >sql 中where条件同时使用and和or注意事项

sql 中where条件同时使用and和or注意事项

时间:2023-01-16 11:56:22浏览次数:61  
标签:17 age sql sex 查询 注意事项 now where

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;

image

做以下改进后,查询结果与预期一致。

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';
	

image

原因

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;

结果是:

image

上面的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);

查询结果
image

修改后的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

相关文章

  • Mysql备份数据库结构和数据的脚本
    echo取日期、时间变量值setyy=%date:~0,4%setmm=%date:~5,2%setdd=%date:~8,2%if/i%time:~0,2%lss10sethh=0%time:~1,1%if/i%time:~0,2%geq10set......
  • MySQL中的any_value()函数
    在工作中第第一次接触到any_value()函数,自己去了解这个函数的作用。简单来说,在MySQL5.7之后,如果有使用groupby对字段A、B……分组,那么select后面的查询项必须包含group......
  • Mysql:索引失效的常见场景
    索引失效的常见场景不符合最佳左前缀原则比如说现在创建一个联合索引:index_union(name,age),然后你的select语句是这样的select*fromuserwhereage=18此情况下......
  • sql md5
    sqlmd5最简单例子selectMD5('0j46o1112665989')asmdd有时候需要将多个字符串拼接selectMD5(CONCAT('0j46o','1112665989'))行mdd51gU89+XO93zUEg4w39N7U0A==将MD5的......
  • mysql mgr demo
    dockercompose配置services:db:container_name:mgr-db-0image:mysql:8.0restart:alwaysenvironment:MYSQL_ROOT_PASSWORD:'123456'......
  • where T: class的解释
    classA<T>whereT:new() 这是类型参数约束,where表名了对类型变量T的约束关系。whereT:A表示类型变量是继承于A的,或者是A本省。whereT:new()指明了创建T的实例应该使......
  • SQLServer中常用关键字
    SQL中建库,建表--1.创建一个数据库createdatabaseSchool;--删除数据库dropdatabaseSchool;--创建数据库的时候指定一些选项。createdatabaseSchoolonprimary......
  • Mysql:explain
    explainmysql提供了一种方式,目的是为了让我们知道sql的执行顺序、索引使用情况、执行效率的情况tabletable是展示执行计划过程中,会使用到的表。执行explain出现的每条......
  • 【学习日志】MySQL分表与索引的关系
    什么情况下需要分表呢?分表又能解决什么问题呢?一般情况下分表的直接原因是数据量太大了,比如一张表一共只有1w条数据,确实没必要分表。为什么数据量大了就需要分表呢?首先得看......
  • sql模块
                     ......