user_name like concat('%', #{userName}, '%') 啥意思
时间: 2024-01-26 13:05:19 浏览: 167
这是一个 SQL 查询语句中的条件过滤语句,它的作用是查找 user_name 字段中包含指定字符串 #{userName} 的所有数据。具体来说,它使用了 SQL 中的 CONCAT 函数将 %(通配符)与 #{userName} 拼接起来作为匹配模式,表示只要 user_name 字段中包含 #{userName} 这个子串即可匹配成功。这种模糊匹配方式在实际开发中非常常见,可以用来实现搜索功能等等。
相关问题
SELECT t.id AS userId, t1.user_name AS userName, t.create_time AS createTime, t1.login_id AS loginId, t1.mobile_phone AS mobilePhone, t.user_status AS userStatus, t1.mailbox AS mailbox, t1.dept_id AS deptId, t3.dept_name AS deptName FROM sys_user t LEFT JOIN sys_user_info t1 ON (t1.login_id = t.login_id) left join sys_dept t3 ON (t1.dept_id = t3.dept_id) <where> t.del_flg = '0' <if test="loginId != null and loginId != ''"> and (t.login_id LIKE CONCAT('%',#{loginId},'%') or t1.user_name LIKE CONCAT('%',#{loginId},'%')) </if> <if test="deptId != null and deptId != ''"> and ( t1.dept_id = #{deptId} or t3.ANCESTORS like CONCAT(#{deptId},',%') or t3.ANCESTORS like CONCAT('%,',#{deptId},',%') or t3.ANCESTORS like CONCAT('%,',#{deptId})) </if> <if test="mobilePhone != null and mobilePhone != ''"> and t1.mobile_phone LIKE CONCAT('%',#{mobilePhone},'%') </if> <if test="userStatus != null and userStatus != ''"> and t.user_status = #{userStatus} </if> <if test="startDate != null and endDate != null"> and t.create_time >= #{startDate} </if> <if test="endDate != null"> and t.create_time <= #{endDate} </if> </where> order by t.create_time desc 帮我优化一下这段sql
这段 SQL 查询语句已经很好了,但是可以根据实际情况进行优化,下面是一些可能的优化建议:
1. 添加索引:可以为 `sys_user` 表的 `login_id` 和 `del_flg` 列以及 `sys_user_info` 表的 `dept_id` 和 `mobile_phone` 列添加索引,这有助于提高查询性能。
2. 使用 EXISTS 替代 LEFT JOIN:可以使用 EXISTS 子查询替代 LEFT JOIN 子查询,因为 EXISTS 子查询只需要判断是否存在满足条件的记录即可,而不需要返回所有匹配的记录集合,这样可以提高查询效率。
3. WHERE 子句中的条件顺序:将常量条件放在 WHERE 子句的前面,变量条件放在后面,这样可以优化查询执行计划。
4. 去掉不必要的括号:可以去掉 WHERE 子句中的一些不必要的小括号,这样可以使 SQL 语句更简洁明了。
下面是优化后的 SQL 查询语句:
```
SELECT t.id AS userId, t1.user_name AS userName, t.create_time AS createTime, t1.login_id AS loginId, t1.mobile_phone AS mobilePhone, t.user_status AS userStatus, t1.mailbox AS mailbox, t1.dept_id AS deptId, t3.dept_name AS deptName
FROM sys_user t
LEFT JOIN sys_user_info t1 ON t1.login_id = t.login_id
LEFT JOIN sys_dept t3 ON t1.dept_id = t3.dept_id
WHERE t.del_flg = '0'
AND t.login_id LIKE CONCAT('%', #{loginId}, '%') OR t1.user_name LIKE CONCAT('%', #{loginId}, '%')
AND t1.dept_id = #{deptId} OR EXISTS (SELECT 1 FROM sys_dept d WHERE d.dept_id = #{deptId} AND t3.ANCESTORS LIKE CONCAT(d.ANCESTORS, '%'))
AND t1.mobile_phone LIKE CONCAT('%', #{mobilePhone}, '%')
AND t.user_status = #{userStatus}
AND t.create_time >= #{startDate}
AND t.create_time <= #{endDate}
ORDER BY t.create_time DESC
```
注意:上述 SQL 查询语句仅供参考,具体优化建议需要根据实际情况进行调整。
<sql id="page_query_condition"> <where> <if test="status != null ">and status = #{status} </if> <if test="userType != null and userType == 'supplierSub'">and user_type = #{userType} </if> <if test="userType == null">and user_type != 'supplierSub' </if> <if test="userName != null ">and UPPER(user_name) like concat(UPPER(#{userName}),'%')</if> </where> </sql>
这是一个基于 MyBatis 框架的分页查询 SQL 片段,其 ID 为 `page_query_condition`。具体含义如下:
- `<where>` 标签用于指定 SQL 语句的查询条件,其中 `<if>` 标签用于根据参数动态生成查询条件。
- `test` 属性指定了参数的判断条件,比如 `status != null` 表示如果 `status` 参数不为 null,则生成查询条件 `and status = #{status}`。
- `#{status}` 是 MyBatis 的占位符,表示将 `status` 参数的值填充到 SQL 语句中。
- `<if test="userType != null and userType == 'supplierSub'">and user_type = #{userType} </if>` 表示如果 `userType` 参数不为 null 且等于 `supplierSub`,则生成查询条件 `and user_type = #{userType}`。
- `<if test="userType == null">and user_type != 'supplierSub' </if>` 表示如果 `userType` 参数为 null,则生成查询条件 `and user_type != 'supplierSub'`。
- `<if test="userName != null ">and UPPER(user_name) like concat(UPPER(#{userName}),'%')</if>` 表示如果 `userName` 参数不为 null,则生成查询条件 `and UPPER(user_name) like concat(UPPER(#{userName}),'%')`,其中 `UPPER()` 函数将 `user_name` 的值转换为大写,`concat()` 函数用于拼接字符串,`%` 表示任意字符。
该 SQL 片段中,根据参数动态生成了查询条件,从而实现了动态查询。在使用该 SQL 片段时,需要将其引用到需要分页查询的 SQL 语句中。
阅读全文