成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

第21期:常規遍歷語法

企業動態
遍歷可以說是最基本的集合運算了,我們從簡單到復雜來考查遍歷運算中的可能情況,并討論SQL語法在這方面的表現。

 

第21期:常規遍歷語法

 

遍歷可以說是最基本的集合運算了,比如求和、計數、尋找***最小值等聚合運算,按條件過濾集合、根據集合成員生成另一個新集合,也都是遍歷運算。集合化語法要求我們能用很短的語句(經常就只有一句,而不是若干語句構成的一段程序)來描述大部分遍歷運算,這樣我們需要考查遍歷運算中可能出現的各種常見情況,并設計出合理自洽的語法規則。

我們從簡單到復雜來考查遍歷運算中的可能情況,并討論SQL語法在這方面的表現。

1. 直接針對集合成員運算

比如計算集合成員的合計。

這是最簡單的情況,采用普通的函數語法風格就可以,將待遍歷的集合作為參數獲得返回值,比如sum(A)用于計算集成A成員的合計,當然也可以使用對象式的語法風格寫成A.sum()。

2. 引用集合成員

比如我們不是要計算集合成員的合計,而是要計算平方和,那么這個平方該如何描述?

這就會用到我們在談集合化語法時提到的lambda語法。平方這個運算本質上是一個函數,在遍歷過程中它以被遍歷集合的當前成員作為參數,返回該參數的平方。而lambda語法允許將這個函數以表達式的形式并一起寫入整個計算遍歷運算式,一個語句就可以完成。但這里就有一個問題,我們在這個lambda表達式中用什么標識符或符號表示這個當前成員呢?

顯然,象普通函數那個先定義參數名不是個好辦法,那會讓lamdba表達式寫得很臃腫,失去lambda語法的簡潔性。盡管有些程序設計語言確實是這么做的,不過我們并不提倡。使用一個固定的標識符也不好,太長了用起來不方便,太短又很可能與其它局部變量重名導致歧義。我們提倡在這里使用一個特殊符號來完成這個目的。

比如使用~表示當前成員時,平方和就可以寫成A.sum(~*~),簡單易懂。也可以分兩步做,先計算出集合成員的平方構成一個新集合,再計算新集合的合計,寫成類似A.(~*~).sum()的形式,后一步不再需要~寫法,前一步仍需要~寫法來描述平方這個表達式函數。

3. 使用結構化數據時引用字段

但是,我們發現,被認為是集合化語言的SQL中并沒有使用某個符號或標識符來表示當前遍歷成員,那么SQL又是怎么解決問題2的呢?

事實上,SQL并沒有普通意義上可由任何成員構成的集合。SQL的集合就是表,而表的成員都是相同結構的記錄。SQL體系中有記錄這個概念,但并不能把記錄作為一種數據類型來引用。如果我們要在SQL中針對一個單值成員的集合進行遍歷,也只能把單值做成只有一個字段的記錄,而針對這些記錄構成的表進行遍歷。所有計算都是針對某些字段進行的,而不能針對整條記錄。

但這和SQL沒有表示當前成員的符號有什么關系呢?

我們在前面說集合化語法時還提到,面向結構化數據計算的集合化語法需要有簡潔的方式引用字段,SQL提供了可以直接引用字段的便捷機制,而SQL又只能計算字段,那就可以不必再提供引用當前成員(記錄)的手段了。比如SQL中計算平方和一定是某個字段的平方和,而整條記錄(集合成員)的平方則沒有意義。

SQL犧牲了集合的表達能力而簡化了語法。對于能夠支持泛型成員構成集合的語言來講,~寫法就是必要的了。而且,如果用于結構化數據計算時,SQL這種可以直接字段的寫法也要得到支持才會方便,計算某銷售帳目的金額時寫成"~.單價*~.數量"顯然不如寫成"單價*數量“更為簡單直觀,好的程序語言應當借鑒SQL這種風格。

4. 嵌套引用時的規則

遍歷在本質上就是一個循環,而循環語句可能有多層,這樣遍歷也可能會有嵌套引用。比如計算A,B兩個集合的交集,簡單的算法就是遍歷A的成員,看是不是在B集合中出現過(也是遍歷),這就會涉及到兩層的遍歷。

這時候~寫法就會產生歧義了,~到底是指A集合還是B集合的當前成員,這需要在語法規則上做一個明確的約定。

一般采用的是就近原則,即如果沒有指明~是哪個集合的,那缺省認為是內層遍歷集合的,而外層遍歷集合的當前成員則需要顯式地指出其從屬于哪個集合。計算交集的表達式就可以寫成A.select(B.count(~==A.~)>0),其中的~缺省表示B的當前成員,而另一個要顯式地寫成A.~以示區分。

面向結構化數據計算時可以直接引用字段名,這時也可能產生內外層的歧義,也可以適用于就近原則,SQL就是這樣。當內外層表有相同字段名時,則缺省被認為是內存表的字段,引用外層表的同名字段時必須顯式地寫上表名;如果內外存表中沒有相同字段名,則可以正確識別出來而不必書寫表名。

遍歷運算雖然很基本,但設計其語法時仍有一些注意事項。SQL在這方面總體表現不錯,除了缺乏泛型成員的集合外,用于描述常規遍歷運算還是比較方便簡捷的。

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-09-13 08:45:33

遍歷SQL運算

2018-01-10 15:25:43

JOIN維度SQL

2017-08-16 15:31:31

SQL語法集合化

2017-08-09 16:13:48

SQL大數據語法

2018-03-14 07:47:41

大數據語法SQL

2017-08-22 21:55:18

SQL語法離散性

2023-08-18 17:25:45

掘力計劃大語言模型

2012-06-12 10:00:38

紅帽

2009-11-17 15:07:16

PHP數組遍歷

2023-08-18 17:24:09

掘力計劃大語言模型

2012-06-13 16:05:27

.NET

2011-08-03 10:50:28

網絡安全技術周刊

2013-01-21 13:41:59

IBMdW

2017-10-09 22:33:56

SQL等值分組有序分組

2012-05-23 09:35:55

技術沙龍

2023-08-16 18:23:28

掘力計劃網易有道大模型

2023-08-17 10:29:28

掘力計劃大語言模型

2017-10-18 22:34:33

SQL等值分組有序分組

2018-01-18 20:47:18

CPU數據線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人高清 | 亚洲免费视频网址 | 玖玖精品 | 七七婷婷婷婷精品国产 | 99久9| 国产日韩欧美精品一区二区三区 | www.亚洲免费 | 国产成人免费一区二区60岁 | 最新中文字幕在线 | 一级毛片,一级毛片 | 久久久久久综合 | 精品久久久久久18免费网站 | 中文字幕不卡 | 99久久99| 精品一区二区三区在线播放 | 成人视屏在线观看 | 日韩精品免费在线 | 日韩一区二区黄色片 | 91精品国产综合久久久久久 | 色偷偷噜噜噜亚洲男人 | 欧美a∨ | av天天看 | 毛片站| 亚洲国产一区二区三区在线观看 | 在线视频日韩 | 国产精品亚洲精品 | 国产成人网 | 欧美视频一级 | 欧美精品在线看 | 国产1区| 日韩精品亚洲专区在线观看 | 国产欧美在线观看 | 欧美激情在线一区二区三区 | 欧美一级片在线看 | 精品视频免费 | 日韩欧美综合在线视频 | 国产成视频在线观看 | 亚洲高清一区二区三区 | 国产免费视频 | 日本中出视频 | 成年人黄色小视频 |