Mysql-操作json

  • 表结构 

CREATE TABLE `jsonuse` (
  `data` json DEFAULT NULL,
  `id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
 

  • JSON_OBJECT([KEY, val[, KEY, val] ...])

计算键值对列表(可能为空),并返回包含这些键值对的JSON对象。如果任何键名为NULL或参数为奇数(JSON_OBJECT里面的参数要为偶数),则会发生错误。

INSERT INTO jsonuse VALUES (JSON_OBJECT("name", "王五", "email", "wangwu@qq.com", "age",18),2 );

查看插入的数据:

  • JSON_KEYS(json_doc[, PATH]):

以JSON数组的形式返回JSON对象顶级值中的键,如果给定了path参数,则返回所选路径中的顶级键。返回NULL如果任何参数为NULL,
json_doc参数不是对象,或者path(如果给定)没有找到对象。如果json_doc参数不是有效的json文档,或者path参数不是有效的路径表达式,或者包含*或**通配符,则会发生错误。
如果选定对象为空,则结果数组为空。如果顶级值具有嵌套的子对象,则返回值不包括来自这些子对象的关键帧。
SELECT * FROM jsonuse WHERE id = 4
SELECT JSON_KEYS(DATA,'$.b'),DATA  FROM jsonuse WHERE id = 4 ;

 SELECT JSON_KEYS(DATA),DATA  FROM jsonuse WHERE id = 4 ;

  • JSON_EXTRACT(json_doc, PATH[, PATH] ...) 

返回JSON文档中的数据,从与路径参数匹配的文档部分中选择。如果任何参数为NULL或文档中没有找到值的路径,则返回NULL。如果json_doc参数不是有效的json文档,或者任何path参数都不是有效的路径表达式,则会发生错误。

返回值由路径参数匹配的所有值组成。如果这些参数可能返回多个值,则匹配的值将自动包装为数组,顺序与生成它们的路径对应。否则,返回值为单个匹配值。

整体数据:

SELECT JSON_EXTRACT(DATA, '$.name'),JSON_EXTRACT(DATA, '$.address') FROM jsonuse;

//使用ifnull找到所有data里面包含email属性的行

//关于mysql函数点击此链接

SELECT *  FROM jsonuse WHERE IFNULL (JSON_EXTRACT(DATA, '$.email'),NULL) IS NOT NULL

  • JSON_REMOVE(json_doc, PATH[, PATH] ...)

从JSON文档中删除数据并返回结果。如果任何参数为NULL,则返回NULL。如果json_doc参数不是有效的json文档,或者任何路径参数都不是有效的路径表达式,或者是$,或者包含*或**通配符,则会发生错误。

路径参数从左到右求值。通过计算一条路径生成的文档将成为计算下一条路径的新值。

如果文档中不存在要删除的元素,则不是错误;在这种情况下,路径不会影响文档。

整体数据:

SELECT JSON_REMOVE(DATA,'$.b')FROM jsonuse WHERE id = 4 ;

不会实际删除表中的值

  • JSON_LENGTH(json_doc[, path])

JSON_LENGTH(json_doc[, path])返回 JSON 文档的长度,或者,如果 path给定参数,则返回路径标识的文档中值的长度。NULL如果任何参数是 NULLpath 参数不标识文档中的值,则返回。json_doc如果参数不是有效的 JSON 文档或 path参数不是有效的路径表达式,则会发生错误。在 MySQL 8.0.26 之前,如果路径表达式包含一个*或 **通配符,也会引发错误。

SELECT JSON_LENGTH(data) FROM jsonuse WHERE id = 1;

 JSON_SET(json_doc, path, val[, path, val] ...)

现有对象中不存在的成员。该成员被添加到对象并与新值相关联。

超过现有数组末尾的位置。使用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。

现有数据

 SELECT JSON_SET(data,'$.age',21) FROM jsonuse WHERE id = 1;

 SELECT JSON_SET(data,'$.interesr','playCompuate') FROM jsonuse WHERE id = 1;

JSON_INSERT(json_doc, path, val[, path, val] ...):插入值而不替换现有值。

  • 现有对象中不存在的成员。该成员被添加到对象并与新值相关联。

  • 超过现有数组末尾的位置。使用新值扩展数组。如果现有值不是数组,则将其自动包装为数组,然后使用新值进行扩展。

JSON_REPLACE(json_doc, path, val[, path, val] ...)。

  • 替换 JSON 文档中的现有值并返回结果。如果任何参数是 NULL 则 返回NULLjson_doc如果参数不是有效的 JSON 文档或任何path参数不是有效的路径表达式或包含 或通配符, 则会发生错误 。

JSON_ARRAYAGG(col_or_expr) [over_clause] 

将结果集聚合为单个 JSON数组,其元素由行组成。此数组中元素的顺序未定义。该函数作用于计算结果为单个值的列或表达式。NULL如果结果不包含行,或者发生错误,则 返回 。

over_clause从 MySQL 8.0.14 开始,如果存在 ,此函数将作为窗口函数执行。over_clause第 12.21.2 节,“窗口函数概念和语法”中所述。

SELECT JSON_ARRAYAGG(rolename) FROM sysrole

JSON_OBJECTAGG(key, value) [over_clause] 

将两个列名或表达式作为参数,其中第一个用作键,第二个用作值,并返回一个包含键值对的 JSON 对象。NULL如果结果不包含行,或者发生错误,则返回。NULL如果任何键名是或参数个数不等于 2, 则会发生错误。

over_clause从 MySQL 8.0.14 开始,如果存在 ,此函数将作为窗口函数执行

 SELECT JSON_OBJECT(id,rolename)FROM sysrole

 更多的json函数参考:MySQL :: MySQL 8.0 Reference Manual :: 12.18.1 JSON Function Reference

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想使用 Calcite 的 MySQL-Foodmart-Model.json 模型文件来查询 MySQL 数据库中的 foodmart 数据库,可以按照以下步骤操作: 1. 下载 MySQL-Foodmart-Model.json 模型文件,并将它保存到某个目录下。 2. 安装 Calcite JDBC 驱动程序。您可以从 Calcite 官方网站下载最新版本的 Calcite JDBC 驱动程序。 3. 创建一个 Java 项目,并添加 Calcite JDBC 驱动程序和 MySQL JDBC 驱动程序的依赖。 4. 在项目中创建一个名为 "calcite.properties" 的文件,并将以下内容添加到该文件中: ```properties model = { "version": "1.0", "defaultSchema": "foodmart", "schemas": [ { "type": "custom", "name": "foodmart", "factory": "org.apache.calcite.adapter.jdbc.JdbcSchema$Factory", "operand": { "jdbcDriver": "com.mysql.jdbc.Driver", "jdbcUrl": "jdbc:mysql://localhost:3306/foodmart", "jdbcUser": "root", "jdbcPassword": "password" } } ] } ``` 这个文件告诉 Calcite 如何连接到 MySQL 数据库,并使用 MySQL-Foodmart-Model.json 模型文件来查询 foodmart 数据库。 5. 在 Java 代码中创建一个 Calcite Connection,并使用该连接来执行 SQL 查询。例如: ```java Properties info = new Properties(); info.setProperty("model", "path/to/MySQL-Foodmart-Model.json"); Connection connection = DriverManager.getConnection("jdbc:calcite:", info); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM sales_fact_1997"); // 处理查询结果 ``` 这个代码片段会创建一个 Calcite 连接,并使用 MySQL-Foodmart-Model.json 模型文件来查询 foodmart 数据库中的 sales_fact_1997 表。 以上就是使用 Calcite 的 MySQL-Foodmart-Model.json 模型文件来查询 MySQL 数据库中的 foodmart 数据库的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值