从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