SQL 由 IBM 于上世紀 70 年代創(chuàng)建擎浴,如今已經(jīng)成為了使用最廣泛的數(shù)據(jù)庫查詢語言员咽。不過,相信很多人對于 SQL 的理解就是關(guān)系數(shù)據(jù)庫贮预,就是增刪改查贝室;實際上,SQL 在經(jīng)歷了四十而不惑之后就像“姐姐們”一樣成熟而有魅力仿吞,同時它又敢于在不斷變化的產(chǎn)業(yè)需求和各種非關(guān)系模型的沖擊之下實現(xiàn)自我突破滑频。因此,本文就給大家介紹一下最近幾年 SQL 如何在各個領域乘風破浪唤冈!
images.jianshu.io/upload_images/15316292-c39c173b2c0ffa46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果你認為 SQL 就是簡單的增刪改查(INSERT峡迷、SELECT、UPDATE你虹、DELETE)凉当,那么你了解的僅僅是 1992 年的SQL。
如果你了解通用表表達式(CTE)和遞歸查詢售葡、用戶定義類型或者 OLAP 功能,那么你使用的是 1999 年的 SQL忠藤。
如果你接觸過窗口函數(shù)(分析函數(shù))挟伙、MERGE(UPSERT)語句或者 XML 數(shù)據(jù)類型,應該知道這些不過是 2003 年的 SQL。
2006 年的 SQL 已經(jīng)定義了 SQL 操作 XML 的規(guī)范尖阔,支持使用 XQuery 同時訪問 SQL 數(shù)據(jù)和 XML 文檔贮缅。2008 年又增加了 TRUNCATE TABLE 語句、INSTEAD OF 觸發(fā)器以及 FETCH 子句等功能介却。
2011 年 SQL 最主要的新功能之一就是增強了對時態(tài)數(shù)據(jù)庫(Temporal database)的支持谴供,可以用于記錄那些隨著時間而變化的歷史數(shù)據(jù)值,應用領域包括金融齿坷、保險桂肌、預訂系統(tǒng)、醫(yī)療信息管理系統(tǒng)等永淌。目前崎场,MariaDB、Oracle遂蛀、PostgreSQL谭跨、Microsoft SQL Server 在一定程度上實現(xiàn)了某些時態(tài)表功能,國內(nèi)的騰訊 TDSQL 是一個全時態(tài)數(shù)據(jù)庫系統(tǒng)李滴。
時間來到了 2016 年螃宙,SQL 標準又增加了幾個重要的功能,首先就是對 JSON 文檔的支持所坯。
一.SQL 與文檔數(shù)據(jù)庫
文檔數(shù)據(jù)庫屬于 NoSQL 的一種谆扎,具有模式自由的存儲特性,通常采用 JSON 格式進程數(shù)據(jù)的存儲包竹。常用的文檔數(shù)據(jù)庫包括 MongoDB燕酷、CouchDB 等。
實際上周瞎,2016 年 SQL 標準就已經(jīng)增加了 JSON 功能的支持苗缩,包括:
- JSON 對象的存儲與檢索;
- 將 JSON 對象表示成 SQL 數(shù)據(jù)声诸;
- 將 SQL 數(shù)據(jù)表示成 JSON 對象酱讶。
這些功能可以表示為以下示意圖:
如今,主流的關(guān)系數(shù)據(jù)庫也都增加了原生 JSON 數(shù)據(jù)類型和相關(guān)函數(shù)的支持彼乌,包括 Oracle泻肯、MySQL、SQL Server慰照、PostgreSQL 等灶挟。
我們以 MySQL 為例,演示一下如何使用 SQL 查詢 JSON 數(shù)據(jù)毒租。
select emp_id,
emp_info, emp_info - > '$.emp_name' emp_name,
emp_info - > '$.sex' sex,
emp_info - >> '$.income[0].salary' salary
from employee_jsonlimit 3;
emp_id | emp_info | emp_name | sex | salary | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -- - | ------ - | 1 | { "sex" : "男", "email" : "liubei@shuguo.com", "income" : [{ "salary" : 33000.0 }, { "bonus" : 10000 }], "job_id" : 1, "dept_id" : 1, "manager" : null, "emp_name" : "劉備", "hire_date" : "2000-01-01" } | "劉備" | "男" | 33000.0 |
2 | { "sex" : "男", "email" : "guanyu@shuguo.com", "income" : [{ "salary" : 26000 }, { "bonus" : 10000 }], "job_id" : 2, "dept_id" : 1, "manager" : 1, "emp_name" : "關(guān)羽", "hire_date" : "2000-01-01" } | "關(guān)羽" | "男" | 26000 |
3 | { "sex" : "男", "email" : "zhangfei@shuguo.com", "income" : [{ "salary" : 24000 }, { "bonus" : 10000 }], "job_id" : 2, "dept_id" : 1, "manager" : 1, "emp_name" : "張飛", "hire_date" : "2000-01-01" } | "張飛" | "男" | 24000 |
其中稚铣,emp_info 字段類型為 JSON;-> 操作符返回的類型是 JSON,->> 返回的類型是字符串惕医,使用 SQL/JSON 路徑表達式獲取數(shù)據(jù)中的元素值耕漱;.emp_name 表示獲取 JSON 對象的 emp_name 元素抬伺;$.income[0].salary 表示獲取 income 數(shù)組中的第一個對象的 salary 元素螟够,數(shù)組的下標從 0 開始。
除此之外峡钓,我們也可以將 JSON 數(shù)據(jù)轉(zhuǎn)換為關(guān)系型數(shù)據(jù)妓笙。例如:
select emp_id, jt.*
from employee_json, json_table( emp_info, '$'
columns( emp_name varchar( 50 ) path '$.emp_name',
sex varchar( 10 ) path '$.sex',
dept_id integer path '$.dept_id',
manager integer path '$.manager',
hire_date date path '$.hire_date',
job_id integer path '$.job_id',
salary integer path '$.income[0].salary',
bonus integer path '$.income[1].bonus',
email varchar( 100 ) path '$.email' )
) jtlimit 3;
emp_id | emp_name | sex | dept_id | manager | hire_date | job_id | salary | bonus | email |
------ | ---------- | -- - | ------ - | ------ - | ---------- | ------ | ------ | ---- - | ------------------ - |
1 | 劉 備 | 男 | 1 | | 2000 - 01 - 01 | 1 | 33000 | 10000 | liubei@shuguo.com |
2 | 關(guān)羽 | 男 | 1 | 1 | 2000 - 01 - 01 | 2 | 26000 | 10000 | guanyu@shuguo.com |
3 | 飛 | 男 | 1 | 1 | 2000 - 01 - 01 | 2 | 24000 | 10000 | zhangfei@shuguo.com |
其中,$ 表示將整個 emp_info 作為數(shù)據(jù)行的來源椒楣;COLUMNS 定義了字段類型及其數(shù)據(jù)的來源给郊,PATH 同樣使用 SQL/JSON 路徑表達式。
反之捧灰,我們也可以通過 SQL 函數(shù)將關(guān)系型數(shù)據(jù)轉(zhuǎn)換為 JSON 數(shù)據(jù)淆九。例如:
select json_object( 'emp_name', emp_name,
'sex', sex,
'income', json_array( json_object( 'salary', salary ), json_object( 'bonus', bonus ) )
) AS jo
from employee
limit 3;
jo | ------------------------------------------------------------------------------------ - | { "sex" : "男", "income" : [{ "salary" : 30000.00 }, { "bonus" : 10000.00 }], "emp_name" : "劉備" }
{ "sex" : "男", "income" : [{ "salary" : 26000.00 }, { "bonus" : 10000.00 }], "emp_name" : "關(guān)羽" }
{ "sex" : "男", "income" : [{ "salary" : 24000.00 }, { "bonus" : 10000.00 }], "emp_name" : "張飛" } |
其中, JSON_OBJECT 和 JSON_ARRAY 函數(shù)可以將表中的數(shù)據(jù)構(gòu)造成 JSON 對象和數(shù)組毛俏。
不僅如此炭庙,使用 SQL 語句也可以對 JSON 節(jié)點數(shù)據(jù)進行 DML 操作,不再介紹具體案例煌寇。關(guān)于 MySQL 文檔存儲的詳細介紹可以參考這篇文章焕蹄。
總之,關(guān)系數(shù)據(jù)庫對于 JSON 數(shù)據(jù)類型的支持可以方便我們將 SQL 的強大功能與 NoSQL 的靈活性相結(jié)合阀溶;當我們需要為應用增加文檔數(shù)據(jù)支持的時候腻脏,除了使用專門的 NoSQL 數(shù)據(jù)庫之外,也可以考慮直接在現(xiàn)有的數(shù)據(jù)庫中使用 JSON 數(shù)據(jù)類型银锻。
2016 年 SQL 標準增加的另一個重要的功能就是行模式識別(Row Pattern Recognition)永品。
二.SQL 與復雜事件處理
SQL 行模式識別使用 MATCH_RECOGNIZE 子句表示,通過指定一個模式(正則表達式)查找多行數(shù)據(jù)之間的規(guī)律击纬,并且可以對這些匹配的數(shù)據(jù)進行過濾鼎姐、分組和聚合操作。行模式識別可以用于分析各種時間序列數(shù)據(jù)更振,例如股票行情數(shù)據(jù)分析炕桨、金融欺詐檢測或者系統(tǒng)事件日志分析等。
目前只有 Oracle 12c 實現(xiàn)了該功能肯腕,我們可以使用以下語句找出股票曲線中的所有 V 型曲線:
--Oracle 12c 實現(xiàn)
SELECT *
FROM stock MATCH_RECOGNIZE(
PARTITION BY scode
ORDER BY tradedate
MEASURES STRT.tradedate AS start_date,
LAST(DOWN.tradedate) AS bottom_date,
LAST(UP.tradedate) AS end_date
ONE ROW PER MATCH
AFTER MATCH SKIP TO LAST UP
PATTERN (STRT DOWN + UP +)
DEFINE
DOWN AS DOWN.price < PREV( DOWN.price ),
UP AS UP.price > PREV( UP.price )
) MR
ORDER BY MR.scode, MR.start_date;
其中献宫,MATCH_RECOGNIZE 子句比較復雜,它的執(zhí)行過程如下:
- PARTITION BY scode 按照股票代碼進行分區(qū)实撒,可以同時分析多只股票的數(shù)據(jù)遵蚜;如果省略帖池,所有的數(shù)據(jù)作為一個整體進行分析,這一點與窗口函數(shù)類似吭净;
- ORDER BY tradedate 按照交易日期進行排序,用于分析股票價格隨著時間變化的規(guī)律肴甸;
- **MEASURES **定義了三個輸出值寂殉,分別代表 V 型曲線的起始日期、最低點日期以及結(jié)束日期原在;其中的 STRT友扰、DOWN 和 UP 都是 DEFINE 選項中定義的變量;LAST(DOWN.tradedate) 表示下降曲線中的最后一個日期庶柿,也就是最低點日期村怪;LAST(UP.tradedate) 表示上升曲線中的最后一個日期,也就是結(jié)束日期浮庐;
- ONE ROW PER MATCH 表示每次匹配只輸出一個匯總結(jié)果甚负;每個 V 型曲線輸出一條記錄;如果使用 ALL ROWS PER MATCH 選項审残,每個 V 型曲線都會輸出構(gòu)成曲線的所有節(jié)點梭域,下文給出了相應的示例;
- AFTER MATCH SKIP TO LAST UP 表示找到匹配的數(shù)據(jù)后搅轿,從當前 V 型曲線的最后一個上升點(UP)重新開始下一次查找病涨;
- **PATTERN (STRT DOWN+ UP+) **定義了需要查找的模式,使用正則表達式語法表示璧坟。從起點(STRT)開始既穆,先下降一次或多次(DOWN+),再上升一次或多次(UP+)雀鹃,也就是 V 型曲線幻工;
- DEFINE 用于定義模式變量需要滿足的條件。STRT 變量沒有指定任何條件褐澎,意味著所有行都可以作為 V 型曲線的開始会钝;DOWN 變量要求它的價格比上一行的價格更小,PREV 函數(shù)表示上一行工三;UP 變量要求它的價格比上一行的價格更大迁酸。
該語句返回的結(jié)果如下:
SCODE | START_DATE | BOTTOM_DATE | END_DATE |
---- - | ------------------ - | ------------------ - | ------------------ - |
S001 | 2019 - 01 - 01 00 : 00 : 00 | 2019 - 01 - 05 00 : 00 : 00 | 2019 - 01 - 06 00 : 00 : 00 |
S001 | 2019 - 01 - 06 00 : 00 : 00 | 2019 - 01 - 07 00 : 00 : 00 | 2019 - 01 - 08 00 : 00 : 00 |
S001 | 2019 - 01 - 08 00 : 00 : 00 | 2019 - 01 - 12 00 : 00 : 00 | 2019 - 01 - 13 00 : 00 : 00 |
S001 | 2019 - 01 - 18 00 : 00 : 00 | 2019 - 01 - 20 00 : 00 : 00 | 2019 - 01 - 21 00 : 00 : 00 |
S001 | 2019 - 01 - 21 00 : 00 : 00 | 2019 - 01 - 22 00 : 00 : 00 | 2019 - 01 - 27 00 : 00 : 00 |
S001 | 2019 - 01 - 27 00 : 00 : 00 | 2019 - 01 - 28 00 : 00 : 00 | 2019 - 01 - 30 00 : 00 : 00 |
查詢返回了 6 條記錄,分別對應了上圖中的 6 個 V 型曲線俭正。MATCH_RECOGNIZE 支持許多選項奸鬓,尤其是通過 DEFINE 變量定義和 PATTERN 正則表達式模式可以實現(xiàn)各種復雜的趨勢分析。
SQL 行模式識別(MATCH_RECOGNIZE)能夠用于檢測數(shù)據(jù)流中的復雜模式掸读,具有處理復雜事件(CEP)的強大功能串远。常見的應用包括偵測異常的安全行為宏多、發(fā)現(xiàn)金融交易行為模式、欺詐檢測和傳感器數(shù)據(jù)分析等澡罚。
2019 年 SQL 標準增加了第 15 部分:ISO/IEC 9075-15:2019 多維數(shù)組(SQL/MDA)伸但。
三.SQL 與多維數(shù)組
多維數(shù)組(Multi-Dimensional Arrays)是各種科學和工程數(shù)據(jù)的核心基礎結(jié)構(gòu),包括一維傳感器數(shù)據(jù)留搔、二維衛(wèi)星和顯微鏡掃描圖像更胖、三維圖像時間序列和地球物理數(shù)據(jù)、以及四維氣候和海洋數(shù)據(jù)等隔显。
大部分的編程語言却妨,例如 C/C++、Java括眠、Python彪标、R 等,都提供了數(shù)組類型和相關(guān)操作的支持掷豺。早在 1999 年捞烟,SQL 就已經(jīng)對數(shù)組提供了一些非常基本的支持萌业;最新的 SQL/MDA 允許存儲坷襟、訪問和處理大規(guī)模的多維數(shù)組,例如 N 通道的衛(wèi)星圖像生年。這意味著 SQL 現(xiàn)在可以解碼圖像婴程,并且通過像素坐標直接訪問和處理圖像區(qū)域。
其中抱婉,MDA 表示在數(shù)據(jù)庫之外的數(shù)組數(shù)據(jù)档叔,支持格式包括 TIFF、netCDF蒸绩、HDF5衙四、JSON 等;SQL/MDA 表示數(shù)據(jù)庫中存儲的數(shù)組數(shù)據(jù)患亿,支持的操作包括:
- 數(shù)組數(shù)據(jù)的攝取和存儲传蹈;
- 更新存儲的數(shù)組數(shù)據(jù);
- 導出數(shù)組步藕;
- 數(shù)組和關(guān)系數(shù)據(jù)的集成查詢惦界。
以 PostgreSQL 為例,它允許將字段定義為多維數(shù)組類型咙冗,數(shù)組的元素可以是任何內(nèi)置類型沾歪、自定義類型、枚舉類型雾消、復合類型等灾搏。例如:
CREATE TABLE sal_emp(
name text,
pay_by_quarter integer[],
schedule text[][]
); INSERT INTO sal_emp
VALUES( 'Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"training", "presentation"}}' );
INSERT INTO sal_emp
VALUES( 'Carol',
ARRAY[20000, 25000, 25000, 25000],
ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']] );
sal_emp 表中包含兩個數(shù)組字段挫望,pay_by_quarter 是一個一維數(shù)組,schedule 是一個二維數(shù)組狂窑。
以下查詢返回了 Bill 一周中的前兩天計劃里的第一項內(nèi)容:
select schedule[1:2][1:1] from sal_emp where name = 'bill';name |-----|Carol|
使用下標可以訪問數(shù)組的元素媳板,PostgreSQL 中的數(shù)組元素從 1 開始編號。以下語句用于修改數(shù)組中的數(shù)據(jù)切片:
update sal_emp set pay_by_quarter[1:2] = '{27000,27000}'where name = 'carol';
PostgreSQL 為數(shù)組數(shù)據(jù)提供許多函數(shù)和運算符泉哈,例如以下查詢使用 && 運算符查找曾經(jīng)拿過 10000 報酬的員工:
select name from sal_emp where pay_by_quarter && array[10000];name|----|Bill|
unnest 函數(shù)可以將數(shù)組轉(zhuǎn)換為關(guān)系表拷肌,例如:
select name, unnest(pay_by_quarter), unnest(schedule) from sal_emp;name |unnest|unnest |-----|------|------------|Bill | 10000|meeting |Bill | 10000|lunch |Bill | 10000|training |Bill | 10000|presentation|Carol| 20000|breakfast |Carol| 25000|consulting |Carol| 25000|meeting |Carol| 25000|lunch |select name, unnest( pay_by_quarter ), unnest( schedule ) from sal_emp;
name | unnest | unnest |
---- - | ------ | ------------ |
Bill | 10000 | meeting |
Bill | 10000 | lunch |
Bill | 10000 | training |
Bill | 10000 | presentation |
Carol | 20000 | breakfast |
Carol | 25000 | consulting |
Carol | 25000 | meeting |
Carol | 25000 | lunch |
PostgreSQL 還為數(shù)組提供了 GiST 和 GIN 類型的索引,可以優(yōu)化數(shù)組數(shù)據(jù)的查詢旨巷。
除此之外,基于 PostgreSQL 的 PostGIS Raster添忘、Oracle GeoRaster 以及 rasdaman 數(shù)組數(shù)據(jù)庫則提供了更加完善的多維數(shù)組應用場景支持采呐。
四.SQL 與圖形數(shù)據(jù)庫
圖形數(shù)據(jù)庫(graph database)屬于 NoSQL 的一種,使用節(jié)點搁骑、邊和屬性來表示和存儲數(shù)據(jù)斧吐,使用圖結(jié)構(gòu)進行語義查詢。圖形數(shù)據(jù)庫非常適合社交網(wǎng)絡仲器、人工智能煤率、欺詐檢測、推薦系統(tǒng)等領域中的復雜關(guān)系處理乏冀。Neo4j 是目前最著名的圖形數(shù)據(jù)庫蝶糯。
2019 年 9 月 17 圖形查詢語言(GQL)成為了繼 SQL 之后另一種新的 ISO 標準數(shù)據(jù)庫查詢語言烟馅。與此同時扑眉,SQL 標準將會出現(xiàn)一個新的第 16 部分(SQL/PGQ)(Property Graph Query),在 SQL 中直接提供一些 GQL 功能琴庵。
目前肢扯,MariaDB(OQGRAPH)妒茬、Oracle、Microsoft SQL Server 等關(guān)系型數(shù)據(jù)庫都提供了圖結(jié)構(gòu)存儲支持蔚晨。上圖是 Oracle 中一個金融交易系統(tǒng)的圖形數(shù)據(jù)庫示例乍钻,其中 Account、Person 和 Company 是頂點铭腕,ownerOf银择、worksFor 和 transaction 是邊;另外谨履,name 和 number 是頂點的屬性欢摄,amount 是邊的屬性。它們可以使用以下數(shù)據(jù)表進行存儲:
基于這些表可以創(chuàng)建以下屬性圖形:
CREATE PROPERTY GRAPH financial_transactions
VERTEX TABLES(
Accounts LABEL Account,
Persons LABEL Person PROPERTIES( name ),
Companies LABEL Company PROPERTIES( name )
) EDGE TABLES(
Transactions SOURCE KEY ( from_account ) REFERENCES Accounts
DESTINATION KEY ( to_account ) REFERENCES Accounts
LABEL ( transaction )PROPERTIES( amount ),
PersonOwnerOfAccount SOURCE Persons
DESTINATION Accounts LABEL ownerOf NO PROPERTIES,
CompanyOwnerOfAccount SOURCE Companies
DESTINATION Accounts LABEL ownerOf NO PROPERTIES,
PersonWorksForCompany SOURCE Persons
DESTINATION Companies LABEL worksFor NO PROPERTIES
);
接下來我們就可以直接使用 SQL 語句查詢圖結(jié)構(gòu)笋粟,例如以下語句查找所有和名叫 Nikita 的人有過交易的人員和信息:
SELECT owner.name AS account_holder, SUM( t.amount ) AS total_transacted_with_Nikita
FROM MATCH( p : Person ) -[: ownerOf] - > (account1 : Account)
, MATCH( account1 ) -[t : transaction] - (account2) /* match both incoming and outgoing transactions */
, MATCH( account2 : Account ) < -[: ownerOf] - (owner : Person | Company)
WHERE p.name = 'Nikita'
GROUP BY owner
其中怀挠,MATCH 子句用于遍歷圖形結(jié)構(gòu)并返回匹配的模式析蝴,語法和 Neo4j 的 Cypher 查詢語言中的 MATCH 子句非常類似。以上查詢返回的結(jié)果如下:
+---------------- + ------------------------------ +
| account_holder | total_transacted_with_Nikita |
+---------------- + ------------------------------ |
| Camille | 1000.00 |
| Oracle | 4501.00 |
+---------------- + ------------------------------ +
隨著 SQL 標準第 16 部分(SQL/PGQ)即將出現(xiàn)绿淋,我們可以在關(guān)系數(shù)據(jù)庫中直接存儲屬性圖結(jié)構(gòu)數(shù)據(jù)闷畸,并且在 SQL 中進行屬性圖模式匹配,例如最短路徑查找和最佳路徑查找吞滞;SQL/PGQ 的另一個優(yōu)勢就是可以支持分組(GROUP BY)佑菩、聚合(AVG、SUM裁赠、COUNT 等)殿漠、排序(ORDER BY)以及許多其他的 SQL 功能。
五.SQL 與流數(shù)據(jù)處理
流數(shù)據(jù)是一組順序佩捞、大量绞幌、快速、連續(xù)到達的數(shù)據(jù)序列一忱,一般情況下可被視為一個隨時間延續(xù)而無限增長的動態(tài)數(shù)據(jù)集合莲蜘。常見的流數(shù)據(jù)包括應用程序日志文件、網(wǎng)購數(shù)據(jù)帘营、游戲玩家互動數(shù)據(jù)票渠、社交網(wǎng)站信息、金融交易實時數(shù)據(jù)或地理空間服務芬迄,以及來自數(shù)據(jù)中心內(nèi)所連接設備或儀器的遙測數(shù)據(jù)等问顷。
目前,常用的大數(shù)據(jù)流處理平臺 Spark Streaming薯鼠、Storm择诈、Flink、ksqlDB 等都提供了 SQL 流數(shù)據(jù)處理功能出皇;同時羞芍,一個關(guān)于流數(shù)據(jù)處理的 SQL 標準部分正在準備中。
其中郊艘,ksqlDB 是一個基于 Apache Kafka 的事件流數(shù)據(jù)庫荷科,提供了輕量級的 SQL 語句,大大降低了構(gòu)建流處理應用程序所需的操作復雜性纱注。
客戶端應用程序可以采用拉取查詢(pull query)和推送查詢(push query)兩種方式查看和訂閱數(shù)據(jù)流變化畏浆。
在 ksqlDB 中創(chuàng)建一個數(shù)據(jù)流并運行連續(xù)查詢的簡單示例如下:
CREATE STREAM riderLocations( profileId VARCHAR, latitude DOUBLE, longitude DOUBLE )
WITH( kafka_topic = 'locations', value_format = 'json', partitions = 1 );
--Mountain View lat, long : 37.4133, -122.1162
SELECT * FROM riderLocations
WHERE GEO_DISTANCE( latitude, longitude, 37.4133, -122.1162 ) <= 5 EMIT CHANGES;
首先,通過一個 Kafka 主題創(chuàng)建一個數(shù)據(jù)流 riderLocations(騎手位置)狞贱;消息內(nèi)容采用 json 格式存儲刻获,例如 {“profileId”: “c2309eec”, “l(fā)atitude”: 37.7877, “l(fā)ongitude”: -122.4205}。
然后瞎嬉,針對 riderLocations 數(shù)據(jù)流運行一個連續(xù)查詢蝎毡,返回距離 Mountain View(加州山景城)5 英里之內(nèi)的騎手厚柳。該查詢會一直運行,直到被終止沐兵;并且隨著事件被寫入 riderLocations别垮,它會將結(jié)果推送到客戶端。
此時扎谎,如果我們打開另一個會話連接到 ksqlDB碳想,生成一些數(shù)據(jù)流:
INSERT INTO riderLocations( profileId, latitude, longitude ) VALUES( 'c2309eec', 37.7877, -122.4205 );
INSERT INTO riderLocations( profileId, latitude, longitude ) VALUES( '18f4ea86', 37.3903, -122.0643 );
INSERT INTO riderLocations( profileId, latitude, longitude ) VALUES( '4ab5cbad', 37.3952, -122.0813 );
INSERT INTO riderLocations( profileId, latitude, longitude ) VALUES( '8b6eae59', 37.3944, -122.0813 );
INSERT INTO riderLocations( profileId, latitude, longitude ) VALUES( '4a7c7b41', 37.4049, -122.0822 );
INSERT INTO riderLocations( profileId, latitude, longitude ) VALUES( '4ddad000', 37.7857, -122.4011 );
隨著每次事件的生成,流查詢語句將會在第一個會話中實時輸出匹配的數(shù)據(jù)行毁靶。
六.總結(jié)
隨著互聯(lián)網(wǎng)和大數(shù)據(jù)等新技術(shù)的發(fā)展胧奔,SQL 早已不僅僅是當年的關(guān)系數(shù)據(jù)庫查詢語言了;無論是面向?qū)ο筇匦裕ɡ缱远x類型)预吆、文檔數(shù)據(jù)(XML葡盗、JSON)的存儲和處理、時態(tài)數(shù)據(jù)的存儲和處理啡浊、復雜事件和流數(shù)據(jù)處理、數(shù)據(jù)科學中的多維數(shù)組以及圖形數(shù)據(jù)庫等各種 NoSQL 功能已經(jīng)或者即將成為 SQL 標準中的一部分胶背,One SQL to Rule Them All巷嚣!