MySQL 8.0에서 추가된 모든 기능

MySQL 8.0에서 추가된 모든 기능 – JSON

Estimated reading: 4 minutes 40 views

1. 신규 함수 JSON_PRETTY

[원본제공링크 1]

JSON_PRETTY 함수는 JSON 데이터를 읽기 쉽게 들여쓰기와 줄 바꿈을 적용하여 포맷팅합니다. 이는 JSON 데이터를 디버깅하거나 로그에 기록할 때 가독성을 높이는 데 유용합니다.

예시:

SELECT JSON_PRETTY('{"name":"Alice","age":30,"skills":["SQL","Python"]}') AS formatted_json;

결과는 다음과 같이 포맷팅된 JSON 문자열을 반환합니다:

 {
  "age": 30,
  "name": "Alice",
  "skills": [
    "SQL",
    "Python"
  ]
}

2. 신규 함수 JSON_STORAGE_SIZE

[원본제공링크 1]

JSON_STORAGE_SIZE 함수는 JSON 값이 스토리지에서 실제로 차지하는 바이트 수를 반환합니다. 이는 저장 공간 최적화데이터베이스 용량 관리에 활용할 수 있습니다.

예시:

SELECT JSON_STORAGE_SIZE('{"name":"Alice","age":30}') AS storage_size;

이 예시는 JSON 데이터가 저장소에서 몇 바이트를 차지하는지 알려줍니다.

3. 신규 함수 JSON_STORAGE_FREE

[원본제공링크 1]

JSON_STORAGE_FREE 함수는 JSON 컬럼에 할당된 저장 공간 중 사용하지 않는 여유 공간의 바이트 수를 반환합니다. 이는 JSON 컬럼의 저장 효율성을 평가하는 데 도움이 됩니다.

예시:

SELECT JSON_STORAGE_FREE(json_column) FROM my_table WHERE id = 1;

이 예시는 my_table에서 id가 1인 행의 json_column에 남은 여유 공간을 반환합니다.

4. 신규 함수 JSON_MERGE_PATCH

[원본제공링크 1]

JSON_MERGE_PATCH 함수두 개의 JSON 문서를 병합하여 하나의 JSON 문서를 생성합니다. 기존의 JSON_MERGE_PRESERVE 함수와 달리, 두 번째 문서의 값으로 첫 번째 문서의 값을 덮어씌우는 방식으로 동작합니다. 이는 JSON Merge Patch 표준(RFC 7396)을 구현한 것입니다.

예시:

SELECT JSON_MERGE_PATCH('{"a":1,"b":2}', '{"b":3,"c":4}') AS merged_json;

결과는 {"a":1,"b":3,"c":4}이며, 첫 번째 문서의 b 값이 두 번째 문서의 b 값으로 업데이트됩니다.

5. 신규 집계 및 윈도우 함수 JSON_ARRAYAGG

[원본제공링크 1-수정]

JSON_ARRAYAGG 함수는 그룹 내의 값들을 JSON 배열로 집계합니다. 이를 통해 여러 행의 값을 하나의 JSON 배열로 결합할 수 있습니다.

예시:

SELECT customer_id, JSON_ARRAYAGG(product_name) AS products
FROM orders
GROUP BY customer_id;

이 예시는 각 고객의 주문 상품 목록을 JSON 배열로 반환합니다.

6. 신규 집계 및 윈도우 함수 JSON_OBJECTAGG

[원본제공링크 1]

JSON_OBJECTAGG 함수는 그룹 내의 키-값 쌍을 JSON 객체로 집계합니다. 키와 값 컬럼을 지정하여 JSON 객체를 생성할 수 있습니다.

예시:

SELECT department, JSON_OBJECTAGG(employee_id, name) AS employees
FROM employees
GROUP BY department;

이 예시는 부서별로 직원의 ID와 이름을 키-값 쌍으로 갖는 JSON 객체를 반환합니다.

결과 예시:

