json(MySQL5.7)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013219624/article/details/85337676
# 创建json对象
SELECT JSON_OBJECT ("name", "op", "age", 18, "address", "wuxi") as jsonObjec FROM DUAL;
# 创建json数组
SELECT JSON_ARRAY (JSON_OBJECT("age", 18, "name", "op", "address", "wuxi"), JSON_OBJECT("age", 18, "name", "op", "address", "wuxi")) as jsonArray FROM DUAL;
SELECT JSON_ARRAY (1, 2, 3) as jsonArray FROM DUAL;



# 表结构
CREATE TABLE user (
	id INT NOT NULL AUTO_INCREMENT,
	content json NOT NULL,
	tags json NOT NULL,
	PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

# 初始化数据
INSERT INTO user (`content`, tags) 
VALUES('{"name": "jack", "age": 21, "address": "shanghai"}', '[1, 2, 3]'),
			('{"name": "David", "age": 10, "address": "beijing"}', '[4, 5, 6]'),
			('{"name": "uu", "age": 47, "address": "suzhou"}', '[7, 8, 9]'),
			('{"name": "op", "age": 31, "address": "wuxi"}', '[10, 11, 12]');



# 对content中name建立虚拟列 JSON_UNQUOTE可以去除双引号
ALTER TABLE user ADD name varchar(32) GENERATED ALWAYS as (JSON_UNQUOTE(json_extract(content,'$.name'))) VIRTUAL;
# 对虚拟列name添加索引
CREATE INDEX idx_name ON user(name);
# 删除索引
DROP INDEX idx_name ON user;
# 查看索引
SHOW INDEX FROM user;




# 查询 EXPLAIN  注意严格区分类型 走索引
SELECT id, json_extract(content,'$.age') as age, content->>'$.name' as name FROM user WHERE name='jack';

# 查询user表id,age字段 explain发现是全表扫描
SELECT id, json_extract(content,'$.age') as age, JSON_UNQUOTE(json_extract(content,'$.name')) as name FROM user WHERE json_extract(content,'$.name')='jack';
SELECT id, content->'$.age' as age, JSON_UNQUOTE(content->'$.name') as name FROM user WHERE content->'$.name'='jack';
# json查找
SELECT * FROM user WHERE content=CAST('{"age": 31, "name": "op", "address": "wuxi"}' as json);
SELECT tags->'$[2]' FROM user;
SELECT * FROM user WHERE JSON_CONTAINS(tags, '1');

# 关于更新 直接替换是否可以?

猜你喜欢

转载自blog.csdn.net/u013219624/article/details/85337676