QueryWrapper 条件

发布时间 2023-10-17 15:16:24作者: y_d_g

QueryWrapper
1. eq、ne
2. gt、ge、lt、le
3. between、notBetween
4. like、notLike、likeLeft、likeRight
5. isNull、isNotNull
6. in、notIn
7. or、and
8. orderByAsc、orderByDesc
9. inSql、notInSql (不常用)
10. exists、notExists (不常用)
11 List (不常用)
12 group by 分组(不常用) having:分组之后的条件筛选
13 nested(不常用)

——————————————————————————————————————————————————————————————————————————————————————————————
avg 平均数
sum 求和
max min 最大值 最小值
count 统计记录数

limit 获取前3条数据 limit 0,3 下标从0开始

group by 分组
执行顺序
from -> where -> group by -> having -> select ->order by

// 链式查询 普通
QueryChainWrapper<T> query();
例子
List<UserBean> userBeanList = userService.query()
.eq("sex", "男")
.gt("salary", 7000)
.lt("age", 30).list(); (.list() .one() count() )
返回一个结果列表 返回一个结果 返回数据记录数
——————————————————————————————————————————————————————————————————————————————————————————————
AbstractWrapper 条件构造器

allEq
例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'、 false 对应的 SQL 语句,忽略了 value 等于 null 的条件 忽略了 value 等于 null 的条件

——————————————————————————————————————————————————————————————————————————————————————————————
eq
等于 =
例: eq("name", "老王")--->name = '老王'

——————————————————————————————————————————————————————————————————————————————————————————————
gt
大于 >
例: gt("age", 18)--->age > 18
——————————————————————————————————————————————————————————————————————————————————————————————

ge
于 >=
例: ge("age", 18)--->age >= 18
——————————————————————————————————————————————————————————————————————————————————————————————

lt
小于 <
例: lt("age", 18)--->age < 18
——————————————————————————————————————————————————————————————————————————————————————————————
le
小于等于 <=
例: le("age", 18)--->age <= 18

——————————————————————————————————————————————————————————————————————————————————————————————
between notbetween(加了not 表示取反)
BETWEEN 值1 AND 值2
例: between("age", 18, 30)--->age between 18 and 30 包括18和30

——————————————————————————————————————————————————————————————————————————————————————————————
like (notLike取反)
LIKE '%值%'
例: like("name", "王")--->name like '%王%' 含有“王”的数据

likeLeft (notLikeLeft取反)
LIKE '%值'
例: likeLeft("name", "王")--->name like '%王' 以“王”结尾的数据

likeRight (notLikeRight 取反)
LIKE '值%'
例: likeRight("name", "王")--->name like '王%' //以“王”开头的数据

——————————————————————————————————————————————————————————————————————————————————————————————
isNull (isNotNull取反) 如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。
字段 IS NULL
例: isNull("name")--->name is null

——————————————————————————————————————————————————————————————————————————————————————————————
in (notIn取反)查询某个范围内的数据
例: in("age", 1, 2, 3)--->age in (1,2,3) 实例:查询 年龄 为 1,2,3 的用户信息
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.in("age", 1, 2, 3); // 等价 SQL 语句:user_id in(1, 2, 3)

SELECT * FROM user WHERE uid IN(1,2,'3',)
SELECT * FROM user WHERE (uid=2 OR aid=3 OR aid=5)

——————————————————————————————————————————————————————————————————————————————————————————————
inSql (notInSql 取反) 同上的意思一样 之后可以带上sql语句
字段 IN ( sql语句 )
例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)

实例:查询用户 ID 小于 10 的用户信息列表,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.inSql("user_id", "select user_id from user where user_id<10");

——————————————————————————————————————————————————————————————————————————————————————————————
orderByAsc(实现递增排序) orderByDesc(实现递减排序)

实例:根据用户 ID 和 年龄递增(递减) 排序。
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.orderByAsc("user_id", "age"); 递增
wrapper.orderByDesc("user_id", "age"); (递减)

——————————————————————————————————————————————————————————————————————————————————————————————