-- 그냥 SELECT
mysql> SELECT customer_id, product_name  FROM orders;
+-------------+--------------+
| customer_id | product_name |
+-------------+--------------+
|           1 | Laptop       |
|           1 | Mouse        |
|           1 | Keyboard     |
|           2 | Phone        |
|           2 | Headphones   |
|           3 | Tablet       |
+-------------+--------------+
6 rows in set (0.00 sec)

-- JSON_OBJECTAGG로 GROUP BY
mysql> SELECT customer_id, 
    ->        JSON_ARRAYAGG(product_name) AS products
    -> FROM orders
    -> GROUP BY customer_id;
+-------------+---------------------------------+
| customer_id | products                        |
+-------------+---------------------------------+
|           1 | ["Laptop", "Mouse", "Keyboard"] |
|           2 | ["Phone", "Headphones"]         |
|           3 | ["Tablet"]                      |
+-------------+---------------------------------+
3 rows in set (0.00 sec)

7. 신규 테이블 함수 JSON_TABLE

[원본제공링크 1]

JSON_TABLE 함수는 JSON 데이터를 관계형 형식으로 변환하여 테이블 형태로 반환합니다. 이를 통해 JSON 문서의 내용을 SQL 쿼리에서 직접 조인하거나 필터링할 수 있습니다.

예시:

SELECT *
FROM JSON_TABLE(
  '[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]',
  '$[*]' COLUMNS (
    id INT PATH '$.id',
    name VARCHAR(100) PATH '$.name'
  )
) AS jt;

이 예시는 JSON 배열을 테이블로 변환하여 idname 컬럼을 가진 결과를 반환합니다.

8. JSON 값의 더 빠른 정렬

[원본제공링크 1]

MySQL 8.0은 JSON 값의 정렬 속도를 개선했습니다. JSON 데이터 타입에 대해 ORDER BY를 사용할 때, MySQL은 내부적으로 JSON 값을 이진 형식으로 처리하여 비교와 정렬을 최적화합니다. 이로 인해 JSON 데이터 컬럼에서 정렬 작업의 성능이 대폭 향상됩니다.

예시:

SELECT * FROM my_table ORDER BY json_column->'$.name';

이 예시는 json_columnname 필드를 기준으로 정렬합니다.

9. JSON path 표현식에 범위 적용

[원본제공링크 1 2]

(원문에 오타가 있는듯. 원문 제목이 Ranges in JSON patch expressions 인데, 링크 따라가보면 JSON path임)
MySQL 8.0.21부터 JSON 경로 표현식에서 배열 요소의 범위 지정을 지원합니다. 이를 통해 JSON 배열의 특정 범위를 손쉽게 조회할 수 있으며, JSON 함수(예: JSON_EXTRACT)에서 사용 가능합니다. 범위는 [start to end] 형식으로 지정되며, 시작과 끝 인덱스를 통해 배열의 부분 집합을 추출합니다.

예시:

SELECT JSON_EXTRACT('{"numbers": [10, 20, 30, 40, 50]}', '$.numbers[1 to 3]');

이 예시는 10, 20, 30, 40, 50의 데이터에서, 인덱스 1부터 3까지의 요소를 선택하므로 결과는 [20,30,40]이 됩니다.

10. JSON 값의 in-place 업데이트

[원본제공링크 1 2]

MySQL 8.0에서는 JSON 데이터의 특정 부분을 수정할 때 인플레이스(in-place) 업데이트가 가능해졌습니다. 이는 JSON 데이터 전체를 다시 작성하지 않고, 변경된 부분만 수정하여 성능을 크게 향상시킵니다. 이를 통해 대규모 JSON 데이터를 다룰 때도 효율적으로 데이터를 수정할 수 있습니다.

예시:

UPDATE my_table
SET json_column = JSON_SET(json_column, '$.status', 'active')
WHERE id = 1;

이 예시는 json_columnstatus 필드만 업데이트하며, 전체 JSON 문서를 다시 쓰지 않습니다.

