요약
최근 몇 년 동안 JSON 데이터베이스가 확산되면서 새로운 쿼리 언어인 SQL++ 이러한 데이터 소스에 액세스하는 방법을 표준화할 수 있는 언어가 등장하기 시작했습니다. 사실 이 언어는 수년 전부터 존재해 왔지만 주로 학술적인 영역에 머물러 있었습니다. JSON 데이터용 SQL 언어인 Couchbase N1QL은 2015년에 출시되었습니다. 이 회사는 N1QL/SQL++ 언어를 계속 개발해 왔으며, 2018년 10월에는 다음과 같이 발표했습니다. 발표 카우치베이스 애널리틱스를 출시했습니다. 돈 체임벌린의 공동 발명자이자 오리지널 SQL의 공동 발명가이기도 한 그는 SQL++ 튜토리얼 북 Couchbase 애널리틱스와 함께 작동하는 실용적인 예제를 제공합니다.
개요
SQL++는 구조화된 데이터와 반구조화된 데이터 모두에 사용할 수 있도록 설계된 데이터베이스 쿼리 언어입니다. 이 언어는 JSON 문서 데이터베이스와 함께 작동할 수 있도록 확장된 원래 SQL을 기반으로 합니다. 관계형 데이터베이스에서 데이터는 표 형식으로 표현됩니다. 테이블의 행은 각각 동일한 필드 이름과 필드 유형(테이블의 스키마에 따라)을 가진 동일한 평면 레코드 구조를 가집니다. 반구조 데이터베이스는 이러한 제약 조건을 완화하여 레코드가 중첩되고 필드 이름과 유형이 서로 다를 수 있으며 스키마가 필요하지 않습니다. 따라서 SQL++는 데이터 모델에 대한 제한을 완화하여 관계형 세계에서 사용되는 쿼리 언어 표준인 SQL을 "확장"합니다. 이렇게 함으로써 SQL++는 높은 수준의 선언적 특성을 포함한 SQL의 장점을 유지하면서 반구조적 세계에서 흔히 볼 수 있는 보다 유연한 구조를 처리할 수 있습니다. IBM , Microsoft, Oracle과 같은 관계형 데이터베이스 공급업체와 PostgreSQL, MySQL과 같은 오픈 소스 시스템은 자체 버전의 SQL을 확장하여 JSON 데이터와 함께 작동하도록 했습니다. 이러한 시스템에서는 JSON 문서를 조작할 수 있도록 새로운 함수 및 경우에 따라 새로운 구문뿐만 아니라 열 유형으로서의 JSON에 대한 (종종 시스템별로) 확장을 추가합니다.[1][2][3][4][5] ANSI/ISO SQL 표준 자체는 2016년에 비슷한 방식으로 확장되었습니다.[6].
반면, 위에서 설명한 것처럼 SQL++는 JSON 데이터가 '일류' 데이터로 취급되고 관계형 데이터는 레코드가 규칙적이고 동일한 유형이며 중첩되지 않는 특수한 경우의 쿼리 언어에 도달하기 위해 SQL의 대상 데이터 모델을 완화하여 개발되었습니다.[7]
역사
SQL++는 원래 캘리포니아 대학교 샌디에이고 캠퍼스에서 야니스 파파콘스탄티노우와 다른 사람들이 개발했습니다.[8]. SQL++는 NSF가 자금을 지원하는 FORWARD 프로젝트에서도 사용되었습니다.[9] UCSD에서
애플리케이션
SQL++의 얼리 어답터 중 한 명은 Apache AsterixDB는 오픈 소스 빅데이터 관리 시스템으로, 원래 2009년 UC 어바인과 UC 리버사이드의 교수진, 직원, 학생들로 구성된 팀이 공동 개발했습니다. 또 다른 SQL++ 조기 도입 업체로는 확장 가능한 JSON 데이터베이스 공급업체인 Couchbase가 있으며, 6.0 릴리스에서 Couchbase Analytics에 SQL++를 채택했습니다. [8] 오퍼링입니다.
도서
도널드 D 챔벌린원래 SQL 언어 사양의 주요 설계자 중 한 명입니다, SQL++ 언어에 대한 튜토리얼을 작성했습니다.[11] 이 언어가 카우치베이스 애널리틱스에서 어떻게 작동하는지 보여주는 실제 예제가 포함되어 있습니다.
예제
값 선택 및 선택
SQL과 SQL++의 주요 차이점 중 하나는 결과의 형식에 있습니다. 행과 테이블용으로 설계된 표준 SQL은 결과 집합을 테이블 형식으로 반환합니다. 반면에 SQL++는 결과 집합을 JSON 형식으로 반환합니다.
(Q1) 모든 고객의 고객 ID, 이름, 우편번호, 신용 등급을 고객 ID 순으로 나열하세요.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT custid, name, address.zipcode, rating FROM customers ORDER BY custid LIMIT 2; Result: [ { "custid" : "C13", "Name" : "T. Cruise", "Zipcode" : "63101", "Rating" : 750 }, { "custid" : "C25", "Name" : "M. Streep", "Zipcode" : "02340", "Rating" : 690 } ] |
(2) 평점이 650점 이상인 고객의 이름을 찾으세요.
|
1 2 3 4 5 6 7 8 |
SELECT name FROM customers WHERE rating > 650; Result: [ { "name": "T. Cruise" }, { "name": "M. Streep" }, { "name": "T. Hanks" } ] |
(Q3) SELECT VALUE의 효과를 표시합니다(Q2와 비교).
|
1 2 3 4 |
SELECT VALUE name FROM customers Queries WHERE rating > 650; Result: [ "T. Cruise", "M. Streep", "T. Hanks" ] |
다음 예제에서처럼 SELECT VALUE 쿼리를 객체 생성자와 함께 사용하여 레이블을 만들거나 쿼리 결과에 구조를 지정할 수 있습니다.
(4) 신용 등급이 650보다 높은 고객을 신용 등급 내림차순으로 나열하고 다시 우편번호별로 오름차순으로 나열합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
SELECT VALUE { "high-rated customers, ordered by rating": (SELECT c.rating, c.custid, c.name FROM customers AS c WHERE c.rating > 650 ORDER BY c.rating DESC), "high-rated customers, ordered by zipcode": (SELECT c.address.zipcode, c.custid, c.name FROM customers AS c WHERE c.rating > 650 ORDER BY c.address.zipcode) }; Result: [ { "high-rated customers, ordered by rating": [ { "rating": 750, "custid": "C13", "name": "T. Cruise" }, { "rating": 750, "custid": "C37", "name": "T. Hanks" }, { "rating": 690, "custid": "C25", "name": "M. Streep" } ], "high-rated customers, ordered by zipcode": [ { "zipcode": "02115", "custid": "C37", "name": "T. Hanks" }, { "zipcode": "02340", "custid": "C25", "name": "M. Streep" }, { "zipcode": "63101", "custid": "C13", "name": "T. Cruise" } ] } ] |
그룹화, 집계 및 언네스트
SQL++는 그룹화 및 집계라는 동일한 SQL 개념을 지원합니다. UNNEST는 중첩된 배열의 내용, 즉 주문을 가져와서 상위 객체, 즉 고객과 결합합니다.
(Q6) 2017-05-01에 이루어진 모든 주문에 대한 총 수량과 함께 주문 번호 및 품목 번호별로 첫 번째 주문을 나열하세요.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT o.orderno, i.itemno AS item_number, sum(i.qty) AS quantity FROM orders AS o UNNEST o.items AS i WHERE o.order_date = "2017-05-01" GROUP BY o.orderno, i.itemno ORDER BY o.orderno, item_number LIMIT 1; Result: [ { "orderno": 1002, "item_number": 460, "quantity": 95 } ] |
그룹 AS
쿼리는 요약 수준에서 출력 데이터를 생성할 수 있습니다. 수준 정의는 GROUP BY 절에 제공됩니다. Q6 쿼리는 주문 번호 및 주문 품목 번호 수준에서 주문 요약을 생성합니다. 종종 요약 데이터와 요약 내의 라인 항목을 모두 포함하는 출력을 생성하고 싶을 때가 있습니다. 이를 위해 SQL++는 SQL의 기존 그룹화 기능에 대한 몇 가지 중요한 확장 기능을 지원합니다. 익숙한 GROUP BY 및 HAVING 절은 여전히 존재하며, GROUP AS라는 새로운 절로 결합됩니다.
(Q7) 2017-05-01에 이루어진 모든 주문에 대한 총 수량과 함께 주문 번호 및 품목 번호별로 모든 주문을 나열하고 각 요약 줄에 이루어진 모든 주문과 주문 품목도 포함하세요. (Q6과 비교)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
SELECT o.orderno, i.itemno AS item_number, sum(i.qty) AS quantity, od FROM orders AS o UNNEST o.items AS i WHERE o.order_date = "2017-05-01" GROUP BY o.orderno, i.itemno GROUP AS od LIMIT 1; Result: [ { "od": [ { "o": { "custid": "C13", "items": [ { "itemno": 460, "price": 100.99, "qty": 95 }, { "itemno": 680, "price": 8.75, "qty": 150 } ], "order_date": "2017-05-01", "orderno": 1002, "ship_date": "2017-05-03" }, "i": { "itemno": 460, "price": 100.99, "qty": 95 } } ], "orderno": 1002, "item_number": 460, "quantity": 95 } ] |