建表语句如下,为 area 字段 声明为 JSON 类型;
1 | CREATE TABLE `order` ( |
MySQL 中支持 json 对象 和json 数组,他们之间可以相互嵌套;json类似map,在java中json就是map得实现类,初学者若不懂何为json,就当作map来用,即储存 key - value 形式得数据结构;注意点是 json 数据 得key 必须是字符串,可以有key无value;
2.1 插入 josn数据
插入 json 对象,east 得值 为 50 , sourth 值为65 得 json对象;
1 | INSERT INTO `order`(`order_name`, `year`, `area`) |
等效于使用 JSON_OBJECT
函数, 示例如下
1 | INSERT INTO `order`(`order_name`, `year`, `area`) |
插入 json 数组
1 | INSERT INTO `order`(`order_name`, `year`, `area`) |
等效于使用 JSON_ARRAY
函数,示例如下
1 | INSERT INTO `order`(`order_name`, `year`, `area`) |
2.2 查询json数据
使用 column - path 路径符 ->
查询 指定key 得值,
1 | select order_name, area -> '$.east' from `order` |
注意,如果json 数据中不存在 east 得键,则列出为null值
输出如下
1 | --------- ------ |
也可以使用 ->> 符号, 不同之处是使用 ->>
更加直观,输出得json数据最外层不会携带双引号,内层数据中存在双引号不会有反斜杠转义;
1 | select order_name, area ->> '$.east' from `order` |
使用 单引号 代替 双引号
1 | select order_name, area ->> "$.east" from `order` |
我们 也可以使用 JSON_EXTRACT
函数 达到同样得效果;
1 | SELECT order_name,JSON_EXTRACT(area, '$.east') from `order`; |
2.3 修改json数据
使用 JSON_SET
设置 json key 得 值
id = 1 得 area 数据如下
1 | {"north": "55", "south": "66"} |
现在将south 值改为 60 的语句示例如下
1 | update `order` set area = json_set(area, '$[0].south', '60') where id = '1' |
其中 $[0] 代表 json 中的第一个对象 ,以此类推 $[1] 为 josn 中的第二个对象;
示例
1 | ["6","2",{"east": "50", "south": "65"}] |
$[0] 为”6”,$[1] 为 “2” , $[2] 为 {“east”: “50”, “south”: “65”}; $[2].east 为 “50” , 或者 $[2][1]
;
如果上面$[*] 表达式式理解困难也可以使用如下方式
1 | update `order` set area = json_set(area, '$.south', '60') where id = '1' |
tip: 如果更改整个json值 与 平时的更新数据方式一致
2.4 删除json中的数据
使用 json_remove 可以达到效果;
示例: 删除json 中的 south 键
1 | update `order` set area =json_remove(area, '$.south') where id = '1' |
三 json函数
3.5 JSON_INSERT
JSON_INSERT 函数 向 json 中添加新的值,不会改变已经存在的值;
id = 1 的数据如下
1 | {"north": "55"} |
更新语句如下
1 | update `order` set area =JSON_INSERT(area, '$.north', 55 ,'$.south', "60") where id = '1' |
更改结果如下
1 | {"north": "55", "south": "60"} |
3.8 JSON_KEYS
返回json顶级值底下所有key
id = 1 的数据如下
1 | [{"north": "50", "south": "60"}, {"north": "50", "south": "70"}] |
查询json数据中第一个json对象所有的key
1 | select JSON_KEYS(area, '$[0]') from `order` where id = '1' |
输出
1 | ["north", "south"] |