11. JSON 스키마 유효성 검사

[원본제공링크 1]

JSON 스키마 유효성 검사 기능은 JSON 데이터를 JSON Schema 표준에 따라 검증할 수 있게 해줍니다. 이를 통해 데이터 무결성을 유지하고 예상치 못한 데이터 입력을 방지할 수 있습니다.

예시:

SET @schema = '{
  "type": "object",
  "properties": {
    "name": {"type": "string"},
    "age": {"type": "integer"}
  },
  "required": ["name", "age"]
}';

SELECT JSON_SCHEMA_VALID(@schema, '{"name":"Alice","age":30}') AS is_valid;

결과가 1이면 유효한 JSON 문서임을 나타냅니다.

12. JSON 배열 인덱스

[원본제공링크 1 2]

MySQL의 JSON 경로 표현식에서 배열의 특정 인덱스를 참조하여 요소를 조회하거나 수정할 수 있습니다. JSON 배열은 0부터 시작하는 양수 인덱스를 지원하며, 이를 통해 특정 위치의 값을 효율적으로 다룰 수 있습니다. 음수 인덱스는 MySQL에서 지원하지 않으므로 대신 배열의 길이를 활용해 마지막 요소를 참조하는 방식으로 대체해야 합니다.

예시:

SELECT JSON_EXTRACT('["a", "b", "c", "d"]', '$[1]');

SELECT JSON_EXTRACT('["a", "b", "c", "d", "e"]', '$[1 to 3]');

SELECT JSON_EXTRACT(
    '["a", "b", "c", "d"]',
    CONCAT('$[', JSON_LENGTH('["a", "b", "c", "d"]') - 1, ']')
);

13. 신규 연산자 MEMBER_OF

[원본제공링크 1]

MySQL 8.0.17에서 도입된 MEMBER OF 연산자는 JSON 배열에 특정 값이 존재하는지를 확인하는 데 사용됩니다. 이 연산자는 특정 값이 배열의 멤버인지(Boolean 결과로) 검사하는 간단하고 효율적인 방법을 제공합니다.

예시:

SELECT 'apple' MEMBER OF (JSON_ARRAY('apple', 'banana', 'cherry')) AS is_member;

결과는 1이며, 'apple'이 배열에 포함되어 있음을 나타냅니다.

14. 신규 함수 JSON_OVERLAPS

[원본제공링크 1]

MySQL 8.0.17에 추가된 JSON_OVERLAPS 함수는 두 JSON 값이 공통 요소를 포함하고 있는지 검사합니다. 배열의 경우 동일한 값을, 객체의 경우 동일한 키-값 쌍을 비교합니다. 결과는 TRUE(1) 또는 FALSE(0)로 반환됩니다.

예시:

SELECT JSON_OVERLAPS('{"a":1,"b":2}', '{"b":2,"c":3}') AS has_overlap;

결과는 1이며, 두 JSON 문서가 공통된 "b":2를 가지고 있음을 나타냅니다.

15. 신규 함수 JSON_VALUE

[원본제공링크 1]

MySQL 8.0.21에 도입된 JSON_VALUE 함수는 JSON 데이터에서 스칼라 값을 추출하는 데 사용됩니다. 반환 값은 텍스트 형식으로 변환되며, 숫자, 문자열, 부울 등 JSON 값이 포함된 데이터를 간단하게 가져올 수 있습니다. 기존의 JSON_EXTRACT와 달리, 이 함수는 JSON 데이터를 SQL 쿼리에서 쉽게 사용할 수 있도록 최적화되어 있습니다.

예시:

SELECT JSON_VALUE('{"name":"Alice","age":30}', '$.name') AS name;

이 예시는 "Alice"를 반환하며, JSON에서 name 필드의 값을 추출합니다.

Leave a Comment



이 문서 공유

MySQL 8.0에서 추가된 모든 기능 – JSON

링크 복사

CONTENTS