MySQL 5.7之JSON特性

    Mysql 5.7之后开始支持Json格式的原生字段类型,现将json新特性作如下整理,仅供参考。

JSON函数的完整列表:

Mysql官方给出的json相关的函数,完整列表如下:

https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html  json字段函数说明。

 

分类

函数

描述

示例

结果展示

创建JSON

JSON_ARRAY

创建JSON数组

JSON_ARRAY(1,2)

[1, 2]

    •  

JSON_OBJECT

创建JSON对象

JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','这是第一条测试objcet的记录')

{"id": 1541560547, "remark": "这是第一条测试objcet的记录"}

    •  

JSON_QUOTE

将json转成json字符串类型

JSON_QUOTE('[1,2]')

"[1,2]"

查询JSON

JSON_CONTAINS

判断是否包含某个JSON值

JSON_CONTAINS(`json_arr_test`,'[1]')

    •  

JSON_CONTAINS_PATH

判断某个路径下是否包含json值

JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b')

见下

    •  

JSON_EXTRACT

提取JSON值

JSON_EXTRACT(`json_arr_test`,'$[1]') || `json_obj_test`->'$.id'

2 其中,如果参数为'$',则返回整个json数组

    •  

column->path

json_extract的简洁写法,

`json_obj_test`->'$.id',MySQL 5.7.9开始支持

 

    •  

JSON_KEYS

提取json中的键值为json数组

JSON_KEYS(`json_obj_test`)

["id","remark"]

    •  

JSON_SEARCH

按给定字符串关键字搜索json,返回匹配的路径

JSON_SEARCH(`json_arr_test`,「'one'|'all'」,'01278923')

"$[2].code"

修改JSON

JSON_APPEND

废弃,MySQL 5.7.9开始改名为json_array_append

 

 

    •  

JSON_ARRAY_APPEND

末尾添加数组元素,如果原有值是数值或json对象,则转成数组后,再添加元素

JSON_ARRAY_APPEND(`json_arr_test`,'$',JSON_OBJECT('code','01278923','name','Wyao'))

注意:插入之前要确保字段不为null,否则插入不成功。

[1,2,{"code":"01278923","name":"Wyao"}]

    •  

JSON_ARRAY_INSERT

向指定位置插入数组元素

JSON_ARRAY_INSERT(`json_arr_test`,'$[2]',JSON_OBJECT('course_code','02','course','Math'))

[3,4,{"course":"Math","course_code":"02"}]

    •  

JSON_INSERT

插入值(如果不存在则插入新值,如果存在则不作操作。)

JSON_INSERT(`json_obj_test`,'$.id',012923,'$.status',1)

因为id值已存在,所以无法插入新值。

{"id":1541560547,"remark":"这是第一条测试objcet的记录","status":1}

    •  

JSON_MERGE

合并JSON数组或者对象

JSON_MERGE_PRESERVE(`json_arr_test`->'$[0]',`json_arr_test`->'$[1]')

 

    •  

JSON_REMOVE

删除JSON数据

JSON_REMOVE(`json_arr_test`,'$[0]')

 

    •  

JSON_REPLACE

替换值(只对存在的key有效。)

JSON_REPLACE(`json_arr_test`,'$[0]','[true, false]')

[4] => ["[true,false]"]

    •  

JSON_SET

设置值,如果存在,则覆盖值;如果不存在,则新增值。

JSON_SET(`json_arr_test`,'$[0]','Wyao','$[1]','[true,false]')

["[true,false]"] => ["Wyao","[true,false]"]

    •  

JSON_UNQUOTE

去除JSON字符串的引号,将值转换成string类型。(去掉引用(引号),返回一个utf8mb4格式的字符串)

JSON_UNQUOTE(`json_arr_test`)

 

JSON属性

JSON_DEPTH

返回JSON文档的最大深度

JSON_DEPTH(json_obj_test) 【key的深度】

 

    •  

JSON_LENGTH

返回JSON文档的最大长度

JSON_LENGTH(json_obj_test) 【key的长度】

 

    •  

JSON_TYPE

返回JSON值的类型

JSON_TYPE(json_arr_test)

 

    •  

JSON_VALID

判断是否为合法JSON文档

JSON_VALID(json_arr_test)

Returns 0 or 1 to indicate whether a value is valid JSON. Returns NULL if the argument is NULL.

