<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          微信為什么使用 SQLite 保存聊天記錄?

          共 5287字,需瀏覽 11分鐘

           ·

          2022-07-25 00:50

          點擊關(guān)注公眾號:互聯(lián)網(wǎng)架構(gòu)師,后臺回復(fù) 2T獲取2TB學(xué)習(xí)資源!

          上一篇:Alibaba開源內(nèi)網(wǎng)高并發(fā)編程手冊.pdf

          SQLite 是一個被大家低估的數(shù)據(jù)庫,但有些人認(rèn)為它是一個不適合生產(chǎn)環(huán)境使用的玩具數(shù)據(jù)庫。事實上,SQLite 是一個非常可靠的數(shù)據(jù)庫,它可以處理 TB 級的數(shù)據(jù),但它沒有網(wǎng)絡(luò)層。接下來,本文將與大家共同探討 SQLite 在過去一年中最新的 SQL 功能。

          SQLite “只是”一個庫,它不是傳統(tǒng)意義上的服務(wù)器。因此,在某些場合下,它確實不合適。但是,在相當(dāng)多的其他場合,它卻是最合適的選擇。SQLite 號稱是部署和使用最廣泛的數(shù)據(jù)庫引擎。我認(rèn)為這很有可能,因為 SQLite 沒有版權(quán)的限制。無論何時,只要開發(fā)者想使用 SQL 在文件中存儲結(jié)構(gòu)化的數(shù)據(jù),SQLite 應(yīng)是首選方案。

          SQLite 的 SQL 方言也非常強(qiáng)大。它比 MySQL 早四年就開始支持 with 語句。最近,它還實現(xiàn)了對于窗口函數(shù)的支持,這僅僅比 MySQL 晚五個月。

          接下來,本文將介紹 SQLite 在 2018 年新增加的 SQL 功能,也就是 SQLite 從版本 3.22.0 到 3.26.0 所新增加的 SQL 功能。

          具體內(nèi)容包括:

          1. 布爾字面量和判斷
          2. 窗口函數(shù)
          3. Filter子句
          4. Insert … on conflict (“Upsert”)
          5. 重命名列
          6. 在Modern-SQL.com上接下來

          布爾變量和判斷

          SQLite支持“假”布爾值:它接受Boolean作為類型的名稱,但它將其當(dāng)作整數(shù)看待(這一點非常類似于MySQL)。真值true和false分別由數(shù)值1和0表示(這一點和C語言一樣)。

          從版本3.23.0開始,SQLite將關(guān)鍵字true和false分別用數(shù)字1和0表示,并支持is [not] true | false的判斷語句。現(xiàn)在,它不再支持關(guān)鍵字unknown。開發(fā)者可以使用空值null來代替,因為unknown和null的布爾值是一樣的。

          在INSERT和UPDATE語句中,字面量true和false可以大大提高values和set子句的可讀性。

          is [not] true | false這個判斷語句很有用,它與比較操作的含義不一樣:

          我們來比較一下

          WHERE c <> FALSE 

          WHERE c IS NOT FALSE

          在上面的例子中,如果c是null, 那么c <> false的結(jié)果是unknown.

          這是因為WHERE子句只接受結(jié)果為true的值,它會過濾掉結(jié)果為false或unknown的值。這樣,它就會把對應(yīng)的行從結(jié)果中去掉。

          與此相對應(yīng),如果c是null,那么,c is not false的判斷結(jié)果是true。因此,第二個WHERE子句也將包含c是null的行。

          要達(dá)到同樣的效果,您可以采用的另外一種方法是增加單獨處理null值的子句。也就是使用語句:

          WHERE c <> FALSE
             OR c IS NULL

          這種形式的語句更長并且有一些冗余語句(c被使用了兩次)。長話短說,可以使用is not false判斷來替代這個or…is-null的語句。更詳細(xì)的內(nèi)容,請參考“Binary Decisions Based on Three-Valued Results”。

          SQLite中對布爾字面量和布爾判斷的支持現(xiàn)在和其他開源數(shù)據(jù)庫接近,唯一的差距是SQLite不支持is[not] unknown(你可以使用is [not] null來代替)。有趣的是,這些功能在下面提到的商用產(chǎn)品中還不可用。

          圖片
          0:只支持true,false.不支持notknown,如果需要,用null代替
          1:不支持is [not] unknown,如果需要,用is [not] null代替

          窗口函數(shù)

          SQLite 3.25.0引入了窗口函數(shù)。如果你知道窗口函數(shù),那么也知道這是一件大事。如果你不了解窗口功能,請你自己學(xué)習(xí)如何使用。這篇文章不會具體解釋窗口函數(shù),但請相信:它是最重要的“現(xiàn)代”SQL特性。

          SQLite對over子句的支持與其他數(shù)據(jù)庫非常接近。唯一值得注意的限制是range語句不支持?jǐn)?shù)字或間隔距離(僅支持current row和unbounded preceding|following)。在發(fā)布sqlite 3.25.0時,SQL Server和PostgreSQL具有同樣的限制。PostgreSQL 11消除了這一限制。

          圖片
          0:沒有變化
          1:Range范圍定義不支持datetime類型
          2:Range范圍不接受關(guān)鍵字 (只支持unbounded和current row)
          SQLite對于窗口函數(shù)的支持在業(yè)界是領(lǐng)先的。它不支持的功能在其他一些主要產(chǎn)品中也同樣不支持(在聚合中語句中的distinct,width_bucket, respect|ignore nulls和from first|last等語句)。
          0:同樣沒有ORDER BY 語句
          1:不允許負(fù)偏移量,nulls的特定處理:lead(, 'IGNORE NULLS'),這里是字符串參數(shù)
          2:沒有缺省值(第三個參數(shù)),不支持respect|ignore nulls語句
          3:不允許負(fù)偏移量,不支持ignore nulls語句
          4:不允許負(fù)偏移量
          5:不支持respect|ignore nulls語句
          6:不允許負(fù)偏移量,不支持respect|ignore nulls語句
          7:nulls的特定處理:first_value(, 1, null, 'IGNORE NULLS') ,這里是字符串參數(shù)。
          8:不支持ignore nulls語句
          9:不支持ignore nulls語句和from last語句

          過濾語句

          雖然filter語句只是語法糖——你也可以很容易地使用表達(dá)式來獲得相同的結(jié)果——我認(rèn)為它也是必不可少的語法糖,因為它能使人們更加容易地學(xué)習(xí)和理解SQL語句。
          看看下面的select子句,您覺得哪一個更容易理解?
          SELECT SUM(revenue) total_revenue
               , SUM(CASE WHEN product = 1 
                          THEN revenue
                      END
                    ) prod1_revenue
             ...

          SELECT SUM(revenue) total_revenue
               , SUM(revenue) FILTER(WHERE product = 1) prod1_revenue
             ...

          此示例很好地總結(jié)了filter子句的作用:它是聚合函數(shù)的后綴,可以在進(jìn)行聚合之前根據(jù)特定條件,過濾掉相應(yīng)的行。pivot技術(shù)是filter子句最常見的用例。這包括將實體屬性值(EAV)模型中的屬性轉(zhuǎn)換為表格的列,如果想了解更多的內(nèi)容,可以參考鏈接“filter-Selective Aggregates”(https://modern-sql.com/feature/filter)。

          SQLite 從版本3.25.0開始,在使用over子句的聚合函數(shù)中支持了filter子句,但是在使用group by子句的聚合函數(shù)中還不支持。不幸的是,這意味著您仍然無法在SQLite中使用filter語句來處理上述情況。你必須像以前一樣使用case表達(dá)式。我真的希望SQLite在這一點上能盡快做到。

          圖片

          Insert … on conflict (“Upsert”)

          SQLite 從版本3.24.0開始,引入了“upsert”概念:它是一個insert語句,可以優(yōu)雅地處理主鍵和唯一約束的沖突。您可以選擇忽略這些沖突(在on conflict語句中什么都不做)或者更新當(dāng)前行(在on conflict語句中執(zhí)行更新操作)。

          這是一個特有的SQL擴(kuò)展,即它不是標(biāo)準(zhǔn)SQL的一部分,因此在下面的矩陣中是灰色的。但是,SQLite遵守與PostgreSQL相同的語法來實現(xiàn)此功能0。該標(biāo)準(zhǔn)提供了對merge語句的支持。

          與PostgreSQL不同,SQLite在以下語句中存在問題。

          INSERT INTO target
          SELECT *
            FROM source
              ON CONFLICT (id)
              DO UPDATE SET val = excluded.val
          根據(jù)說明文檔,這是因為解析器無法判斷關(guān)鍵字ON是SELECT語句的連接約束還是upsert子句的開頭。你可以通過向查詢中添加子句來解決,例如where true。
          INSERT INTO target
          SELECT *
            FROM source
           WHERE true
              ON CONFLICT (id)
              DO UPDATE SET val = excluded.val
          圖片
          0:同樣記錄insert、update、delete和merge操作的錯誤信息 (“DML error logging”)

          1:On conflict語句不能緊挨查詢的from語句,如果需要,可以添加  where true語句來分隔。

          重命名列

          SQLite引入的另一個特有功能是重命名基準(zhǔn)數(shù)據(jù)庫表中的列1。標(biāo)準(zhǔn)的SQL不支持此類功能2。
          SQLite遵循其他產(chǎn)品常用的語法來重命名列:

          ALTER TABLE … RENAME COLUMN … TO

          圖片

          0:請查閱 sp_rename.

          其他消息

          在2018年,SQLite除了在SQL語法上的變化,還有一些應(yīng)用程序接口(API)的變化。你可以查閱sqlite.com(https://www.sqlite.org/news.html)上的新聞部分來了解更詳細(xì)的消息

          腳標(biāo):

          • 0:SQLite通常遵循PostgreSQL語法,Richard Hipp將此稱為PostgreSQL會怎么做(WWPD)。

          • 1:基準(zhǔn)數(shù)據(jù)庫表是指用Create table語句創(chuàng)建的數(shù)據(jù)庫表。派生的數(shù)據(jù)庫表(如Select語句返回的查詢結(jié)果集)中的列名可以通過SELECT語句、FROM語句或WITH語句來進(jìn)行改變

          • 2:據(jù)我所知,也許可以通過可更新視圖或派生的列來模擬該功能。

          作者:Markus Winand

          來源:https://modern-sql.com/blog/2019-01/sqlite-in-2018

          -End-

          最后,關(guān)注公眾號互聯(lián)網(wǎng)架構(gòu)師,在后臺回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.全新 IDEA 2022.2 正式發(fā)布,新特性真香!

          2.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧

          3.程序員一般可以從什么平臺接私活?

          4.Spring中毒太深,離開Spring我連最基本的CRUD都不會寫了...

          5.為什么國內(nèi) 996 干不過國外的 955呢?

          6.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!                                  

          7.15張圖看懂瞎忙和高效的區(qū)別!

          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠艹视频 | 成人电影无码免费 | 婷婷五月天网 | 大鸡巴久久 | 国产精品MV |