您的位置:

mysql中json字段查询详解

MySQL提供了一种新特性——JSON类型。相比于传统的关系型数据库设计,使用JSON更加灵活、方便,是Web和移动应用程序的理想数据存储格式。本文将从多个方面对mysqljson字段查询做详细的阐述。

一、mysqljson字段查询基础

JSON类型是MySQL 5.7版本中引入的,主要是为了解决传统关系型数据库难以存储半结构化数据的问题。JSON字段类型支持读取和修改JSON文档中的数据,如果JSON格式不正确,MySQL会自动检测并返回错误。

JSON类型的字段可以使用标准的MySQL查询语句进行处理,包括SELECT、UPDATE、DELETE、JOIN和WHERE子句等等。JSON类型数据中的每一个键值对都可以作为查询条件。

下面举个例子,假设有个表名为users,其中有个名为info_json的JSON字段。我们需要根据JSON字段中的age属性查询:

SELECT * FROM users WHERE info_json->'$.age'=25;

通过 -> 操作符可以获取json对象中某个key的值,'$'表示查询整个json

如果想根据JSON中的数组查询,则可以使用 JSON_SEARCH() 函数:

SELECT JSON_SEARCH(info_json, 'one', 'green') FROM users;

JSON_SEARCH() 函数会返回数组中满足条件的键的路径。

二、mysqljson字段的查询操作

1、插入JSON对象

在mysql中,可以使用 JSON_OBJECT() 函数创建json对象,并将其插入到表中:

INSERT INTO users (info_json) VALUES (
    JSON_OBJECT(
        'name', 'Tom', 
        'age', 20, 
        'hometown', JSON_OBJECT('province', 'Guangdong', 'city', 'Shenzhen')
    )
);

还可以通过 JSON_ARRAY()函数直接插入JSON数组值:

INSERT INTO employees (info_json) VALUES (JSON_ARRAY('John', 'Doe', '20/01/1980'));

2、查询JSON对象里的属性

查询JSON对象里的属性可以使用 -> 操作符。例如,我们想要查询info_json中name属性的值,可以使用以下命令:

SELECT info_json->'$.name' FROM users WHERE id=10;

如果属性是嵌套在另一个属性中,则可以使用 ->> 操作符:

SELECT info_json->'$.hometown->>$.city' FROM users WHERE id=10;

它会将属性的值作为结果返回。

3、查询JSON数组里的元素

查询JSON数组里的元素可以使用 JSON_EXTRACT() 函数。例如,我们要查询 employees 表中第二个元素:

SELECT JSON_EXTRACT(info_json, '$[1]') FROM employees;

它将会返回 JSON 数组中的第二个元素

4、使用WHERE子句过滤JSON属性或数组元素

可以使用WHERE子句过滤JSON属性或数组元素,比如:

SELECT info_json->"$.type" as type, info_json->"$.value" as value 
FROM mytable 
WHERE info_json->"$.type" = "email"

MySQL 还提供了一些内置函数可以方便使用 JSON 数据类型:

  • JSON_CONTAINS(): 判断是否包含指定的 JSON 数据
  • JSON_MERGE(): 合并多个 JSON 数据
  • JSON_OBJECTAGG(): 聚合组成 JSON 对象

三、mysqljson字段的高级应用

1、JSON搜索引擎

MySQL还有一项高级功能——JSON搜索引擎(JSON Search Engine)

为了加快搜索速度,MySQL使用了基于搜索树的快速查找方式。这种方式可以根据给定的约束条件查找符合条件的JSON对象,然后保留JSON对象中的符合条件的搜索结果。

这种搜索引擎使用了一种结合了B树和B+树的算法来存储索引文件。这种算法既可以使用二分查找获取数据,又可以使用B树来获取数据。

SELECT * FROM user_info 
  WHERE MATCH(userInfoCmt)
  AGAINST('+java +php' IN BOOLEAN MODE);

2、JSON数据转换为MySQL的行

有时候,我们希望JSON数据可以转换成MySQL的行,这样就可以使用标准的SQL查询。MySQL提供了一个叫做generated的列类型,使得这样的转化变得简单。

CREATE TABLE mytable (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
                       json_col JSON NOT NULL,
                       generated_col VARCHAR(255)
                       GENERATED ALWAYS AS (JSON_EXTRACT(json_col, '$.name')) VIRTUAL);

因此,在查询mytable时,就可以使用SELECT来查询数据,并且可以像标准列一样使用下面的WHERE子句:

SELECT * FROM mytable WHERE generated_col = 'test_value';

3、使用JSON数组可重复的key

JSON数组是一种灵活的数据类型,可以包含重复的键。当需要在JSON数组中存储一组键值对时,可以使用下面的语法:

[
   {"key1": value1, key2: value2},
   {"key1": anotherValue1, key2: anotherValue2}
]

这种表示方法有时候可以在爬虫中非常有用,因为可以使用JSON_STORAGE_FREE_FORM或者VIRTUAL列来处理JSON中的重复键:

CREATE TABLE my_table ( 
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data JSON NOT NULL,
  PRIMARY KEY(id)
);

SELECT data->"$.[*].key" AS key,
       data->"$.[*].value" AS value
FROM my_table
WHERE JSON_CONTAINS(JSON_KEYS(data), 'key');

四、总结

本文对mysqljson字段查询进行了详细的阐述,包括基础操作、高级使用,以及使用JSON搜索引擎、使用JSON数组可重复的key等。JSON类型是mysql数据库一个强大的新特性,在存储非结构化数据方面表现十分优异,我们希望这篇文章对你有所帮助。

mysql中json字段查询详解

2023-05-20
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
mysql查询json数据web,mysql处理json数据

2022-11-23
MySQL查询JSON的详解

2023-05-18
mysql数据库完整笔记(mysql数据库数据)

2022-11-13
mysql数据库的复杂查询技术,mysql数据库的复杂查询技

2022-11-19
mysql数据库笔记1000行,sql数据库查询最后1000

2022-11-23
MySQLJSON查询详解

2023-05-18
mysql数据库开发笔记(mysql数据库应用案例教程电子版

2022-11-14
一个复杂的mysql数据库查询(mysql大量数据查询)

2022-11-14
java查询数据库字段名,查询字段名sql

2022-11-24
mysql查看数据库参数设置(mysql设置参数查询sql语

2022-11-12
数据库某个字段是json(数据库查询包含某个字段的数据)

本文目录一览: 1、python连接mysql查数据,表里有个字段是json格式的。取不出来,求大神帮助! 2、tp框架,数据库有一个字段为json数据,现已用json_decode转成对象数组了,如

2023-12-08
mysql数据库优化的一些笔记(MySQL数据库的优化)

2022-11-13
mysql数据库番外篇之(MySQL数据库笔记)

2022-11-16
mysql数据库设计与查询语句(mysql数据库查询语句怎么

2022-11-08
SQL查询字段包含某个字符串

2023-05-18
python基础学习整理笔记,Python课堂笔记

2022-11-21
我的mysql数据库学习笔记(mysql数据库菜鸟教程)

2022-11-11
php递归查询上级(php递归目录)

2022-11-11