mysql之使用json

从mysql 5.7开始才有

创建表(含有json类型)

CREATE TABLE `emp_details` (
`emp_no` int(11) NOT NULL,
`details` json DEFAULT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入json

INSERT into emp_details (emp_no,details) VALUES ( '1','{"location":"IN","phone":"+15615645656",
"email":"[email protected]","address":{"line1":"abc","line2":"xyz street","city":"Beijing"}}');

检索json

SELECT emp_no,details->'$.address.city' city FROM emp_details; 或者 

SELECT emp_no,details->>'$.address.city' city FROM emp_details;

-> 查询结果有引号

->> 查询结果无引号

json函数

查找

SELECT emp_no FROM emp_details WHERE details->>'$.address.city' = 'Beijing';

也可以使用json_contains函数查询数据,如果找到了数据,则返回1,否则返回0

SELECT json_contains(details->'$.address.line1','"abc"') FROM emp_details

查找一个key,这里one表示至少存在一个键,如果找到了数据,则返回1,否则返回0

SELECT json_contains_path(details,'one','$.address.city') FROM emp_details

 

 SELECT json_contains_path(details,'one','$.address.city','$.address.cit') FROM emp_details

我的数据没有address.cit这个键,但是有address.city,所有返回1

 

当然,如果要检查是否同时存在,则可以把one换成all

 修改

json_set:替换现有值并添加不存在的值

 UPDATE emp_details SET details = json_set(details,"$.address.line1","abcd","$.nickname","kai")

json_insert:不能替换现有值,可以添加不存在的值

json_replace:仅替换现有值

 删除

json_remove

UPDATE emp_details SET details=json_remove(details,"$.nickname") WHERE emp_no = 1

仍然用update!

其他函数

json_keys:获取所有键

 SELECT json_keys(details) FROM emp_details WHERE emp_no = 1

json_length:获取所有键的数量

SELECT json_length(details) FROM emp_details WHERE emp_no = 1

 

猜你喜欢

转载自www.cnblogs.com/wubenbenxi/p/11042029.html