自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

數(shù)據(jù)庫 SQL Server
SQL 在經(jīng)歷了四十而不惑之后就像“姐姐們”一樣成熟而有魅力,同時它又敢于在不斷變化的產(chǎn)業(yè)需求和各種非關(guān)系模型的沖擊之下實現(xiàn)自我突破。因此,本文就給大家介紹一下最近幾年 SQL 如何在各個領(lǐng)域乘風(fēng)破浪!

SQL 由 IBM 于上世紀(jì) 70 年代創(chuàng)建,如今已經(jīng)成為了使用最廣泛的數(shù)據(jù)庫查詢語言。不過,相信很多人對于 SQL 的理解就是關(guān)系數(shù)據(jù)庫,就是增刪改查;實際上,SQL 在經(jīng)歷了四十而不惑之后就像“姐姐們”一樣成熟而有魅力,同時它又敢于在不斷變化的產(chǎn)業(yè)需求和各種非關(guān)系模型的沖擊之下實現(xiàn)自我突破。因此,本文就給大家介紹一下最近幾年 SQL 如何在各個領(lǐng)域乘風(fēng)破浪!

 

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

如果你認(rèn)為 SQL 就是簡單的增刪改查(INSERT、SELECT、UPDATE、DELETE),那么你了解的僅僅是 1992 年的SQL。

如果你了解通用表表達(dá)式(CTE)和遞歸查詢、用戶定義類型或者 OLAP 功能,那么你使用的是 1999 年的 SQL。

如果你接觸過窗口函數(shù)(分析函數(shù))、MERGE(UPSERT)語句或者 XML 數(shù)據(jù)類型,應(yīng)該知道這些不過是 2003 年的 SQL。

2006 年的 SQL 已經(jīng)定義了 SQL 操作 XML 的規(guī)范,支持使用 XQuery 同時訪問 SQL 數(shù)據(jù)和 XML 文檔。2008 年又增加了 TRUNCATE TABLE 語句、INSTEAD OF 觸發(fā)器以及 FETCH 子句等功能。

