在实际的数据库开发中,经常会遇到将配置信息、用户属性等数据存储为json格式的情况,mysql从5.7版本开始原生支持json类型,并且提供了一系列函数来查询和操作json数据,下面介绍几种常用的查询json值的方法。

使用json_extract函数查询
json_extract是mysql中专门用来提取json值的函数,语法为json_extract(json_col, path),其中path是json的路径表达式,用$表示根节点,.表示对象属性,[n]表示数组的第n个元素(下标从0开始)。
假设我们有一张用户表user,其中ext_info字段是json类型,存储用户额外的扩展信息,表结构和示例数据如下:
-- 创建用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
ext_info JSON
);
-- 插入测试数据
INSERT INTO user (name, ext_info) VALUES
('张三', '{"age": 25, "hobby": ["篮球", "读书"], "address": {"city": "北京", "district": "海淀区"}}'),
('李四', '{"age": 28, "hobby": ["足球"], "address": {"city": "上海", "district": "浦东新区"}}');
如果要查询所有用户的年龄,可以使用以下语句:
SELECT id, name, json_extract(ext_info, '$.age') AS age FROM user;
执行结果中age字段的值会带双引号,比如"25",如果需要去掉双引号,可以结合json_unquote函数使用,或者使用->>运算符,这个后续会介绍。
使用->和->>运算符查询
mysql提供了两个简化的运算符来查询json值,->等价于json_extract,->>等价于json_unquote(json_extract()),也就是提取后自动去掉双引号。
还是以上面的user表为例,查询用户的城市信息:
-- 使用->运算符,结果带双引号 SELECT id, name, ext_info->'$.address.city' AS city FROM user; -- 使用->>运算符,结果不带双引号 SELECT id, name, ext_info->>'$.address.city' AS city FROM user;
如果json字段是数组类型,要提取数组中的元素,同样可以用路径表达式,比如查询第一个用户的第一个爱好:
SELECT ext_info->>'$.hobby[0]' AS first_hobby FROM user WHERE id = 1;
查询json中的嵌套结构
如果json结构有多层嵌套,只需要在路径表达式中逐层指定属性即可。比如上面的address是嵌套在ext_info中的对象,要查询用户的区信息,路径就是$.address.district。
示例查询所有用户的区和城市:
SELECT
id,
name,
ext_info->>'$.address.city' AS city,
ext_info->>'$.address.district' AS district
FROM user;
使用json_table函数解析json数组
如果json字段中存储的是数组,且需要把数组的每个元素作为一行数据展示,可以使用json_table函数,它可以将json数据转换为关系型的表格结构。
比如我们要查询所有用户的所有爱好,每个爱好作为一行:
SELECT
u.id,
u.name,
jt.hobby
FROM user u
CROSS JOIN json_table(
u.ext_info,
'$.hobby[*]' COLUMNS (
hobby VARCHAR(50) PATH '$'
)
) AS jt;
上述语句中,$.hobby[*]表示匹配hobby数组的所有元素,COLUMNS子句定义转换后的列,这里定义了一个hobby列,路径为$表示取数组元素本身的值。
条件查询中使用json值
查询json值也可以用在WHERE条件中,比如查询年龄大于25岁的用户:
SELECT id, name, ext_info->>'$.age' AS age FROM user WHERE ext_info->>'$.age' > 25;
注意这里如果用->运算符的话,提取的值是带双引号的字符串,比较的时候可能需要转换类型,所以建议条件判断中使用->>运算符,提取的是无引号的字符串,数字类型可以正常比较。
常用路径表达式说明
下面是一些常用的json路径表达式规则:
$:表示json文档的根节点$.key:表示根节点下名为key的对象属性$.key1.key2:表示嵌套的对象属性,先取key1,再取key2$.arr[0]:表示名为arr的数组的第一个元素(下标从0开始)$.arr[*]:表示名为arr的数组的所有元素
掌握了这些路径表达式,就可以灵活提取各种复杂结构的json数据了。
mysqljson查询json_extract->运算符json_table修改时间:2026-06-11 15:27:17