exists (notExists 取反) (拼接 EXISTS sql语句
实例:如果在 user_contact 中存在 user_id 等于 1 的记录,则返回 user 表的所有记录。如下
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.exists("select id from user_contact where user_id=1");

——————————————————————————————————————————————————————————————————————————————————————————————

last 追加一个 SQL , 直接指定的 SQL 拼接到 SQL 的最后, 函数只能调用一次
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.last("limit 1,10");

——————————————————————————————————————————————————————————————————————————————————————————————

apply 拼接SQL 它可用于动态的给数据库函数传入参

实例:使用 apply 方法拼接 SQL 语句,如下:
// 拼接:id = 100
apply("id = 100")


apply 函数将使用后面的“2020-10-08”参数替换第一个参数中的 {0}
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.apply("date_format(borthday,'%Y-%m-%d') = {0}", "2020-10-08");
替换之后
wrapper.apply("borthday", "2020-10-08");

——————————————————————————————————————————————————————————————————————————————————————————————
nested 嵌套SQL
实例:查询所有姓黄,性别为男,年龄大于 30,薪水大于 9000 的用户信息,如下:

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.likeRight("name", "黄");
wrapper.nested(new Consumer<QueryWrapper<UserBean>>() {
@Override
public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
userBeanQueryWrapper.eq("sex", "男")
.gt("age", 30).gt("salary", 9000);
}
});

——————————————————————————————————————————————————————————————————————————————————————————————
group by 分组

实例:用户信息表根据 sex 和 age 列进行分组,如下:
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");


-- 统计按 sex 和 age 分组后,每一个 sex 和 age 组合的总薪水
SELECT sex, age, sum(salary) FROM user GROUP BY sex,age;


-- 统计同一个 sex 和 age 的用户数
SELECT sex, age, count(*) FROM user GROUP BY sex,age;


-- 统计同一个 sex 和 age 的用户平均薪水
SELECT sex, age, avg(salary) FROM user GROUP BY sex,age;

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");
wrapper.select("sex, age, sum(salary");

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");
wrapper.select("sex, age, count(*)");

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");
wrapper.select("sex, age, avg(salary) ");

——————————————————————————————————————————————————————————————————————————————————————————————
-- 查询 用户的创建时间是在2023年
SELECT
u.*
from
ts_user u WHERE year(u.create_time) = 2023;

--伪列 :不存在的列 常量的类
--伪表 dual
SELECT 100*200 FROM DUAL;
SELECT now() FROM dual;

--null 的处理
--isXX : 返回值为布尔类型
--方法返回值为boolean 建议命名为isXXX

select *from ts_user u WHERE u.avatat is NULL;
select *from ts_user u WHERE u.avatat is not NULL;
select *from ts_user u WHERE not u.avatat is NULL;

--获取员工的年薪(工资+津贴)*12
--WHERE 1=1 --id =id
--SELECT e.ename ,(e.sal+ IFNULL(E.com,0)*12)from emp e WHERE 1=1;
--mysql 处理方式
--IFNULL(expr1,expr2) ;
--当第一个参数值为 null 取第二个参数为默认值

-- 平均工资大于2000的部门编号
-- SELECT avg(e.sal) FROM emp e WHEN e.deptno is not null
-- group by e.depton
-- HAVING avg(e.sal)>2000

-- or and not 或 与 非

--获取用户的姓名,角色名称
SELECT * FROM ts_user;
SELECT* FROM sys_role;

--连表查询
SELECT r.role_key ,u.id FROM ts_user u, sys_role r WHERE u.id = r.create_by

--99语法
--JOIN 加入
--获取用户的姓名,角色名称

--内链接
SELECT r.role_key ,u.id FROM ts_user u JOIN sys_role r ON (u.id = r.create_by)
--using 两张表中同时要有 id 这个字段,只能使用等值链接
--SELECT r.role_key ,u.id FROM ts_user u JOIN sys_role r USING (id)

--左外连接 LEFT JOIN ts_user 为主表, sys_role 为辅助表 。 sys_role 中的字段 拼接到 ts_user
SELECT r.role_key ,u.id FROM ts_user u LEFT JOIN sys_role r ON (u.id = r.create_by)

--右外连接 LEFT JOIN ts_user 为主表, sys_role 为辅助表 。 sys_role 中的字段 拼接到 ts_user
SELECT r.role_key ,u.id FROM ts_user u RIGHT JOIN sys_role r ON (u.id = r.create_by)

 

-- --avg 平均数
SELECT AVG(lk.`status`) FROM ts_link lk;

-- ----sum 求和
SELECT SUM(lk.`status`) FROM ts_link lk;
-- ----max min 最大值 最小值
SELECT MAX(u.phone_number) FROM ts_user u;
SELECT MIN(lk.`status`) FROM ts_link lk;

-- -- count 统计记录数
select count(*) from ts_user;
select count(u.id) from ts_user u;