2011 年 SQL 最主要的新功能之一就是增強(qiáng)了對時態(tài)數(shù)據(jù)庫(Temporal database)的支持,可以用于記錄那些隨著時間而變化的歷史數(shù)據(jù)值,應(yīng)用領(lǐng)域包括金融、保險、預(yù)訂系統(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 標(biāo)準(zhǔn)又增加了幾個重要的功能,首先就是對 JSON 文檔的支持。

一.SQL 與文檔數(shù)據(jù)庫

文檔數(shù)據(jù)庫屬于 NoSQL 的一種,具有模式自由的存儲特性,通常采用 JSON 格式進(jìn)程數(shù)據(jù)的存儲。常用的文檔數(shù)據(jù)庫包括 MongoDB、CouchDB 等。

實際上,2016 年 SQL 標(biāo)準(zhǔn)就已經(jīng)增加了 JSON 功能的支持,包括:

  • JSON 對象的存儲與檢索;
  • 將 JSON 對象表示成 SQL 數(shù)據(jù);
  • 將 SQL 數(shù)據(jù)表示成 JSON 對象。

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

 

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

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

 

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

我們以 MySQL 為例,演示一下如何使用 SQL 查詢 JSON 數(shù)據(jù)。

  1. select emp_id,  
  2.        emp_info,  
  3.        emp_info->'$.emp_name' emp_name,  
  4.        emp_info->'$.sex' sex,  
  5.        emp_info->>'$.income[0].salary' salary  
  6. from employee_json  
  7. limit 3;
  8.  
  9. emp_id|emp_info|emp_name|sex|salary |  
  10. ------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------|---|-------| 
  11.  
  12.      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| 
  13.  
  14.      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  | 
  15.  
  16.      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 路徑表達(dá)式獲取數(shù)據(jù)中的元素值;$ 代表整個文檔;$.emp_name 表示獲取 JSON 對象的 emp_name 元素;$.income[0].salary 表示獲取 income 數(shù)組中的第一個對象的 salary 元素,數(shù)組的下標(biāo)從 0 開始。

除此之外,我們也可以將 JSON 數(shù)據(jù)轉(zhuǎn)換為關(guān)系型數(shù)據(jù)。例如:

  1. select emp_id, jt.*  
  2. from employee_json,  
  3.      json_table(emp_info, '$'  
  4.          columns (emp_name  varchar(50) path '$.emp_name' 
  5.                   sex       varchar(10) path '$.sex' 
  6.                   dept_id   integer path '$.dept_id' 
  7.                   manager   integer path '$.manager' 
  8.                   hire_date date path '$.hire_date' 
  9.                   job_id    integer path '$.job_id' 
  10.                   salary    integer path '$.income[0].salary' 
  11.                   bonus     integer path '$.income[1].bonus' 
  12.                   email     varchar(100) path '$.email' 
  13.      ) jt  
  14. limit 3;  
  15. emp_id|emp_name  |sex|dept_id|manager|hire_date |job_id|salary|bonus|email              |  
  16. ------|----------|---|-------|-------|----------|------|------|-----|-------------------|  
  17.      1|劉備      |男  |      1|       |2000-01-01|     1| 33000|10000|liubei@shuguo.com  |  
  18.      2|關(guān)羽      |男  |      1|      1|2000-01-01|     2| 26000|10000|guanyu@shuguo.com  |  
  19.      3|張飛      |男  |      1|      1|2000-01-01|     2| 24000|10000|zhangfei@shuguo.com| 

其中,$ 表示將整個 emp_info 作為數(shù)據(jù)行的來源;COLUMNS 定義了字段類型及其數(shù)據(jù)的來源,PATH 同樣使用 SQL/JSON 路徑表達(dá)式。

反之,我們也可以通過 SQL 函數(shù)將關(guān)系型數(shù)據(jù)轉(zhuǎn)換為 JSON 數(shù)據(jù)。例如:

  1. select json_object('emp_name', emp_name,  
  2.                    'sex', sex,  
  3.                    'income', json_array(json_object('salary', salary), json_object('bonus', bonus))  
  4.                   ) AS jo 
  5.  
  6. from employee 
  7.  limit 3;  
  8. jo                                                                                   | 
  9.  
  10. -------------------------------------------------------------------------------------| 
  11.  
  12. {"sex""男""income": [{"salary": 30000.00}, {"bonus": 10000.00}], "emp_name""劉備" 
  13. {"sex""男""income": [{"salary": 26000.00}, {"bonus": 10000.00}], "emp_name""關(guān)羽" 
  14. {"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ù)進(jìn)行 DML 操作,不再介紹具體案例。關(guān)于 MySQL 文檔存儲的詳細(xì)介紹可以參考這篇文章。

總之,關(guān)系數(shù)據(jù)庫對于 JSON 數(shù)據(jù)類型的支持可以方便我們將 SQL 的強(qiáng)大功能與 NoSQL 的靈活性相結(jié)合;當(dāng)我們需要為應(yīng)用增加文檔數(shù)據(jù)支持的時候,除了使用專門的 NoSQL 數(shù)據(jù)庫之外,也可以考慮直接在現(xiàn)有的數(shù)據(jù)庫中使用 JSON 數(shù)據(jù)類型。

2016 年 SQL 標(biāo)準(zhǔn)增加的另一個重要的功能就是行模式識別(Row Pattern Recognition)。

二.SQL 與復(fù)雜事件處理

SQL 行模式識別使用 MATCH_RECOGNIZE 子句表示,通過指定一個模式(正則表達(dá)式)查找多行數(shù)據(jù)之間的規(guī)律,并且可以對這些匹配的數(shù)據(jù)進(jìn)行過濾、分組和聚合操作。行模式識別可以用于分析各種時間序列數(shù)據(jù),例如股票行情數(shù)據(jù)分析、金融欺詐檢測或者系統(tǒng)事件日志分析等。

 

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

目前只有 Oracle 12c 實現(xiàn)了該功能,我們可以使用以下語句找出股票曲線中的所有 V 型曲線:

  1. -- Oracle 12c 實現(xiàn) 
  2. SELECT * 
  3.   FROM stock MATCH_RECOGNIZE ( 
  4.          PARTITION BY scode 
  5.          ORDER BY tradedate 
  6.          MEASURES STRT.tradedate AS start_date, 
  7.                   LAST(DOWN.tradedate) AS bottom_date, 
  8.                   LAST(UP.tradedate) AS end_date 
  9.          ONE ROW PER MATCH 
  10.          AFTER MATCH SKIP TO LAST UP 
  11.          PATTERN (STRT DOWN+ UP+) 
  12.          DEFINE 
  13.            DOWN AS DOWN.price < PREV(DOWN.price), 
  14.            UP AS UP.price > PREV(UP.price) 
  15.         ) MR 
  16.   ORDER BY MR.scode, MR.start_date; 

其中,MATCH_RECOGNIZE 子句比較復(fù)雜,它的執(zhí)行過程如下:

  • PARTITION BY scode 按照股票代碼進(jìn)行分區(qū),可以同時分析多只股票的數(shù)據(jù);如果省略,所有的數(shù)據(jù)作為一個整體進(jìn)行分析,這一點與窗口函數(shù)類似;
  • ORDER BY tradedate 按照交易日期進(jìn)行排序,用于分析股票價格隨著時間變化的規(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é)點,下文給出了相應(yīng)的示例;
  • AFTER MATCH SKIP TO LAST UP 表示找到匹配的數(shù)據(jù)后,從當(dāng)前 V 型曲線的最后一個上升點(UP)重新開始下一次查找;
  • PATTERN (STRT DOWN+ UP+) 定義了需要查找的模式,使用正則表達(dá)式語法表示。從起點(STRT)開始,先下降一次或多次(DOWN+),再上升一次或多次(UP+),也就是 V 型曲線;
  • DEFINE 用于定義模式變量需要滿足的條件。STRT 變量沒有指定任何條件,意味著所有行都可以作為 V 型曲線的開始;DOWN 變量要求它的價格比上一行的價格更小,PREV 函數(shù)表示上一行;UP 變量要求它的價格比上一行的價格更大。

該語句返回的結(jié)果如下:

  1. SCODE|START_DATE         |BOTTOM_DATE        |END_DATE           |  
  2. -----|-------------------|-------------------|-------------------|  
  3. S001 |2019-01-01 00:00:00|2019-01-05 00:00:00|2019-01-06 00:00:00|  
  4. S001 |2019-01-06 00:00:00|2019-01-07 00:00:00|2019-01-08 00:00:00|  
  5. S001 |2019-01-08 00:00:00|2019-01-12 00:00:00|2019-01-13 00:00:00|  
  6. S001 |2019-01-18 00:00:00|2019-01-20 00:00:00|2019-01-21 00:00:00|  
  7. S001 |2019-01-21 00:00:00|2019-01-22 00:00:00|2019-01-27 00:00:00|  
  8. S001 |2019-01-27 00:00:00|2019-01-28 00:00:00|2019-01-30 00:00:00| 

查詢返回了 6 條記錄,分別對應(yīng)了上圖中的 6 個 V 型曲線。MATCH_RECOGNIZE 支持許多選項,尤其是通過 DEFINE 變量定義和 PATTERN 正則表達(dá)式模式可以實現(xiàn)各種復(fù)雜的趨勢分析。

SQL 行模式識別(MATCH_RECOGNIZE)能夠用于檢測數(shù)據(jù)流中的復(fù)雜模式,具有處理復(fù)雜事件(CEP)的強(qiáng)大功能。常見的應(yīng)用包括偵測異常的安全行為、發(fā)現(xiàn)金融交易行為模式、欺詐檢測和傳感器數(shù)據(jù)分析等。

2019 年 SQL 標(biāo)準(zhǔn)增加了第 15 部分:ISO/IEC 9075-15:2019 多維數(shù)組(SQL/MDA)。

三.SQL 與多維數(shù)組

多維數(shù)組(Multi-Dimensional Arrays)是各種科學(xué)和工程數(shù)據(jù)的核心基礎(chǔ)結(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)在可以解碼圖像,并且通過像素坐標(biāo)直接訪問和處理圖像區(qū)域。

 

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

其中,MDA 表示在數(shù)據(jù)庫之外的數(shù)組數(shù)據(jù),支持格式包括 TIFF、netCDF、HDF5、JSON 等;SQL/MDA 表示數(shù)據(jù)庫中存儲的數(shù)組數(shù)據(jù),支持的操作包括:

  • 數(shù)組數(shù)據(jù)的攝取和存儲;
  • 更新存儲的數(shù)組數(shù)據(jù);
  • 導(dǎo)出數(shù)組;
  • 數(shù)組和關(guān)系數(shù)據(jù)的集成查詢。

以 PostgreSQL 為例,它允許將字段定義為多維數(shù)組類型,數(shù)組的元素可以是任何內(nèi)置類型、自定義類型、枚舉類型、復(fù)合類型等。例如:

  1. CREATE TABLE sal_emp ( 
  2.  
  3.     name            text, 
  4.  
  5.     pay_by_quarter  integer[], 
  6.  
  7.     schedule        text[][] 
  8.  
  9. );  
  10.  
  11. INSERT INTO sal_emp 
  12.  
  13.     VALUES ('Bill'
  14.  
  15.     '{10000, 10000, 10000, 10000}'
  16.  
  17.     '{{"meeting", "lunch"}, {"training", "presentation"}}'); 
  18.  
  19. INSERT INTO sal_emp 
  20.  
  21.     VALUES ('Carol'
  22.  
  23.     ARRAY[20000, 25000, 25000, 25000], 
  24.  
  25.     ARRAY[['breakfast''consulting'], ['meeting''lunch']]); 

sal_emp 表中包含兩個數(shù)組字段,pay_by_quarter 是一個一維數(shù)組,schedule 是一個二維數(shù)組。

以下查詢返回了 Bill 一周中的前兩天計劃里的第一項內(nèi)容:

  1. select schedule[1:2][1:1] from sal_emp where name = 'bill' 
  2. name |  
  3. -----|  
  4. Carol| 

使用下標(biāo)可以訪問數(shù)組的元素,PostgreSQL 中的數(shù)組元素從 1 開始編號。以下語句用于修改數(shù)組中的數(shù)據(jù)切片:

  1. update sal_emp   
  2. set pay_by_quarter[1:2] = '{27000,27000}'  
  3. where name = 'carol'

PostgreSQL 為數(shù)組數(shù)據(jù)提供許多函數(shù)和運(yùn)算符,例如以下查詢使用 && 運(yùn)算符查找曾經(jīng)拿過 10000 報酬的員工:

  1. select name from sal_emp where pay_by_quarter && array[10000]; 
  2.  
  3. name
  4.  
  5. ----| 
  6.  
  7. Bill| 

unnest 函數(shù)可以將數(shù)組轉(zhuǎn)換為關(guān)系表,例如:

  1. select name, unnest(pay_by_quarter), unnest(schedule) from sal_emp; 
  2.  
  3. name |unnest|unnest      | 
  4.  
  5. -----|------|------------| 
  6.  
  7. Bill | 10000|meeting     | 
  8.  
  9. Bill | 10000|lunch       | 
  10.  
  11. Bill | 10000|training    | 
  12.  
  13. Bill | 10000|presentation| 
  14.  
  15. Carol| 20000|breakfast   | 
  16.  
  17. Carol| 25000|consulting  | 
  18.  
  19. Carol| 25000|meeting     | 
  20.  
  21. Carol| 25000|lunch       | 

PostgreSQL 還為數(shù)組提供了 GiST 和 GIN 類型的索引,可以優(yōu)化數(shù)組數(shù)據(jù)的查詢。

除此之外,基于 PostgreSQL 的 PostGIS Raster、Oracle GeoRaster 以及 rasdaman 數(shù)組數(shù)據(jù)庫則提供了更加完善的多維數(shù)組應(yīng)用場景支持。

四.SQL 與圖形數(shù)據(jù)庫

圖形數(shù)據(jù)庫(graph database)屬于 NoSQL 的一種,使用節(jié)點、邊和屬性來表示和存儲數(shù)據(jù),使用圖結(jié)構(gòu)進(jìn)行語義查詢。圖形數(shù)據(jù)庫非常適合社交網(wǎng)絡(luò)、人工智能、欺詐檢測、推薦系統(tǒng)等領(lǐng)域中的復(fù)雜關(guān)系處理。Neo4j 是目前最著名的圖形數(shù)據(jù)庫。

 

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

2019 年 9 月 17 圖形查詢語言(GQL)成為了繼 SQL 之后另一種新的 ISO 標(biāo)準(zhǔn)數(shù)據(jù)庫查詢語言。與此同時,SQL 標(biāo)準(zhǔn)將會出現(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ù)表進(jìn)行存儲:

 

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

基于這些表可以創(chuàng)建以下屬性圖形:

  1. CREATE PROPERTY GRAPH financial_transactions 
  2.  
  3.   VERTEX TABLES ( 
  4.  
  5.     Accounts LABEL Account, 
  6.  
  7.     Persons LABEL Person PROPERTIES ( name ), 
  8.  
  9.     Companies LABEL Company PROPERTIES ( name ) 
  10.  
  11.   ) 
  12.  
  13.   EDGE TABLES ( 
  14.  
  15.     Transactions 
  16.  
  17.       SOURCE KEY ( from_account ) REFERENCES Accounts 
  18.  
  19.       DESTINATION KEY ( to_account ) REFERENCES Accounts 
  20.  
  21.       LABEL ( transaction ) PROPERTIES ( amount ), 
  22.  
  23.     PersonOwnerOfAccount 
  24.  
  25.       SOURCE Persons 
  26.  
  27.       DESTINATION Accounts 
  28.  
  29.       LABEL ownerOf NO PROPERTIES, 
  30.  
  31.     CompanyOwnerOfAccount 
  32.  
  33.       SOURCE Companies 
  34.  
  35.       DESTINATION Accounts 
  36.  
  37.       LABEL ownerOf NO PROPERTIES, 
  38.  
  39.     PersonWorksForCompany 
  40.  
  41.       SOURCE Persons 
  42.  
  43.       DESTINATION Companies 
  44.  
  45.       LABEL worksFor NO PROPERTIES 
  46.  
  47.   ); 

接下來我們就可以直接使用 SQL 語句查詢圖結(jié)構(gòu),例如以下語句查找所有和名叫 Nikita 的人有過交易的人員和信息:

  1. SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita 
  2.    FROM MATCH (p:Person) -[:ownerOf]-> (account1:Account) 
  3.       , MATCH (account1) -[t:transaction]- (account2) /* match both incoming and outgoing transactions */ 
  4.       , MATCH (account2:Account) <-[:ownerOf]- (owner:Person|Company) 
  5.   WHERE p.name = 'Nikita' 
  6. ROUP BY owner 

其中,MATCH 子句用于遍歷圖形結(jié)構(gòu)并返回匹配的模式,語法和 Neo4j 的 Cypher 查詢語言中的 MATCH 子句非常類似。以上查詢返回的結(jié)果如下:

  1. +----------------+------------------------------+ 
  2.  
  3. | account_holder | total_transacted_with_Nikita | 
  4.  
  5. +----------------+------------------------------| 
  6.  
  7. | Camille        | 1000.00                      | 
  8.  
  9. | Oracle         | 4501.00                      | 
  10.  
  11. +----------------+------------------------------+ 

隨著 SQL 標(biāo)準(zhǔn)第 16 部分(SQL/PGQ)即將出現(xiàn),我們可以在關(guān)系數(shù)據(jù)庫中直接存儲屬性圖結(jié)構(gòu)數(shù)據(jù),并且在 SQL 中進(jìn)行屬性圖模式匹配,例如最短路徑查找和最佳路徑查找;SQL/PGQ 的另一個優(yōu)勢就是可以支持分組(GROUP BY)、聚合(AVG、SUM、COUNT 等)、排序(ORDER BY)以及許多其他的 SQL 功能。

五.SQL 與流數(shù)據(jù)處理

流數(shù)據(jù)是一組順序、大量、快速、連續(xù)到達(dá)的數(shù)據(jù)序列,一般情況下可被視為一個隨時間延續(xù)而無限增長的動態(tài)數(shù)據(jù)集合。常見的流數(shù)據(jù)包括應(yīng)用程序日志文件、網(wǎng)購數(shù)據(jù)、游戲玩家互動數(shù)據(jù)、社交網(wǎng)站信息、金融交易實時數(shù)據(jù)或地理空間服務(wù),以及來自數(shù)據(jù)中心內(nèi)所連接設(shè)備或儀器的遙測數(shù)據(jù)等。

目前,常用的大數(shù)據(jù)流處理平臺 Spark Streaming、Storm、Flink、ksqlDB 等都提供了 SQL 流數(shù)據(jù)處理功能;同時,一個關(guān)于流數(shù)據(jù)處理的 SQL 標(biāo)準(zhǔn)部分正在準(zhǔn)備中。

其中,ksqlDB 是一個基于 Apache Kafka 的事件流數(shù)據(jù)庫,提供了輕量級的 SQL 語句,大大降低了構(gòu)建流處理應(yīng)用程序所需的操作復(fù)雜性。

 

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

客戶端應(yīng)用程序可以采用拉取查詢(pull query)和推送查詢(push query)兩種方式查看和訂閱數(shù)據(jù)流變化。

在 ksqlDB 中創(chuàng)建一個數(shù)據(jù)流并運(yùn)行連續(xù)查詢的簡單示例如下:

  1. CREATE STREAM riderLocations (profileId VARCHAR, latitude DOUBLE, longitude DOUBLE
  2.   WITH (kafka_topic='locations', value_format='json', partitions=1); 
  3.  
  4. -- Mountain View lat, long: 37.4133, -122.1162 
  5. SELECT * FROM riderLocations 
  6.   WHERE GEO_DISTANCE(latitude, longitude, 37.4133, -122.1162) <= 5 EMIT CHANGES; 

首先,通過一個 Kafka 主題創(chuàng)建一個數(shù)據(jù)流 riderLocations(騎手位置);消息內(nèi)容采用 json 格式存儲,例如 {“profileId”: “c2309eec”, “latitude”: 37.7877, “longitude”: -122.4205}。

然后,針對 riderLocations 數(shù)據(jù)流運(yùn)行一個連續(xù)查詢,返回距離 Mountain View(加州山景城)5 英里之內(nèi)的騎手。該查詢會一直運(yùn)行,直到被終止;并且隨著事件被寫入 riderLocations,它會將結(jié)果推送到客戶端。

此時,如果我們打開另一個會話連接到 ksqlDB,生成一些數(shù)據(jù)流:

  1. INSERT INTO riderLocations (profileId, latitude, longitude) VALUES ('c2309eec', 37.7877, -122.4205); 
  2. INSERT INTO riderLocations (profileId, latitude, longitude) VALUES ('18f4ea86', 37.3903, -122.0643); 
  3. INSERT INTO riderLocations (profileId, latitude, longitude) VALUES ('4ab5cbad', 37.3952, -122.0813); 
  4. INSERT INTO riderLocations (profileId, latitude, longitude) VALUES ('8b6eae59', 37.3944, -122.0813); 
  5. INSERT INTO riderLocations (profileId, latitude, longitude) VALUES ('4a7c7b41', 37.4049, -122.0822); 
  6. INSERT INTO riderLocations (profileId, latitude, longitude) VALUES ('4ddad000', 37.7857, -122.4011); 

隨著每次事件的生成,流查詢語句將會在第一個會話中實時輸出匹配的數(shù)據(jù)行。

六.總結(jié)

隨著互聯(lián)網(wǎng)和大數(shù)據(jù)等新技術(shù)的發(fā)展,SQL 早已不僅僅是當(dāng)年的關(guān)系數(shù)據(jù)庫查詢語言了;無論是面向?qū)ο筇匦?例如自定義類型)、文檔數(shù)據(jù)(XML、JSON)的存儲和處理、時態(tài)數(shù)據(jù)的存儲和處理、復(fù)雜事件和流數(shù)據(jù)處理、數(shù)據(jù)科學(xué)中的多維數(shù)組以及圖形數(shù)據(jù)庫等各種 NoSQL 功能已經(jīng)或者即將成為 SQL 標(biāo)準(zhǔn)中的一部分,One SQL to Rule Them All!

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運(yùn)維

2017-05-25 15:02:46

聯(lián)宇益通SD-WAN

2015-10-19 12:33:01

華三/新IT

2016-05-09 18:40:26

VIP客戶緝拿

2018-05-09 15:42:24

新零售

2023-11-20 08:18:49

Netty服務(wù)器

2009-02-04 15:43:45

敏捷開發(fā)PHPFleaPHP

2009-12-01 16:42:27

Gentoo Linu

2011-02-28 10:38:13

Windows 8

2021-05-14 10:28:54

線程協(xié)程數(shù)量

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2016-03-24 18:51:40

2009-06-12 15:26:02

2015-08-25 09:52:36

云計算云計算產(chǎn)業(yè)云計算政策

2013-01-11 18:10:56

軟件

2021-12-23 15:11:46

Web 3.0元宇宙Metaverse

2019-01-03 14:39:08

Oracle甲骨文ORACLE

2022-05-05 21:47:32

Linuxls 命令
點贊
收藏

51CTO技術(shù)棧公眾號