在數(shù)據(jù)庫領(lǐng)域,SQL是一門具有非常嚴格語法的編程語言,任何不符合規(guī)范的語句部分都會被數(shù)據(jù)庫拒絕。
雖然我們知道SQL和英語非常相似,簡單的SQL語句可以直接閱讀為英語,但除了SQL之外,其他主要的編程語言并沒有這個特性。即使在語法中存在英語單詞,也僅用作某些概念或操作的記憶方法,而實際寫的是正式的程序語句,而不是英語句子。但SQL不同,它會以符合英語習(xí)慣的形式編寫整個語句,并添加許多不必要的介詞,例如FROM作為語句的操作主語,但必須寫在后面;在GROUP之后,還需要額外寫入BY。
為什么會出現(xiàn)這種情況呢?最容易想到的原因是希望非程序員也能使用它。只要用戶能夠閱讀和書寫英語,他們就可以編寫SQL查詢數(shù)據(jù)。這顯然是一個好意圖,但結(jié)果并不令人滿意。絕大多數(shù)業(yè)務(wù)人員只知道如何使用SQL編寫非常簡單的查詢,而對于這樣的查詢,現(xiàn)在有強大的BI軟件可以提供更便捷直觀的可視化界面來輔助,而無需手寫語句。這種設(shè)計意圖失去了其意義。相反,經(jīng)常使用SQL進行計算的用戶仍然是程序員,而SQL仍然是一種編程語言,無論是否類似于英語,對于程序員來說理解上并沒有太大區(qū)別,相反,它可能帶來相當(dāng)大的困難。
事實上,SQL是一門具有非常嚴格語法的編程語言,任何不符合規(guī)范的語句部分都會被數(shù)據(jù)庫拒絕。用戶必須仔細學(xué)習(xí)和遵守其語法規(guī)則,這與其他編程語言沒有太大區(qū)別。自然語言的真正優(yōu)勢在于其歧義性,它允許以較少嚴格的語法接受輸入。然而,SQL并不支持這個特性,并且在SQL發(fā)明的時代也無法實現(xiàn)這個特性。
看起來像英語的優(yōu)勢無法體現(xiàn),但有許多缺點。設(shè)計類似自然語言的語法可能看起來很容易掌握,但實際上情況恰恰相反。
類似自然語言的主要缺點是非過程化。程序邏輯通常是逐步執(zhí)行的,使用變量記錄中間結(jié)果以供后續(xù)步驟使用。但自然語言并非如此,兩個句子之間的引用關(guān)系依賴于少數(shù)固定的代詞,這是不準(zhǔn)確和不方便的。因此,盡可能將針對同一主語的動作拼寫到一個句子中,就無需使用代詞。在SQL中的相應(yīng)表示是在一個語句中有多個動作這樣,例如SELECT、WHERE和GROUP,它們在最初是沒有關(guān)聯(lián)的動作。在其他編程語言中,它們通常被設(shè)計為多個函數(shù),但在SQL中,它們都被設(shè)計為一個語句的子句。此外,像"WHERE"和"HAVING"這樣的詞語有著相同的意義,只是針對不同的對象,當(dāng)拼寫到一個句子中時,必須使用兩個詞來表示區(qū)別,這會造成困惑(許多初學(xué)者可能會對"HAVING"感到困惑)。
無法用單個句子描述的復(fù)雜情況可以使用自然語言中的從句來描述。這在SQL中體現(xiàn)為子查詢,甚至可能存在多層嵌套子查詢,在其他編程語言中并不常見。此外,子查詢還應(yīng)該像自然語言一樣,每次都要使用SELECT...FROM,這會讓人感覺非常啰嗦,代碼會變得很長。
逐步操作是降低理解和執(zhí)行難度的有效方法:本來只需要幾個步驟就能完成的事情,如果不逐步進行,將變得非常復(fù)雜??梢韵胂螅绻蠋熞笮W(xué)生只用一個方程來解決實際問題,孩子們會很苦惱(當(dāng)然,有些聰明的孩子可以處理這個問題)。
例如,如果我們想要找出銷售額超過平均值兩倍的客戶,自然的思維方式是首先計算平均銷售額,然后找出銷售額超過兩倍的客戶,使用兩個語句來實現(xiàn)。而SQL的寫法則要求使用子查詢來寫成一個更長的句子。這個例子相對容易理解,只有兩層嵌套。但在實際情況中,涉及三層或五層嵌套的復(fù)雜查詢非常常見,這嚴重增加了理解的難度。
不倡導(dǎo)逐步操作會導(dǎo)致單個SQL語句變得很長。程序員面臨的復(fù)雜SQL語句很少按行計算,通常是以千為單位。然而,對于相同的100行代碼,無論將其分成100個語句還是只有1個語句,它們的復(fù)雜性完全不同。這種類型的代碼很難理解,一旦最終編寫完成,兩個月后,程序員自己也無法理解。此外,沒有逐步操作的單個長語句很難進行調(diào)試,開發(fā)周期也更長。
關(guān)于過程性:行業(yè)中有一種說法,即SQL是一種聲明性語言,用戶只需關(guān)心他們想要什么,而不必關(guān)心如何做;數(shù)據(jù)庫會自動找到解決方案,因此這種語言不需要支持過程性。我們之前已經(jīng)批評了這種說法。
數(shù)據(jù)庫供應(yīng)商可能也看到了SQL的缺乏過程性,所以后來添加了CTE語法以進行補償,它相當(dāng)于提供了可以命名的中間變量。存儲過程也相當(dāng)于能夠按步驟執(zhí)行SQL,具有分支循環(huán)甚至子程序。結(jié)果仍然是回到了過程性語言的老路上,所以從一開始就設(shè)計成這樣并不好。文章來源:http://www.zghlxwxcb.cn/article/654.html
對于編程語言來說,一個良好的逐步計算機制帶來的易用性遠遠超過看起來像自然語言的優(yōu)勢。文章來源地址http://www.zghlxwxcb.cn/article/654.html
到此這篇關(guān)于為什么說SQL看起來像英語是一個錯誤的設(shè)計?的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!