99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀【每周一期-數(shù)據(jù)蔣堂】從SQL語法看離散性
【每周一期-數(shù)據(jù)蔣堂】從SQL語法看離散性
2017-11-18
收藏

【每周一期-數(shù)據(jù)蔣堂】從SQL語法看離散性

所謂離散性,是指集合的成員可以游離在集合之外存在并參與運(yùn)算,游離成員還可以再組成新的集合。從離散性的解釋上可以知道,離散性是針對集合而言的一種能力,離開集合概念單獨(dú)談離散性就沒有意義了。

離散性是個(gè)很簡單的特性,幾乎所有支持結(jié)構(gòu)(對象)的高級語言都天然支持,比如我們用Java時(shí)都可以把數(shù)組成員取出來單獨(dú)計(jì)算,也可以再次組成新的數(shù)組進(jìn)行集合運(yùn)算(不過Java幾乎沒有提供集合運(yùn)算類庫)。

但是SQL的離散性卻很差。

SQL體系中有記錄的概念,但并沒有顯式的記錄數(shù)據(jù)類型。單條記錄被SQL作為只有一條記錄的臨時(shí)表處理,也就是個(gè)單成員的集合。而且,SQL從表(集合)中取出記錄時(shí)總是復(fù)制出一條新記錄,和原表中的記錄已經(jīng)沒有關(guān)系了,這個(gè)特性被稱為immutable。immutable特性有助于保證代碼的正確性和簡單性,但也會(huì)喪失離散性。

缺失離散性會(huì)帶來代碼的繁瑣和效率的低下。

比如要計(jì)算張三和李四的年齡差和工資差,SQL要寫成兩句:

SELECT (SELECT age FROM employee WHERE name='張三') - ( SELECT age FROM employee WHERE name='李四') FROM dual

SELECT (SELECT salary FROM employee WHERE name='張三') - ( SELECT salary FROM employee WHERE name='李四') FROM dual

這不僅書寫麻煩,而且要重復(fù)查詢。

如果支持較好的離散性,我們可以寫成這樣:

a = employee.select@1(name="張三")

b = employee.select@1(name="李四")

agediff=a.age-b.age

salarydiff=a.salary-b.salary

查詢結(jié)果可以游離在集合外獨(dú)立存在,并可以反復(fù)使用。

immutable特性會(huì)要求每次運(yùn)算都復(fù)制數(shù)據(jù),這在只讀的運(yùn)算中還只是浪費(fèi)時(shí)間和空間影響效率,但如果要改寫數(shù)據(jù)時(shí),造成的麻煩就嚴(yán)重得多。

比如我們想對業(yè)績在前10%銷售員再給予5%的獎(jiǎng)勵(lì)。一個(gè)正常思路是先把業(yè)績在前10%的銷售員找出來,形成一個(gè)中間集合,然后再針對這個(gè)集合的成員執(zhí)行獎(jiǎng)勵(lì)5%的動(dòng)作。但由于SQL缺乏離散性,immutable特性導(dǎo)致滿足條件的記錄再形成的集合和原記錄是無關(guān)的,在中間結(jié)果集上做修改沒有意義。這樣就迫使我們要把整個(gè)動(dòng)作寫成一個(gè)語句,直接在原表中找到滿足條件的記錄再加以修改,而前10%這種條件并不容易簡單地在WHERE子句中寫出來,這又會(huì)導(dǎo)致復(fù)雜的子查詢。這還只是個(gè)簡單例子,現(xiàn)實(shí)應(yīng)用中比這復(fù)雜的條件比比皆是,用子查詢也很難寫出,經(jīng)常采用的辦法則是先把滿足條件的記錄的主鍵計(jì)算出來,再用這些主鍵到原表中遍歷找到原記錄去修改,代碼繁瑣且效率極為低下。

如果語言支持離散性,我們就可以執(zhí)行上述思路了:

a=sales.sort@z(amount).to(sales.len()*0.1)   //取出前業(yè)績在10%的記錄構(gòu)成一個(gè)新集合

a.run(amount=amount*1.05)       //針對集合成員執(zhí)行獎(jiǎng)勵(lì)5%動(dòng)作

從上面兩個(gè)簡單例子可以看出,缺失離散性會(huì)加劇分步計(jì)算的困難,immutable特性會(huì)降低性能并占用空間。當(dāng)然,離散性的問題還不止于此。

不能用原集合的成員構(gòu)成新集合再進(jìn)行計(jì)算,SQL在做分組時(shí)無法保持分組子集,必須強(qiáng)迫聚合,作為集合化語言,SQL的集合化并不徹底。沒有游離記錄及其集合的表示方法,只能用傳統(tǒng)的外鍵方案表示數(shù)據(jù)之間的關(guān)聯(lián)關(guān)系,寫出的代碼即繁瑣又難懂,而且運(yùn)算性能還差,缺乏離散性的SQL無法采用直觀的引用機(jī)制描述關(guān)聯(lián)。特別地,沒有離散性的支持,SQL很難描述有序計(jì)算,有序計(jì)算是離散性和集合化的典型結(jié)合產(chǎn)物,成員的次序在集合中才有意義,這要求集合化,有序計(jì)算時(shí)又要將每個(gè)成員與相鄰成員區(qū)分開,會(huì)強(qiáng)調(diào)離散性。

這些具體內(nèi)容我們會(huì)在后續(xù)文檔中逐步詳細(xì)說明。我們要從理論上改進(jìn)SQL(或者更合適的說法是關(guān)系代數(shù)),主要工作就是在保持集合化的基礎(chǔ)上引入離散性,從而解決上述問題,讓新的語言能夠同時(shí)擁有SQL和Java的優(yōu)點(diǎn)。


SQL

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }