본문 바로가기

Learning

My-SQL 8 RC2 흘끗보기 - JSON

My-SQL이 버전을 확 올린 버전8을 준비중이고, 이미 RC본을 두번째인 RC2를 발표했다. 오라클사에 따르면 빅데이터 처리에 많이 공들였다고 한다. 이 글은 우선 보강된 JSON처리 부분을 소개하려 한다. 이미 JSON에 대한 처리는 기존의 My-SQL5에서 지원되고 있다.


준비

보기로 사용할 테이블을 아래처럼 준비했다. 테이블 이름은 'books'이고 3개의 컬럼을 갖고 있다. 임의의 데이터를 몇개 등록한 상태이다.

mysql> create table books (cnum varchar(8), name varchar(255),  author varchar(255));

Query OK, 0 rows affected (3.62 sec)



데이터를 입력한다.

...


mysql> select * from books;

+------+-------+--------+

| cnum | name  | author |

+------+-------+--------+

| C001 | Book1 | NULL   |

| C002 | Book2 | NULL   |

| C003 | Book3 | NULL   |

| D001 | Book4 | NULL   |

+------+-------+--------+

4 rows in set (0.00 sec)



JSON_ARRAYAGG

함수이름처럼 Aggregation작업 결과를 JSON 배열로 만들어 주는 함수이다. 아래작성한 코드는 위에 준비된 테이블을 이용한 간단한 코드이다. 첫번째 쿼리문은 간단히 테이블 'books'의 'cnum'필드의 값들을 JSON배열로 구성하는 것이다. 두번째 쿼리문은 group-by절을 이용한 것인데, 'cnum'필드 값의 맨 첫글자를 'cd'로 하고, 그 값을 기준으로 행을 묶어 각 묶음에 속하는 'cnum'값들을 JSON배열로 만든다.
mysql> select JSON_ARRAYAGG(cnum) from books;
+----------------------------------+
| JSON_ARRAYAGG(cnum)              |
+----------------------------------+
| ["C001", "C002", "C003", "D001"] |
+----------------------------------+
1 row in set (0.00 sec)


mysql> select left(cnum,1) as cd, JSON_ARRAYAGG(cnum) from books group by cd;
+------+--------------------------+
| cd   | JSON_ARRAYAGG(cnum)      |
+------+--------------------------+
| C    | ["C001", "C002", "C003"] |
| D    | ["D001"]                 |
+------+--------------------------+
2 rows in set (0.00 sec)
mysql> 



JSON_OBJECTAGG

Aggregation결과를 JSON 객체로 만들어주는 함수인데, 응용이 필요한 함수인 듯 하다. 일단 보기는 아래와 같다. 객체를 보면 Key-value로 구성된 것을 볼 수 있다.
mysql> select JSON_OBJECTAGG(cnum, name) from books;
+----------------------------------------------------------------------+
| JSON_OBJECTAGG(cnum, name)                                           |
+----------------------------------------------------------------------+
| {"C001": "Book1", "C002": "Book2", "C003": "Book3", "D001": "Book4"} |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)



기타

mysql> 

mysql> select info->"$[1 to 2]" from (select JSON_ARRAYAGG(cnum) as info from books) as T1;

+-------------------+

| info->"$[1 to 2]" |

+-------------------+

| ["C002", "C003"]  |

+-------------------+

1 row in set (0.00 sec)


종속된 쿼리문은 'JSON_ARRAYAGG'함수를 이용해서 JSON배열을 만들고 별칭 'info'로 반환하면 이를 가지고 'info -> "$[1 to 2]"를 구하는 쿼리이다. 'info ...' 문장은 보면 람다함수의 형식을 따르고 있다. 이 문장의 뜻은 '$[]' 입력된 JSON 배열의 1th행 부터 2nd행까지 추리라는 것이다. 그래서 결과는 전체 배열중 2개의 값만 포함하게 된다.