一文帶你了解不一樣的SQL,驚喜多多

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 對象酱讶。

這些功能可以表示為以下示意圖:

image.png

如今,主流的關(guān)系數(shù)據(jù)庫也都增加了原生 JSON 數(shù)據(jù)類型和相關(guān)函數(shù)的支持彼乌,包括 Oracle泻肯、MySQL、SQL Server慰照、PostgreSQL 等灶挟。

image.png

我們以 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)事件日志分析等。

image.png

目前只有 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ū)域。

image.png

其中抱婉,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ù)庫蝶糯。

image.png

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ù)表進行存儲:

image.png

基于這些表可以創(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)建流處理應用程序所需的操作復雜性纱注。

image.png

客戶端應用程序可以采用拉取查詢(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巷嚣!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钳吟,隨后出現(xiàn)的幾起案子廷粒,更是在濱河造成了極大的恐慌,老刑警劉巖红且,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坝茎,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇番,警方通過查閱死者的電腦和手機嗤放,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壁酬,“玉大人次酌,你說我怎么就攤上這事∮咔牵” “怎么了岳服?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長希俩。 經(jīng)常有香客問我吊宋,道長,這世上最難降的妖魔是什么颜武? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任璃搜,我火速辦了婚禮拖吼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腺劣。我一直安慰自己绿贞,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布橘原。 她就那樣靜靜地躺著籍铁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趾断。 梳的紋絲不亂的頭發(fā)上拒名,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音芋酌,去河邊找鬼增显。 笑死,一個胖子當著我的面吹牛脐帝,可吹牛的內(nèi)容都是我干的同云。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堵腹,長吁一口氣:“原來是場噩夢啊……” “哼炸站!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疚顷,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤旱易,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腿堤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阀坏,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年笆檀,在試婚紗的時候發(fā)現(xiàn)自己被綠了忌堂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酗洒,死狀恐怖浸船,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寝蹈,我是刑警寧澤李命,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站箫老,受9級特大地震影響封字,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一阔籽、第九天 我趴在偏房一處隱蔽的房頂上張望流妻。 院中可真熱鬧,春花似錦笆制、人聲如沸绅这。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽证薇。三九已至,卻和暖如春匆篓,著一層夾襖步出監(jiān)牢的瞬間浑度,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工鸦概, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箩张,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓窗市,卻偏偏與公主長得像先慷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咨察,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354