MyBatis与SQL实用技巧 实用语法

news/2024/10/25 9:36:18/

数据库SQL技巧

数值转字符

<select id="getMaterialsList" resultType="java.util.Map">selectmaterial_id materialId,material_name materialName,unit,
specification,
CONVERT(unit_price,CHAR) unitPricefrom trace_agriculture_materialwhere tenant_id = #{tenantId}and organize_code =#{organizeCode}</select>

数据库中unit_price字段类型为decimal(10,2)
展示在前端使用字符串即可,所以使用CONVERT(unit_price,CHAR)将数据库中的decimal精确数值类型转变为字符型,这样前端将字符串展示出来即可。

日期格式化

DATE_FORMAT(ate.plant_end_time,‘%Y-%m-%d’) plantEndTime
这句话是MySQL中的一个DATE_FORMAT函数,它用于将日期时间字段按照指定的格式进行格式化。
在这个例子中,ate.plant_end_time是一个日期时间字段,而’%Y-%m-%d’是你希望将其格式化的格式。DATE_FORMAT函数会将ate.plant_end_time字段的值转换为指定的格式,并将结果命名为plantEndTime。
具体来说,%Y代表四位数的年份,%m代表两位数的月份,%d代表两位数的日期。所以,'%Y-%m-%d’就代表将日期时间格式化为"YYYY-MM-DD"的格式。
举个例子,如果ate.plant_end_time字段的值是"2023-07-19 15:30:00",那么DATE_FORMAT函数就会返回"2023-07-19",并命名为plantEndTime。

"2023~07~19 15:30:00" DATE_FORMAT(your_date_column, '%Y~%m~%d %H:%i:%s')

时间作为过滤条件

select * from demo where createTime between '2018-12-12' and '2018-12-12'

注意这样几乎查不到任何数据,除非时间刚好等于’2018-12-12 00:00:00’
是由于时间精度引起的问题,createTime是精确到时分秒的,但是我们给出的过滤条件只精确到了天,所以在过滤的时候默认认为都是 "00:00:00”
也就相当于select * from demo where createTime between ‘2018-12-12 00:00:00’ and ‘2018-12-12 00:00:00’
可以改为select * from demo where createTime between ‘2018-12-12’ and ‘2018-12-13’
也就是后面的日期加一天
或者是将时间精确到时分秒
mybatis中有如下两种写法:

