






















简单查询。
很多时候有复杂结构,我们存储为json格式,但字段很复杂。
假设有一个名为data的JSON字段,可以使用以下语法提取其中的值。
SELECT data->'$.key' FROM table_name;
使用JSON_CONTAINS函数可以过滤JSON数组中包含特定值的记录。例如,假设有一个名为data的JSON字段,其中包含一个名为tags的数组,可以使用以下语法过滤包含特定标签的记录:
SELECT JSON_LENGTH(data->'$.array_field') FROM table_name;
使用JSON_KEYS函数可以查询JSON字段中的键名。例如,假设有一个名为data的JSON字段,可以使用以下语法查询其键名:
SELECT JSON_KEYS(data) FROM table_name;
-> 和 ->> 操作符:
-- 提取name字段(带引号) SELECT json_data->'$.name' FROM table; -- 提取name字段并去除引号 SELECT json_data->>'$.name' FROM table;
-- 字符串比较(推荐使用->>) SELECT * FROM table WHERE json_data->>'$.name' = 'John'; -- 数值比较 SELECT * FROM table WHERE JSON_EXTRACT(json_data, '$.age') = 30;
SELECT * FROM table WHERE json_data->>'$.user.address.city' = 'New York';
-- 检查是否存在email字段 SELECT * FROM table WHERE JSON_CONTAINS_PATH(json_data, 'one', '$.email'); -- 检查多路径是否存在(all表示所有路径必须存在) SELECT * FROM table WHERE JSON_CONTAINS_PATH(json_data, 'all', '$.name', '$.age');
-- 查找tags数组包含"mysql" SELECT * FROM table WHERE JSON_CONTAINS(json_data->'$.tags', '"mysql"', '$'); -- 获取第一个hobby(索引从0开始) SELECT json_data->>'$.hobbies[0]' FROM table;
修改字段值: UPDATE table SET json_data = JSON_REPLACE(json_data, '$.age', 31) WHERE id = 1; 新增字段: UPDATE table SET json_data = JSON_INSERT(json_data, '$.email', 'john@example.com') WHERE id = 1; 删除字段: UPDATE table SET json_data = JSON_REMOVE(json_data, '$.oldKey') WHERE id = 1;追加数组元素:
UPDATE table SET json_data = JSON_ARRAY_APPEND(json_data, '$.tags', 'new_tag');
生成虚拟列并创建索引: ALTER TABLE table ADD COLUMN name_virtual VARCHAR(50) AS (json_data->>'$.name'), ADD INDEX (name_virtual);
SELECT t.id, j.tag FROM table t JOIN JSON_TABLE( t.json_data->'$.tags', '$[*]' COLUMNS (tag VARCHAR(50) PATH '$') ) AS j;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。