mysql json查询 简书_MySQL5.7.8 JSON

本文介绍了MySQL从5.7.8版本开始原生支持的JSON类型及其优势,如自动验证和优化存储。详细列举了JSON相关函数,包括json_extract、json_contains等,并通过示例展示了如何插入、查询和更新JSON数据。
摘要由CSDN通过智能技术生成

Mysql从5.7.8版本开始原生支持JSON(JavaScript Object Notation)类型。确切的是MySQL 5.7.7 labs版本开始InnoDB存储引擎已经原生支持JSON格式,该格式不是简单的BLOB类似的替换。

优点如下:

1、自动验证存储在JSON列中的JSON文档。无效的文档产生错误。

2、优化存储格式。JSON文档存储在JSON列,被转换为内部格式,允许快速读取为文档元素。当以后服务器读取这种二进制格式存储的JSON值时,不需要从文本中分析该值。二进制格式的结构允许服务器直接通过键或数组索引查找子对象或嵌套值,而不必在文档中读取子对象或嵌套值之前或之后的所有值。

JSON函数完整列表#

MySQL官方列出json相关的函数,完整列表如下[doc]:

分类

函数

描述

-

将json转成json字符串类型

-

json_extract的简洁写法,MySQL 5.7.9开始支持

-

json_unquote(column -> path)的简洁写法

-

提取json中的键值为json数组

-

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

废弃,MySQL 5.7.9开始改名为json_array_append

-

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

-

插入值(插入新值,但不替换已经存在的旧值)

-

合并json数组或对象

-

替换值(只替换已经存在的旧值)

-

设置值(替换旧值,并插入不存在的新值)

-

去除json字符串的引号,将值转成string类型

-

返回json文档的长度

-

返回json值得类型

-

判断是否为合法json文档

官方文档对全部函数都作了充分解释并提供一定的示例代码。下文挑选了部分函数,演示它们的使用方法。

插入和查询数据#

mysql> CREATE TABLE employees (data JSON);

Query OK, 0 rows affected (0.17 sec)

mysql> INSERT INTO employees VALUES ('{"id": 1, "name": "Jane"}');

Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO employees VALUES ('{"id": 2, "name": "Joe"}');

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM employees WHERE data->'$.id'= 2; -- json路径表达式

+--------------------------+

| data |

+--------------------------+

| {"id": 2, "name": "Joe"} |

+--------------------------+

1 row in set (0.00 sec)

mysql> SELECT * FROM employees WHERE json_extract(data,'$.id') = 2;

+--------------------------+

| data |

+--------------------------+

| {"id": 2, "name": "Joe"} |

+--------------------------+

1 row in set (0.00 sec)

mysql> SET @j = '["a", "b"]';

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT json_extract(@j, '$[0]');

+--------------------------+

| json_extract(@j, '$[0]') |

+--------------------------+

| "a" |

+--------------------------+

1 row in set (0.00 sec)

json路径表达式是json_extract的简洁写法,但存在以下限制[ref]

即,1. 数据源必须是表字段,2. 路径表达式必须为字符串,3. SQL语句中最多只支持一个。

json_contains示例:

mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT json_contains(@j, '{"a": 1}');

+-------------------------------+

| json_contains(@j, '{"a": 1}') |

+-------------------------------+

| 1 |

+-------------------------------+

1 row in set (0.00 sec)

更新数据

json_array_append和json_array_insert示例:

mysql> SET @j = '["a", "b"]';

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT json_array_append(@j, '$', 'c');

+---------------------------------+

| json_array_append(@j, '$', 'c') |

+---------------------------------+

| ["a", "b", "c"] |

+---------------------------------+

1 row in set (0.00 sec)

mysql> SET @scalar = '1';

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT json_array_append(@scalar, '$', 'c');

+---------------------------------+

| json_array_append(@scalar, '$', 'c') |

+---------------------------------+

| [1, "c"] |

+---------------------------------+

1 row in set (0.00 sec)

mysql> SELECT json_array_insert(@j, '$[1]', 'c');

+------------------------------------+

| json_array_insert(@j, '$[1]', 'c') |

+------------------------------------+

| ["a", "c", "b"] |

+------------------------------------+

1 row in set (0.00 sec)

json_replace、json_set和json_insert示例

json_replace:只替换已经存在的旧值

json_set:替换旧值,并插入不存在的新值

json_insert:插入新值,但不替换已经存在的旧值

替换值,json_replace示例

mysql> UPDATE employees

-> SET data = json_replace(data, '$.name', 'Cathy')

-> WHERE data->'$.id' = 2;

Query OK, 1 row affected (0.03 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM employees WHERE data->'$.id'= 2;

+---------------------------+

| data |

+---------------------------+

| {"id": 2, "name": "Cathy"} |

+---------------------------+

1 row in set (0.00 sec)

设置值,json_set示例

mysql> UPDATE employees

-> SET data = json_set(data, '$.name', 'Bill', '$.city', '北京')

-> WHERE data->'$.id'= 2;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM employees WHERE data->'$.id'= 2;

+---------------------------------------------+

| data |

+---------------------------------------------+

| {"id": 2, "city": "北京", "name": "David"} |

+---------------------------------------------+

1 row in set (0.00 sec)

插入值,json_insert示例

mysql> UPDATE employees

-> SET data = json_insert(data, '$.name', 'Will', '$.address', '通州副中心')

-> WHERE data->'$.id'= 2;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM employees WHERE data->'$.id'= 2;

+---------------------------------------------------------------------+

| data |

+---------------------------------------------------------------------+

| {"id": 2, "city": "北京", "name": "David", "address": "通州副中心"} |

+---------------------------------------------------------------------+

1 row in set (0.00 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值