注释:

  • JSON_CONTAINS_PATH:【JSON_CONTAINS_PATH(`json_obj_test`,「'one'|'all'」,'$.remark','$.b')】
    • 'one': 1 if at least one path exists within the document, 0 otherwise.(至少有一个在此json(`json_obj_test`)段中,没有返回0)
      • SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b');
    • 'all': 1 if all paths exist within the document, 0 otherwise.(变量全部在此JSON(`json_obj_test`)段中,否则查询为0)
      • SELECT `operator`,`json_arr_test`FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
  • JSON_EXTRACT:【JSON_EXTRACT(`json_obj_test`,'$.id') <=> `json_obj_test`->'$.id'】In MySQL 5.7.9 and later
    • SELECT `id`, `operator`, JSON_EXTRACT(`json_obj_test`,'$.id') FROM lnmp ORDER BY `json_obj_test`->'$.id';
    • SELECT `id`, `operator`, `json_obj_test`->'$.id' FROM lnmp ORDER BY `json_obj_test`->'$.id';
          • UPDATE lnmp SET `name`="Wyaooo" WHERE `json_obj_test`->'$.id' = 1541560547;

            严格控制变量的数据类型,string类型一定要加引号

  • JSON_SEARCH:【】
    • 'one': The search terminates after the first match and returns one path string. It is undefined which match is considered first.(返回匹配到的第一个元素的位置)
    • 'all': The search returns all matching path strings such that no duplicate paths are included. If there are multiple strings, they are autowrapped as an array. The order of the array elements is undefined.(返回匹配到的所有的元素的位置)

JSON_INSERT、JSON_REPLACE、JSON_SET三者的比较:

(1)JSON_SET()替换现有值,并添加新的值;

(2)JSON_INSERT()添加新值,但是并不会替换已经存在的值;

(3)JSON_REPLACE()只用来替换已经存在的值,否则不做操作。 

相关示例SQL语句如下:

DROP TABLE IF EXISTS `lnmp` ;
CREATE TABLE `lnmp` (
  `id`  INT(4) NOT NULL AUTO_INCREMENT,
  `operator` VARCHAR(8) NOT NULL DEFAULT '',
  `json_arr_test` JSON ,
  `json_obj_test` JSON ,
  PRIMARY KEY (`id`)
);
DESC `lnmp`;
SELECT * FROM lnmp;
INSERT INTO `lnmp` (`operator`, `json_arr_test`, `json_obj_test`) VALUES ('Mr.Wang',JSON_ARRAY(1,2),JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','这是第一条测试objcet的记录'));
INSERT INTO `lnmp` (`operator`, `json_arr_test`, `json_obj_test`) VALUES ('Mr.Zhang',JSON_ARRAY(3,4),JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','大江东去浪淘尽'));
SELECT JSON_QUOTE('[1,2]');
SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS(`json_obj_test`,'["这是第一条测试objcet的记录"]','$.remark');
SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
SELECT `id`, `operator`, JSON_EXTRACT(`json_obj_test`,'$.id') FROM lnmp ORDER BY `json_obj_test`->'$.id';
SELECT `id`, `operator`, `json_obj_test`->'$.id' FROM lnmp ORDER BY `json_obj_test`->'$.id';
ALTER TABLE `lnmp` ADD COLUMN `name` VARCHAR(8) DEFAULT '' COMMENT '操作人姓名' AFTER `operator`;
UPDATE lnmp SET `name`='wyaooo' WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_arr_test`=JSON_ARRAY_APPEND(`json_arr_test`,'$',JSON_OBJECT('code','01278923','name','Wyao')) WHERE `json_obj_test`->'$.id' = 1541560547;
SELECT JSON_KEYS(`json_obj_test`) FROM `lnmp` WHERE `json_obj_test`->'$.id' = 1541560547;
SELECT JSON_SEARCH(`json_arr_test`,'one','01278923') FROM lnmp;
UPDATE lnmp SET `json_arr_test` = JSON_ARRAY_INSERT(`json_arr_test`,'$[2]',JSON_OBJECT('course_code','02','course','Math')) WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_obj_test` = JSON_INSERT(`json_obj_test`,'$.id',012923,'$.status',1) WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_arr_test` = JSON_MERGE_PRESERVE(`json_arr_test`->'$[0]',`json_arr_test`->'$[1]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_REMOVE(`json_arr_test`,'$[0]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_REPLACE(`json_arr_test`,'$[0]','[true, false]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_SET(`json_arr_test`,'$[0]','Wyao','$[1]','[true,false]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_UNQUOTE(`json_arr_test`) WHERE `json_obj_test`->'$.id' = 1541574430;
SELECT `id`, `json_arr_test` FROM lnmp WHERE `json_obj_test`->'$.id' = 1541574430;
SELECT JSON_DEPTH(json_obj_test) FROM lnmp;
SELECT JSON_LENGTH(json_obj_test) FROM lnmp;
SELECT JSON_TYPE(json_arr_test) FROM lnmp;
SELECT JSON_VALID(json_arr_test) FROM lnmp;

 

你可能感兴趣的:(sql)