테스트 환경: MySQL8.0.19
CREATE TABLE json_demo ( `id` INT ( 11 ) NOT NULL PRIMARY KEY, `content` json NOT NULL ); INSERT INTO json_demo ( id, content ) VALUES /*这条是数组*/ ( 1, '[{"key": 1, "order": 1, "value": "34252"},{"key": 2, "order": 2, "value": "23423"}]' ), /*这条是数组*/ ( 2, '[{"key": 4, "order": 4, "value": "234"},{"key": 5, "order": 5, "value": "234324523"}]' ), /*这条是对象*/ ( 3, '{"key": 3, "order": 3, "value": "43242"}' ), /*这条是对象*/ ( 4, '{"key": 6, "order": 6, "value": "5423"}' );
지정된 필드 값 쿼리
/* 基础查询 */ SELECT content -> '$.key' AS 'key', JSON_EXTRACT(content, '$.key') AS 'key2', content -> '$.value' AS 'value', JSON_EXTRACT(content, '$.value') AS 'value2', content ->> '$.value' AS 'value3', JSON_UNQUOTE(JSON_EXTRACT(content, '$.value')) AS 'value4' FROM json_demo WHERE id > 2;
팁:
-&g t;그리고-> ;>는 MySQL이 설계한 구문으로, ->는 MySQL5.7에서 지원되고 ->>는 MySQL8.0에서 지원됩니다.
-> JSON_EXTRACT()와 동일하며 쿼리 필드가 문자열인 경우 반환 값에도 ""가 포함됩니다.
->> JSON_UNQUOTE(JSON_EXTRACT())와 동일하며, 쿼리 필드가 문자열인 경우 반환 값에 ""가 포함되지 않습니다.
조건 쿼리에 사용
content -> '$.key'는 필드로 간주할 수 있으며 기본적으로 필드에서 수행할 수 있는 작업을 수행할 수 있습니다.
SELECT id, content -> '$.key' AS 'key', content ->> '$.value' AS 'value3' FROM json_demo WHERE id > 2 AND content -> '$.key' > 1 AND content -> '$.value' like '%2%';
지정된 필드 값 수정
/* 修改 */ UPDATE json_demo SET content = JSON_REPLACE( content, /* 将content.key值 + 1 */ '$.key', content -> '$.key' + 1, /* 将content.value值后拼接'abc' */ '$.value', concat(content ->> '$.value', 'abc') ) WHERE id = 3; /* JSON_SET也可以 */ UPDATE json_demo SET content = JSON_SET( content, /* 将content.key值 + 1 */ '$.key', content -> '$.key' + 1, /* 将content.value值后拼接'abc' */ '$.value', concat(content ->> '$.value', 'abc') ) WHERE id = 3; /* 查询修改结果 */ SELECT id,content,content -> '$.key' AS 'key',content ->> '$.value' AS 'value3' FROM json_demo WHERE id = 3; /* 重新赋值 */ UPDATE json_demo SET content = JSON_REPLACE(content,'$.key',3,'$.value','43242') WHERE id = 3;
팁:
JSON_REPLACE와 JSON_SET은 모두 특정 필드 값을 수정하는 데 사용할 수 있습니다. 차이점은 JSON_REPLACE가 대체되면 작업이 유효하지 않다는 것입니다. 존재하지 않는 속성, JSON_SET은 존재하지 않는 속성을 삽입합니다.
따라서 JSON_SET은 JSON_INSERT와 유사하게 속성을 추가하는 데에도 사용할 수 있습니다. 차이점은 기존 속성이 삽입되면 JSON_INSERT 작업이 실패하고 JSON_SET이 이를 대체한다는 것입니다.
요소 추가
UPDATE json_demo SET content = JSON_INSERT(content, '$.key', 234) WHERE id = 3; SELECT id,content,content -> '$.key' AS 'key' FROM json_demo WHERE id = 3; UPDATE json_demo SET content = JSON_INSERT(content, '$.temp', 234) WHERE id = 3; SELECT id,content,content -> '$.key' AS 'key' FROM json_demo WHERE id = 3; UPDATE json_demo SET content = JSON_SET(content, '$.temp2', 432) WHERE id = 3; SELECT id,content,content -> '$.key' AS 'key' FROM json_demo WHERE id = 3;
지정된 필드 값 쿼리
SELECT id, content -> '$[*].key' AS 'key', content ->> '$[*].value' AS 'value', content -> '$[0].key' AS 'key2', content ->> '$[0].value' AS 'value2', /* 查询数组长度 */ JSON_LENGTH(content) AS 'length' FROM json_demo WHERE id < 3;
조건부 쿼리
SELECT id, content -> '$[*].key' AS 'key', content ->> '$[*].value' AS 'value' FROM json_demo WHERE id < 3 /* content.value的值中存在like'%34%'的值 */ AND content ->> '$[*].value' like '%34%' /* content.key的值中有4 */ AND JSON_OVERLAPS(content ->> '$[*].key', '4' );
지정된 필드 값 수정
기본 작업은 JSON 개체와 유사합니다. '$' 뒤에 해당 인덱스 비트 '$[0]'을 추가하고 모두 지정하려면 '$[*]'를 추가하는 것입니다. 배열에 배열이 포함된 경우 '$[1][2][3]'을 통해 깊은 배열 요소를 지정할 수 있습니다.
요소 추가
JSON_ARRAY_APPEND 및 JSON_ARRAY_INSERT 모두 배열 요소를 추가할 수 있습니다. 차이점은 JSON_ARRAY_APPEND가 인덱스 비트를 지정할 필요가 없다는 것입니다. 이 경우 JSON_ARRAY_INSERT는 인덱스 비트를 지정해야 하며 지정되지 않으면 오류가 보고됩니다.
JSON_ARRAY_APPEND는 지정된 인덱스 비트 뒤에 추가되고, JSON_ARRAY_INSERT는 지정된 인덱스 비트 앞에 삽입됩니다.
Name | Description |
---|---|
JSON_ARRAY() | JSON 배열 만들기 |
JSON_ARRAY_APPEND() | JSON에 데이터 추가 SON 문서 |
JSON_ARRAY_INSERT() | JSON 배열에 삽입 |
JSON_CONTAINS() | JSON 문서에 경로에 특정 개체가 포함되어 있는지 여부 |
JSON_CONTAINS_PATH() | JSON 문서에 경로에 데이터가 포함되어 있는지 여부 |
JSON_DEPTH() | JSON 문서의 최대 깊이 |
JSON_EXTRACT() | JSON 문서에서 데이터 반환 |
JSON_INSERT() | JSON 문서에 데이터 삽입 |
JSON_KEYS() | JSON 문서의 키 배열 |
JSON_LENGTH() | JSON 문서의 요소 수 |
JSON_MERGE()(더 이상 사용되지 않음) | JSON 문서를 병합하고 중복 키를 유지합니다. JSON_MERGE_PRESERVE() |
JSON_MERGE_PATCH() | JSON 문서 병합, 중복 키 값 바꾸기 |
JSON_MERGE_PRESERVE() | JSON 문서 병합, 중복 키 유지 |
JSON_OBJECT() | JSON 객체 생성 |
JSON_OVERLAPS() (8.0.17에서 도입됨) | 두 JSON 문서를 비교하여 공통된 키-값 쌍 또는 배열 요소가 있으면 TRUE(1)를 반환하고, 그렇지 않으면 FALSE(0)를 반환합니다. ) |
JSON_PRETTY() | JSON 문서를 읽기 쉬운 형식으로 인쇄 |
JSON_QUOTE() | JSON 문서 인용 |
JSON_REMOVE() | JSON 문서에서 데이터 제거 |
JSON_REPLACE() | JSON 문서의 값 바꾸기 |
JSON_SCHEMA_VALID()(8.0.17에서 도입됨) | JSON 스키마에 대해 JSON 문서의 유효성을 검사합니다. 문서가 스키마에 대해 유효성이 검사되면 TRUE/1을 반환합니다. ; 그렇지 않으면 FALSE/0을 반환합니다. |
JSON_SCHEMA_VALIDATION_REPORT()(8.0.17에 도입됨) | JSON 스키마에 대한 JSON 문서 유효성 검사는 성공 또는 실패 및 실패 이유를 포함하여 유효성 검사 결과에 대한 보고서를 JSON 형식으로 반환합니다. |
JSON_SET() | |
JSON_STORAGE_FREE() | |
JSON_ STORAGE_SIZE( ) used acespace 공간 JSON Document | |
json_table ()의 이진 표현을 저장하는 데 사용됩니다. () | JSON 값 역참조 |
JSON_VALID() | JSON 값이 유효한가요? |
JSON_VALUE() (8.0.21에서 추가됨) | JSON 문서에서 가리키는 위치의 값을 추출합니다. 제공된 경로는 VARCHAR(512) 또는 지정된 유형이 이 값을 반환합니다. |
MEMBER OF()(8.0.17에서 도입됨) | 첫 번째 피연산자가 두 번째 피연산자로 전달된 JSON 배열의 요소와 일치하면 반환합니다. true(1), 그렇지 않으면 false(0)를 반환 |
위 내용은 MySQL에서 JSON 유형 필드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!