mysql查询json字段

本文详细介绍了如何在MySQL中使用JSON数据类型创建表,并通过具体示例展示了如何插入JSON格式的数据,以及如何利用JSON_EXTRACT函数从JSON字段中查询特定信息。

 

建表语句

Create Table

CREATE TABLE `test` (
  `id` int(10) ,
  `user` json DEFAULT NULL COMMENT '用户信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

 

插入数据

需要注意的是,json数据外面需要单引号来区别

INSERT INTO test (id,USER) VALUES(1,'{"name": "tom", "age": 18, "money": 3000}');
INSERT INTO test (id,USER) VALUES(2,'{"name": "jack", "age": 20, "money": 100}');
INSERT INTO test (id,USER) VALUES(3,'{"name": "tony", "age": 21, "money": 100}');
INSERT INTO test (id,USER) VALUES(4,'{"name": "danny", "age": 21, "money": 20}');
INSERT INTO test (id,USER) VALUES(5,'{"name": "janny", "age": 23, "money": 20}');

表数据如下

查询语句

SELECT  id,JSON_EXTRACT(USER,'$.name')FROM test;

下面是查询结果

MySQL 中,查询包含 JSON 数据类型字段的操作可以通过多种方式实现,具体取决于查询的复杂性和需求。以下是一些常见的查询方法和示例: ### 使用 `->` 操作符提取 JSON 字段MySQL 提供了 `->` 操作符来提取 JSON 字段中的特定键值。例如,如果有一个名为 `data` 的 JSON 字段,并且想查询其中的 `email` 键,可以使用如下 SQL 语句: ```sql SELECT id, data->'$.email' AS email FROM users; ``` 该语句将返回 `data` 字段中 `email` 键的值。如果键不存在,则返回 `NULL` [^4]。 ### 使用 `JSON_EXTRACT()` 函数 `JSON_EXTRACT()` 函数用于从 JSON 字段中提取特定路径的值。例如,提取 `data` 字段中的 `avatar` 键值: ```sql SELECT id, JSON_EXTRACT(data, '$.avatar') AS avatar FROM users; ``` 此函数可以用于更复杂的查询条件中,例如匹配特定的值 [^4]。 ### 使用 `JSON_CONTAINS()` 函数 如果需要检查 JSON 字段是否包含某个特定的键值对,可以使用 `JSON_CONTAINS()` 函数。例如,检查 `json_data` 字段是否包含 `{ "id": 1 }`: ```sql SELECT * FROM table_name WHERE JSON_CONTAINS(json_data, '{"id": 1}'); ``` 该函数会返回所有包含指定键值对的记录 [^2]。 ### 使用 `JSON_SEARCH()` 函数 如果需要在 JSON 字段中搜索特定的字符串值,可以使用 `JSON_SEARCH()` 函数。例如,查找 `data` 字段中包含 `'admin'` 的所有记录: ```sql SELECT * FROM users WHERE JSON_SEARCH(data, 'one', 'admin') IS NOT NULL; ``` `'one'` 参数表示只搜索第一个匹配项,也可以使用 `'all'` 来搜索所有匹配项 。 ### 使用 `IN` 查询和分组 在某些情况下,可能需要对 JSON 字段中的某个键进行 `IN` 查询,并按该键进行分组。例如,假设 `detail` 字段中包含 `service` 键,可以使用如下语句: ```sql SELECT JSON_UNQUOTE(JSON_EXTRACT(detail, '$.service')) AS service, COUNT(*) FROM meeting GROUP BY service; ``` 此查询将按 `service` 键的值进行分组,并统计每组的记录数 [^3]。 ### 更新 JSON 字段 更新 JSON 字段时,可以使用 `JSON_REPLACE()`、`JSON_SET()` 或 `JSON_REMOVE()` 函数。例如,更新 `detail` 字段中的 `service` 键值: ```sql UPDATE meeting SET detail = JSON_REPLACE(detail, '$.service', 'new_value') WHERE id = 1001; ``` 此语句将 `id` 为 1001 的记录中的 `service` 键值替换为 `'new_value'` 。 ### 处理 NULL 值 在查询 JSON 字段时,如果字段不存在或值为 `NULL`,可以使用条件判断来处理。例如,在 PHP 中处理返回的 `NULL` 值: ```php $res = $this->connetion->executeQuery("select json_extract(data, '$.email.value') email, json_extract(data, '$.avatar.value') avatar from users")->fetchAll(); $res = array_map(function ($value) { if ($value['email'] == 'null') $value['email'] = null; if ($value['avatar'] == 'null') $value['avatar'] = null; return $value; }, $res); var_dump($res); ``` 此代码将 `email` 和 `avatar` 字段中的 `'null'` 字符串转换为 `NULL` 值 [^4]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值