sql时间范围查询(数据库sql语句大全实例)
sql–查询json、时间、字符串的高级用法
本文章总结sql的json、时间格式、字符串判断转换的使用。核心点还是在于json字段的提取(1.5)、时间的比较(2.2,2.3)以及字符串的查询(3.1),其他都算是优化和补充点。
@
目录
1.sql–json使用
1.1.json_array–转成数组
1.2.json_object–转成json对象
1.2.json_quote–转成json
1.3.json_merge–合并json
1.4.json_valid–判断是否为json
1.5.json_extract–提取json(重点*)
1.6.json完整内容
2.sql–时间计算比较
2.1.时间–添加、减少
2.2时间格式转换
2.3统计本年/本月/本周/本日(重点*)
2.4 时间格式总结
3.sql–字符串
3.1.concat–模糊查询
3.2.locate–查找字符串
3.3.if、case、round–优化显示与字段计算
1.sql–json使用
解释一下为什么sql要用到json存储和查询,因为很多时候前端展示内容或者后端存储无用字段过多,所以没必要后台新建太多字段。并且为了方便项目上线后快速排查问题反馈解决办法给用户,故而引入了json来存储和查询,实际开发中库表字段设计成json的情况也比较多。
先给出基本建库查询操作
# sql--建库
create table t_base_info (
id bigint not null primary key auto_increment,
content json
);
# sql--入库
insert into t_base_info (content)
values
(
'{
"author": "huyuqiao-a",
"blog": "https://www.cnblogs.com/meditation5201314/",
"content": [
{"name": "empirefree-01",
"age": 18
},
{"name": "empirefree-02",
"age": 19
},
{"name": "empirefree-03",
"age": 19
}
]
}'
);
1.1.json_array–转成数组
# sql--查询
# json--对象转数组
select json_array(content) from t_base_info
1.2.json_object–转成json对象
#json--对象转json格式--自定义
select json_object('name', 'huyuqiao', 'age', '18', 'profession','java开发工程师')
1.2.json_quote–转成json
#json--引用字符串作为json值
select json_quote('"huyuqiao"')
1.3.json_merge–合并json
#json--合并字符串
select json_merge('{"blog": "www.baidu.com"}', '{"name":"huyuqiao"}')
1.4.json_valid–判断是否为json
#json--判断json格式是否有效--0 表示无效,1 表示有效,null 表示参数为null
select json_valid("huyuqiao"), json_valid('"huyuqiao"'), json_valid(null)
1.5.json_extract–提取json(重点*)
#json--查询json内容(重点)
select
json_extract(content, '$.blog' ) as '个人博客',
json_extract(content, '$.content' ) as '个人信息'
from
t_base_info
1.6.json完整内容
官方文档:
https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
官网上给的语句很多,我挑的是比较常用的几个,主要还是json_extract用的很常见
分类 | 函数 | 描述 |
创建json | json_array | 创建json数组 |
json_object | 创建json对象 | |
json_quote | 将json转成json字符串类型 | |
查询json | json_contains | 判断是否包含某个json值 |
json_contains_path | 判断某个路径下是否包json值 | |
json_extract | 提取json值 | |
column->path | json_extract的简洁写法,mysql 5.7.9开始支持 | |
column->>path | json_unquote(column -> path)的简洁写法 | |
json_keys | 提取json中的键值为json数组 | |
json_search | 按给定字符串关键字搜索json,返回匹配的路径 | |
修改json | json_append | 废弃,mysql 5.7.9开始改名为json_array_append |
json_array_append | 末尾添加数组元素,如果原有值是数值或json对象,则转成数组后,再添加元素 | |
json_array_insert | 插入数组元素 | |
json_insert | 插入值(插入新值,但不替换已经存在的旧值) | |
json_merge | 合并json数组或对象 | |
json_remove | 删除json数据 | |
json_replace | 替换值(只替换已经存在的旧值) | |
json_set | 设置值(替换旧值,并插入不存在的新值) | |
json_unquote | 去除json字符串的引号,将值转成string类型 | |
返回json属性 | json_depth | 返回json文档的最大深度 |
json_length | 返回json文档的长度 | |
json_type | 返回json值得类型 | |
json_valid | 判断是否为合法json文档 |
2.sql–时间计算比较
sql里面最常见的就是时间的查询比较了,下面列出自己平时用的比较多的sql时间比较
2.1.时间–添加、减少
#现在时间增加1分钟
select date_add(now(), interval 1 hour_minute)
#现在时间减少1分钟
select date_sub(now(), interval 1 hour_minute)
2.2时间格式转换
#时间格式转换--年月日 时分秒
select date_format(now(), '%y-%m-%d')
select date_format(now(), '%y-%m-%d %h:%i:%s')
2.3统计本年/本月/本周/本日(重点*)
sql时间比较中最多的应该就是统计本年/本月/本周/本日的时间了
#统计本年/本月/本周/本日数据
#注:这里统计本周的时候多个1是因为美国时间和中国时间不是一样的,需要进行校正,网上很多都没有校正
select
now( ),
to_days( now( ) ),
yearweek( date_format( now( ), '%y-%m-%d' ), 1 ),
year ( now( ) )
where
to_days( now( ) ) = to_days( now( ) )
or yearweek( date_format( now( ), '%y-%m-%d' ), 1 ) = yearweek( now( ), 1 )
or date_format( now( ), '%y%m' ) = date_format( curdate( ), '%y%m' )
or year ( now( ) ) = year ( now( ) )
2.4 时间格式总结
注意:sql时间如下这种
year,month,day,hour,minute,second,microsecond
而且类似这种interval ‘1 2 3 4’day_second都是从右往左根据时间类型看,这种就是1天2小时3分钟4秒,比如如下这种
#比当前时间减少了1天2小时3分钟4秒
select now(), now() - interval '1 2 3 4' day_second
#比当前时间减少了1分钟
select now(), now() - interval '1' hour_minute
下面是sql中时间的所有格式
microsecond
second
minute
hour
day
week
month
quarter
year
second_microsecond
minute_microsecond
minute_second
hour_microsecond
hour_second
hour_minute
day_microsecond
day_second
day_minute
day_hour
year_month
3.sql–字符串
3.1.concat–模糊查询
select now() where now() like concat('%', 'huyuqiao ','%')
3.2.locate–查找字符串
#子串在字符串中第一次出现索引(从1开始数,没找到则返回0)
select locate('qiao', 'huyuqiaoqiao')
3.3.if、case、round–优化显示与字段计算
下面这些是用于优化查询字段的,1可以改成table.column。
# 判断字段: round(number,保留几位有效数字,默认四舍五入)
select
if
( 1 = 1, '是', '否' ) as '状态',
case
1
when 1 then
'扣款'
when 2 then
'奖励'
when 3 then
'投诉'
end 申请类型,
concat( case 1 when 1 then '-' when 2 then '+' when 3 then '-' end, round( 200 / 100, 2 ) ) as 金额
书山有路勤为径,学海无涯苦作舟。程序员不仅要懂代码,更要懂生活,关注我,一起进步。