select * from demo where createTime between CONCAT(#{createTime},' 00:00:00') and CONCAT(#{createTime},' 23:59:59')
select * from demo where createTime between #{createTime and date_add(#{createTime}, INTERVAL 1 day)

数值四舍五入保留2位小数

ROUND(xx, 2) 可以将xx四舍五入保留2位小数
取一个不为null的值
SELECT IFNULL(SUM(TOTAL_WEIGHT),0) as TOTAL_WEIGHT FROM
其中IFNULL(SUM(TOTAL_WEIGHT),0)是取第一个不为null的值,也就是说我们希望查询不到的时候和为0,这样才符合逻辑

条件转换子语句

SELECT employee_name, position, experience,  CASE  WHEN position = 'Manager' AND experience >= 5 THEN 5000  WHEN position = 'Assistant Manager' AND experience >= 3 THEN 4000  ELSE 3000  END AS salary  
FROM employee_table;

员工工资计算:在一个公司中,根据员工的职位和工作经验,工资可能有所不同。你可以使用CASE语句根据职位和工作经验计算员工的工资。

left join

左连接返回左表中的所有行,即使右表中没有匹配的行。它能够查询出左表的所有记录,如果在右表中没有匹配项,则对应的结果字段为NULL。换句话说,左连接是基于左表的每一行,查找右表是否有匹配的行,如果有,则返回匹配的结果,如果没有,则返回NULL。

例如,考虑以下使用场景:一个电子商务网站有用户表(users)和订单表(orders)。用户表存储了所有用户的信息,订单表存储了每个用户的订单信息。现在需要查询所有用户及其对应的订单信息。在这个场景中,可以使用左连接来查询用户表中的所有用户以及他们的订单信息,即使有些用户没有订单。

以下是左连接的使用案例:
SELECT users.id, users.name, orders.order_id, orders.order_date
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

inner join

内连接(inner join)是基于两个表的连接谓词,将两个表的列组合到一起产生新的结果表。只有当至少有一个匹配时,内连接才会返回行。换句话说,内连接只会返回两个表中都存在的匹配行。
内连接的应用场景主要是在需要查询两个或多个表中共有的数据时。例如,假设有两个表,一个是学生表,一个是课程表,它们之间有一个成绩表,需要查询每个学生的成绩,那么就需要使用内连接。
以下是内连接的使用案例:
SELECT students.name, grades.subject, grades.grade
FROM students
INNER JOIN grades ON students.student_id = grades.student_id;
在这个查询中,我们使用了学生表(students)和成绩表(grades)进行内连接,连接条件是两个表中的学生ID(student_id)相等。通过这个查询,我们可以获取每个学生的姓名、科目和成绩。

MyBatis技巧

更新操作

UPDATE user_table user_name = #{user_name}, user_age = #{user_age}, user_email = #{user_email} WHERE id = #{id} 标签在 MyBatis 中常用于动态 SQL 语句的拼接,可以用于处理 null 值和生成不同的 SQL 语句。prefix="SET" 表示生成的 SQL 语句前缀为 "SET",而 suffixOverrides="," 表示生成的 SQL 语句结尾不包含逗号。 在这个 标签内部,可以放置多个 标签来判断相应的条件,根据条件的结果来动态生成 SQL 语句。如果条件判断为 true,则会将对应的列和值拼接到 SQL 语句中。 ## 查询中字段为空的校验 and tenant_id = #{tenantId} 注意这里的写法 不等于null 不等于空字符串

http://www.ppmy.cn/news/1207888.html

相关文章

浅谈Mysql中的窗口函数

MySQL中的窗口函数&#xff08;Window Functions&#xff09;是一种强大的数据处理工具&#xff0c;它允许您在查询结果中执行聚合、分析等操作&#xff0c;同时保留原始数据的行级别信息。窗口函数通常与OVER子句一起使用&#xff0c;以定义要在其上执行聚合操作的窗口&#x…

网站小程序分类目录网源码系统+会员登录注册功能 带完整搭建教程

大家好啊&#xff0c;源码小编今天来给大家分享一款网站小程序分类目录网源码系统会员登录注册功能 。 以下是核心代码图模块&#xff1a; 系统特色功能一览&#xff1a; 分类目录&#xff1a;系统按照不同的类别对网站进行分类&#xff0c;方便用户查找自己需要的网站。用户可…

【STM32】TIM2的PWM:脉冲宽度调制

PWM是一种周期固定&#xff0c;脉宽可调整的输出波形。 0.通用寄存器输出 1.捕获/比较通道1的主电路--中间部分 2.捕获/比较通道的输出部分--输出 3.通用定时器输出PWM原理 PWM波周期或者频率由ARR&#xff08;就是要进递增/递减的值&#xff09;决定&#xff0c;PWM波占空比由…

C++:this指针和构造与析构的运用

目录 一&#xff0c;this指针 二&#xff0c;构造函数 三&#xff0c;析构函数 四&#xff0c;析构与构造的调用 一&#xff0c;this指针 首先&#xff0c;我们先观察以下类&#xff1a; #include <iostream> using namespace std; class Date { public: void In…

httpRequest库代码示例

python # 首先导入所需的库 library(httpRequest) # 设置主机名和端口号 proxy_host <- proxy_port <- # 使用httpRequest库的get函数下载图片 response <- httpRequest(", proxyHost proxy_host, proxyPort proxy_port) # 确保请求成功 if (response$sta…

浅谈多回路电表在荷兰光伏系统配电项目中的应用

1.背景信息 Background&#xff1a; 随着全球化石能源&#xff08;石油&#xff0c;煤炭&#xff09;越来越接近枯竭&#xff0c;污染日趋严重&#xff0c;气候日益变暖等问题&#xff0c;全球多个国家和地区相继出台了法规政策&#xff0c;推动了光伏产业的发展。但是现有的光…

嵌入式养成计划-51----ARM--ARM汇编指令--内存读写指令--程序状态寄存器传输指令--软中断指令--混合编程

一百二十七、内存读写指令 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据 127.1 单寄存器内存读写指令 将一个寄存器中的数值写入到内存&#xff0c;或者从内存中读取数据放在某一个指定寄存器中 127.1.1 指令码和功能 1. 向内存中写&#xff…

文件包含 [ZJCTF 2019]NiZhuanSiWei1

打开题目 代码审计 if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){ 首先isset函数检查text参数是否存在且不为空 用file_get_contents函数读取text制定的文件内容并与welcome to the zjctf进行强比较 echo "<br><h…