從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":"abc@example.com","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