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

第21期:常規(guī)遍歷語法

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

 

第21期:常規(guī)遍歷語法

 

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

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

1. 直接針對集合成員運(yùn)算

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

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

2. 引用集合成員

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

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

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

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

3. 使用結(jié)構(gòu)化數(shù)據(jù)時引用字段

但是,我們發(fā)現(xiàn),被認(rèn)為是集合化語言的SQL中并沒有使用某個符號或標(biāo)識符來表示當(dāng)前遍歷成員,那么SQL又是怎么解決問題2的呢?

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

但這和SQL沒有表示當(dāng)前成員的符號有什么關(guān)系呢?

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

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

4. 嵌套引用時的規(guī)則

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

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

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

面向結(jié)構(gòu)化數(shù)據(jù)計算時可以直接引用字段名,這時也可能產(chǎn)生內(nèi)外層的歧義,也可以適用于就近原則,SQL就是這樣。當(dāng)內(nèi)外層表有相同字段名時,則缺省被認(rèn)為是內(nèi)存表的字段,引用外層表的同名字段時必須顯式地寫上表名;如果內(nèi)外存表中沒有相同字段名,則可以正確識別出來而不必書寫表名。

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

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2017-09-13 08:45:33

遍歷SQL運(yùn)算

2018-01-10 15:25:43

JOIN維度SQL

2017-08-16 15:31:31

SQL語法集合化

2018-03-14 07:47:41

大數(shù)據(jù)語法SQL

2017-08-22 21:55:18

SQL語法離散性

2017-08-09 16:13:48

SQL大數(shù)據(jù)語法

2023-08-18 17:25:45

掘力計劃大語言模型

2012-06-12 10:00:38

紅帽

2009-11-17 15:07:16

PHP數(shù)組遍歷

2023-08-18 17:24:09

掘力計劃大語言模型

2013-01-21 13:41:59

IBMdW

2012-06-13 16:05:27

.NET

2011-08-03 10:50:28

網(wǎng)絡(luò)安全技術(shù)周刊

2017-10-09 22:33:56

SQL等值分組有序分組

2012-05-23 09:35:55

技術(shù)沙龍

2023-08-16 18:23:28

掘力計劃網(wǎng)易有道大模型

2023-08-17 10:29:28

掘力計劃大語言模型

2017-10-18 22:34:33

SQL等值分組有序分組

2018-01-18 20:47:18

CPU數(shù)據(jù)線程
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产精品五区 | 一级片毛片 | 9999国产精品欧美久久久久久 | 中文字幕一区二区三区日韩精品 | 国产成人精品网站 | 激情五月婷婷综合 | 综合一区二区三区 | 日韩在线一区二区三区 | 欧美日日日日bbbbb视频 | 亚洲国产欧美91 | 欧美亚州 | 香蕉一区二区 | 精品国产一级片 | 欧美亚洲在线 | 国产精品久久久久久 | 3p视频在线观看 | 成人黄色在线视频 | 亚洲欧美日韩在线不卡 | 国产一区二区黑人欧美xxxx | 毛片区| 国产欧美精品一区二区色综合朱莉 | 亚洲精品电影在线观看 | 久草精品视频 | 天天爽网站 | 亚洲精品大片 | 午夜电影一区二区 | 免费观看羞羞视频网站 | 黄网站涩免费蜜桃网站 | 成人精品在线视频 | av一区二区三区在线观看 | 天天亚洲 | 精品国产免费一区二区三区五区 | 国产精品久久久久久吹潮 | 亚洲v日韩v综合v精品v | av免费网址 | 日韩中文字幕av | 97人人澡人人爽91综合色 | 一区二区精品 | 日本a级大片 | 日本欧美视频 | 黄色国产大片 |