工作时做网站使用软件,织梦网站系统删除,爱站网使用体验,网站asp木马删除数据库相关链接#xff1a;
数据库--数据类型#xff1a;http://t.csdn.cn/RtqMD
数据库--三大范式、多表查询、函数sql#xff1a;http://t.csdn.cn/udJSG
数据库--MySQL增删改查#xff1a;http://t.csdn.cn/xkiti 一、一条sql语句通常包括#xff1a;
select fro…数据库相关链接
数据库--数据类型http://t.csdn.cn/RtqMD
数据库--三大范式、多表查询、函数sqlhttp://t.csdn.cn/udJSG
数据库--MySQL增删改查http://t.csdn.cn/xkiti 一、一条sql语句通常包括
select from join where group by having order by 聚合函数 limit top not and or
二、浅谈执行顺序
1、首先确定一点并不是按照我们写的语句顺序从左—右执行的
2、获取结果集 ---- 指定查询的某些字段 -- 按照某些内容进行排序
首先 执行from join 确定表之间的关系得到初步的-----结果集1
where 对结果集1 进行筛选 得到–结果集2
group by 进行分组 --结果集3
对结果集3进行having筛选得到 ----结果集 4
指定查询的字段:
select 指定需要查询的字段也可以是聚合函数 —结果去重
合并分组结果集并按照order by 的 条件进行排序
如果存在limit 或者top之类的话这是在最后才会执行的 三、实际问题and or
mybatisplus遇到的and和or优先级的问题处理
需求
想在name{ 张三李四王五 } 中查找 密码88888 或者 年龄20的记录
SELECT id,user_name,password,name,age,email,birthday FROM tb_user
WHERE password 88888 OR age 20 AND name IN (张三,李四,王五) java查询代码
使用MyBatisPlus查询
Testpublic void testLogicSelect(){QueryWrapperUser wrapper new QueryWrapper();wrapper.eq(password,88888).or().ge(age,20).in(name,张三,李四,王五);/*** SELECT id,user_name,password,name,age,email,birthday FROM tb_user* WHERE password ? OR age ? AND name IN (?,?,?)*/ListUser userList userMapper.selectList(wrapper);userList.forEach(System.out::println);}
查询结果
看似需求的sql查询代码没问题执行出来就发现问题为什么会有“赵六”
User(id1, userNamezhangsan, password88888, name张三, age18, emailtest1yh.cn, birthday2019-09-26T11:42:01)
User(id2, userNamelisi, password88888, name李四, age20, emailtest2yh.cn, birthday2019-10-01T11:42:08)
User(id3, userNamewangwu, password88888, name王五, age28, emailtest3yh.cn, birthday2019-10-02T11:42:14)
User(id4, userNamezhaoliu, password88888, name赵六, age21, emailtest4yh.cn, birthday2019-10-05T11:42:18)
问题的根本原因就是在于这个 AND 和 OR 的优先级。关系型运算符优先级高到低为NOT AND OR
wrapper.eq(password,88888).or().ge(age,20).in(name,张三,李四,王五);
1. 先执行了后两句.ge(age,20) .in(name,张三,李四,王五);
2. 将1.执行结果和第一句进行or或运算 .eq(password,88888) .or() .ge(age,20) .in(name,张三,李四,王五); 解决方案
这里用到了lambda表达式从格式化后的代码也可以看出运算级别。
代码里的wp名字随便起但是不能是wrapper即不能是wrapper new QueryWrapper();
Testpublic void testLogicSelect() {QueryWrapperUser wrapper new QueryWrapper();wrapper.and(wp - wp //这里的wp名字随便起但是不能是wrapper即不能是wrapper new QueryWrapper();.eq(password, 88888).or().ge(age, 20)).in(name, 张三, 李四, 王五);/*** SELECT id,user_name,password,name,age,email,birthday FROM tb_user* WHERE password ? OR age ? AND name IN (?,?,?)*/ListUser userList userMapper.selectList(wrapper);userList.forEach(System.out::println);} 小结
第一句话从执行顺序中我们可以发现所有的查询语句都是从 FROM 开始执行的。
第二句话在实际执行过程中每个步骤都会为下一个步骤生成一个虚拟表这个虚拟表将作为下一个执行步骤的输入。
第三句话关系型运算符优先级高到低为NOT AND OR 看到这了点个赞再走吧