日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLite 简介

發(fā)布時間:2025/3/8 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLite 简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SQLite簡介

常見的關(guān)系型數(shù)據(jù)庫有SQLite,MySQL,SQL Server等,通常學(xué)習(xí)關(guān)系型數(shù)據(jù)庫時不會使用SQLite,但是SQLite 是世界上使用最廣泛的數(shù)據(jù)庫引擎。SQLite 內(nèi)置于所有手機(jī)和大多數(shù)計(jì)算機(jī)中,并捆綁在人們每天使用的無數(shù)其他應(yīng)用程序中。SQLite 是一個由C語音開發(fā)的嵌入式庫,具有小型、 快速、 自包含、 高可靠、 功能齊全等特點(diǎn)。

文章以3.32.2版本為例講述SQLite的一些基本知識

SQLite常用命令和示例

在命令行中使用SQLite命令,需要先執(zhí)行sqlite3命令,進(jìn)入SQLite提示符。

創(chuàng)建或打開數(shù)據(jù)庫

有兩種方法可以創(chuàng)建或打開數(shù)據(jù)庫,一個是在sqlite3命令后面加上數(shù)據(jù)庫路徑,另一個是使用點(diǎn)命令.open

sqlite3 /…/xxx.db法

通過執(zhí)行這個命令進(jìn)入SQLite提示符時,如果數(shù)據(jù)庫文件已經(jīng)存在,則直接打開對應(yīng)數(shù)據(jù)庫,否則不會立即在對應(yīng)路徑創(chuàng)建xxx.db文件。要等到執(zhí)行了添加數(shù)據(jù)表,視圖等數(shù)據(jù)庫對象的命令之后。

  • 示例

    先執(zhí)行如下命令,此時沒有創(chuàng)建出comms_ease.db文件

sqlite3 comms_ease.db

? 再執(zhí)行如下命令創(chuàng)建一張表,在當(dāng)前目錄出現(xiàn)comms_ease.db文件

.open /…/xxx.db法

使用.open是一個點(diǎn)命令,使用它需要先執(zhí)行sqlite3命令進(jìn)入SQLite提示符。.open命令的使用方式也是在命令后面追加數(shù)據(jù)庫路徑,不過和sqlite3 /.../xxx.db法不同的是,執(zhí)行.open命令后,數(shù)據(jù)庫文件會被直接創(chuàng)建出來,不需要再創(chuàng)建數(shù)據(jù)庫對象。

創(chuàng)建表

SQLite的創(chuàng)建語句為CREATE TABLE,完整的創(chuàng)建表語句內(nèi)容豐富,除了創(chuàng)建普通表外,還能具備判斷表是否已經(jīng)存在,創(chuàng)建臨時表等能力。常見的創(chuàng)建普通表的句式為。

CREATE TABLE 表名 (列1名稱 列類型 以空格隔開的一個或多個列約束, 列2名稱 列類型 以空格隔開的一個或多個列約束,... );

默認(rèn)情況下,一張表的最大列數(shù)為2000,每一行能存下的最大字節(jié)數(shù)為十億,能滿足絕大多數(shù)的需求,創(chuàng)建普通表的示例如下

CREATE TABLE table_comms_ease (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,value VARCHAR );

例子中,創(chuàng)建了一個名為table_comms_ease的數(shù)據(jù)表,包含兩列,第一列是id,類型是整形,不能為空,而且是表的主鍵,并可以自動生成; 第二列是value,類型為字符串

在表名已經(jīng)存在的情況下,調(diào)用CREATE TABLE 表名語句會報錯,要避免,可以使用CREATE TABLE IF NOT EXISTS 表名語句。如果不存在,則創(chuàng)建表,如果存在,則什么都不做。示例如下

CREATE TABLE IF NOT EXISTS table_comms_ease (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,value VARCHAR );

如果希望臨時存儲一些數(shù)據(jù),而且只對當(dāng)前連接有效,可以試試臨時表。臨時表的創(chuàng)建語句為CREATE TEMP TABLE。臨時表只對當(dāng)前數(shù)據(jù)庫連接有效,重新建立連接或者同時存在的其他連接都無法訪問到。示例如下

CREATE TEMP TABLE temp_table_comms_ease (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,value VARCHAR );

其它常用點(diǎn)命令

點(diǎn)命令是SQLite數(shù)據(jù)庫獨(dú)特的命令形式,它們通常比較簡單,而且不需要以分號結(jié)尾,常見的點(diǎn)命令如下表所示

命令描述使用示例
.backup備份數(shù)據(jù)庫到文件.backup comms_ease_backup
.databases列出數(shù)據(jù)庫的名稱及其所依附的文件.databases
.exit退出SQLite提示符.exit
.help幫助.help
.quit退出SQLite提示符.quit
.show各種設(shè)置的值.show
.schema查看創(chuàng)建命令。以LIKE`的模式匹配參數(shù),如果沒有參數(shù),則查看所有表格的創(chuàng)建命令.schema .schema table%
.tables搜索表名。以LIKE`的模式匹配參數(shù),如果沒有參數(shù),則搜索所有表名(臨時表不會出現(xiàn)在結(jié)果中).tables .tables table%

向表內(nèi)添加一行,即為每一列構(gòu)建一個值,并填入新的一行中。添加行的命令是INSERT,添加方式有三種,一種是指定值添加;二是添加Select語句的結(jié)果;三是默認(rèn)添加。

  • 指定值添加就是指定部分或者所有列的值,剩下列使用默認(rèn)值的方式,對于沒有通過DEFAULTE,AUTOINCREMENT等方式聲明默認(rèn)值的列,如果沒有指定NOT NULL則填入NULL,否則報錯。至少需要指定一列的值,如需全部填寫默認(rèn)值,可以使用默認(rèn)添加方式。需要注意的是,值的順序要和列的順序保持一致。示例如下:

    INSERT INTO table_comms_ease (value) VALUES ('value of 1'); INSERT INTO table_comms_ease (value, id) VALUES ('value of 2', 2);

    如果需要指定填入所有列的值,也可以不把列名列舉出來,將值按創(chuàng)建表時各個列的順序列舉出來即可。示例如下:

    INSERT INTO table_comms_ease VALUES (3, 'value of 3');
  • 通過添加加Select語句的結(jié)果添加一行的格式為INSERT INTO 表名 SELECT ...通過此方法添加一行時,默認(rèn)值不會被自動填充,SELECT語句查出的數(shù)據(jù)量必須和表的列數(shù)一致。假設(shè)已經(jīng)存在表operator包含列key和description而且某一行的key為’.backup’,description為備份數(shù)據(jù)庫到文件,給出示例如下:

    INSERT INTO table_comms_ease SELECT 4, description FROM operator WHERE key IS '.backup';
  • 默認(rèn)添加的格式為INSERT INTO 表名 DEFAULT VALUES;為每一列都填入默認(rèn)值,如果沒有特別聲明默認(rèn)值,則填入NULL。示例如下:

    INSERT INTO table_comms_ease DEFAULT VALUES;
  • 通過創(chuàng)建表章節(jié)的示例語句創(chuàng)建出數(shù)據(jù)表,再依次調(diào)用上述示例語句,則數(shù)據(jù)表內(nèi)會出現(xiàn)5行數(shù)據(jù),如下

    idvalue
    1value of 1
    2value of 2
    3value of 3
    4備份數(shù)據(jù)庫到文件
    5

    刪除表內(nèi)的一行,命令是DELETE,常用格式為

    DELETE FROM 表名 WHERE 過濾語句

    刪除命令本身比較簡單,指定表名和刪除條件即可刪除一列,如下示例表示如果value列中的值有value of開頭,則刪除。

    DELETE FROM table_comms_ease WHERE value LIKE 'value of %';

    如上命令操作后,table_comms_ease表還剩的數(shù)據(jù)為

    idvalue
    4備份數(shù)據(jù)庫到文件
    5

    修改表內(nèi)數(shù)據(jù)的命令為UPDATE,其常用格式為

    UPDATE 表名 SET 一個或多個列的賦值 WHERE 過濾語句

    修改多列內(nèi)容時可以采用先寫出列名,再按順序賦值的方式,也可以采用一列一列修改的方式。如果要更新id為4的所在行的值,設(shè)置id為123,value為new value,兩種修改方式分別如下

    UPDATE table_comms_ease SET (id, value)= (123, 'new value') WHERE id = 4;

    或者

    UPDATE table_comms_ease SET id=123, value='new value' WHERE id = 4;

    修改后,table_comms_ease表中的數(shù)據(jù)為

    idvalue
    5
    123new value

    修改單列的方法和修改多列的方法相似,比如將id為5這一行的value也修改為new value,可以如下操作

    UPDATE table_comms_ease SET (value)=('new value') WHERE id = 5;

    或者

    UPDATE table_comms_ease SET value='new value' WHERE id = 5;

    修改后,table_comms_ease表中的數(shù)據(jù)為

    idvalue
    5new value
    123new value

    查詢語句的命令是SELECT,它不會修改數(shù)據(jù)庫,結(jié)果的行數(shù)在自然數(shù)范圍內(nèi),每一行代表一個查詢結(jié)果。SELECT命令的常用格式為

    SELECT 去重策略 列名列表 FROM 表名或者子查詢語句 WHERE 過濾語句 ORDER BY 排序策略 LIMIT 數(shù)量限制

    查詢語句中可用的配置比較多,但是大都不是必須的。查詢table_comms_ease表的所有內(nèi)容只需要如下命令即可

    SELECT * FROM table_comms_ease;

    上面命令中的*表示所有列,命令相當(dāng)于

    SELECT id,value FROM table_comms_ease;

    結(jié)果為

    idvalue
    5new value
    123new value

    另外,可以通過VALUES語句構(gòu)建一個查詢結(jié)果,結(jié)果的列名為column1, column2, column3等等。比如

    VALUES (1,2,3),('a','b','c');

    的結(jié)果為

    column1column2Column3
    123
    abc

    去重策略

    去重策略有兩種,一種是默認(rèn)策略ALL,代表不去重;另一種是DISTINCT,代表去重。table_comms_ease表中value列的值相同,使用ALL和DISTINCT分別查詢value列時,命令和結(jié)果如下:

    ALL命令

    SELECT ALL * FROM table_comms_ease;

    結(jié)果為

    value
    new value
    new value

    DISTINCT命令

    SELECT DISTINCT value FROM table_comms_ease;

    結(jié)果為

    value
    new value

    可以看出在有重復(fù)結(jié)果時,ALL策略會保留所有結(jié)果,而DISTINCT策略只保留其中一個

    表名或者子查詢語句

    查詢語句的FROM關(guān)鍵字后面可以跟表名或者子查詢語句,用于限制查詢范圍。當(dāng)填寫表名時,可以填寫多個表名,用逗號或者連接運(yùn)算符分隔。當(dāng)填寫查詢語句時,可以視為先查詢出一張表,再從此表中查詢出數(shù)據(jù)。

    假設(shè)還有一張表table_comms_ease_1,列信息和table_comms_ease表相同,值為

    idvalue
    1value of 1 in table_comms_ease_1
    2value of 2 in table_comms_ease_1

    則此字段填寫table_comms_ease,table_comms_ease_1時得到如下命令

    SELECT * FROM table_comms_ease, table_comms_ease_1;

    結(jié)果為

    table_comms_ease.idtable_comms_ease.valuetable_comms_ease_1.idtable_comms_ease_id.value
    5new value1value of 1 in table_comms_ease_1
    5new value2value of 2 in table_comms_ease_1
    123new value1value of 1 in table_comms_ease_1
    123new value2value of 2 in table_comms_ease_1

    當(dāng)此字段填寫兩個子查詢語句,如一個是id為5,另一個是id為123時,則得到如下命令

    SELECT * FROM (SELECT * FROM table_comms_ease WHERE iD=5), (SELECT * FROM table_comms_ease WHERE iD=123);

    結(jié)果為

    table_comms_ease.idtable_comms_ease.valuetable_comms_ease.idtable_comms_ease.value
    5new value123new value

    將子查詢語句的結(jié)果視為一張表,則可以統(tǒng)一對兩種填寫格式的理解。另外查詢命令也支持混合填寫表名和查詢語句。

    排序條件

    排序條件決定了結(jié)果的排列順序,常用格式如下

    ORDER BY 列名 COLLATE 比較方式 排序方式 NULL值的排序方式

    比較方式有三種,分別為BINARY, NOCASE和 RTRIM

    • BINARY:使用標(biāo)準(zhǔn)C庫中的memcmp()函數(shù)逐字節(jié)比較
    • NOCASE:先把ASC II碼中的大寫字母轉(zhuǎn)為小寫字母,再按照BINARY方式比較
    • RTRIM:去掉末尾空格后按照BINARY方式比較

    通過下面命令為表table_comms_ease添加幾條數(shù)據(jù),

    INSERT INTO table_comms_ease VALUES (6, 'A'), (7, 'new value '), (8, 'Z');

    則表中的數(shù)據(jù)變?yōu)?/p>

    idvalue
    5new value
    6A
    7new value
    8Z
    123new value

    注意:id為7的一行對應(yīng)的value的末尾有一個空格

    如下示例展示了三種不同比較方式的區(qū)別

    BINARY命令

    SELECT * FROM table_comms_ease ORDER BY table_comms_ease.value COLLATE BINARY;

    結(jié)果:

    idvalue
    6A
    8Z
    5new value
    123new value
    7new value

    NOCASE命令

    SELECT * FROM table_comms_ease ORDER BY table_comms_ease.value COLLATE NOCASE;

    結(jié)果:

    idvalue
    6A
    5new value
    123new value
    7new value
    8Z

    RTRIM命令

    SELECT * FROM table_comms_ease ORDER BY table_comms_ease.value COLLATE RTRIM;

    結(jié)果:

    idvalue
    6A
    8Z
    5new value
    7new value
    123new value

    數(shù)量限制

    數(shù)量限制語句可以限制查詢結(jié)果的行數(shù),常用格式如下

    LIMIT 數(shù)量 OFFET 偏移量

    設(shè)數(shù)量為n,偏移量為o,則上面格式的意義是從第o+1條開始,取最多n條數(shù)據(jù),如果沒有符合條件的數(shù)據(jù),則結(jié)果為空。

    限制數(shù)量為3,得到如下表達(dá)式

    SELECT * FROM table_comms_ease LIMIT 3;

    結(jié)果為

    idvalue
    5new value
    6A
    7new value

    由于表的總行數(shù)是5,所以如果限制數(shù)量≥5,則會查出整張表。

    如果限制數(shù)量為3,同時指定偏移量為1,得到如下表達(dá)式

    SELECT * FROM table_comms_ease LIMIT 3 OFFSET 1;

    結(jié)果過濾掉第一條數(shù)據(jù)(5, newvalue),并向后取3條,得到

    idvalue
    6A
    7new value
    8Z

    如果限制數(shù)量為3,同時指定偏移量為3,得到如下表達(dá)式

    SELECT * FROM table_comms_ease LIMIT 3 OFFSET 3;

    結(jié)果過濾掉前三條數(shù)據(jù),并向后取3條,但是后面只有2條,所以得到

    idvalue
    8Z
    123new value

    如果偏移量≥5,則什么都查不到

    SQLite常見限制

    類別限制備注
    字符串長度1億由宏SQLITE_MAX_LENGTH定義,可以提高或降低限制,最大到231-1
    單行最大字節(jié)數(shù)1億由宏SQLITE_MAX_LENGTH定義
    最大列數(shù)2000由宏SQLITE_MAX_COLUMN定義,可以提高或降低限制,最大到32767
    語句最大長度10億由宏SQLITE_MAX_SQL_LENGTH定義,可以降低限制
    連接中最大表數(shù)64不可改變
    表達(dá)式樹的最大深度1000由宏SQLITE_MAX_EXPR_DEPTH定義,可以降低或消除限制
    函數(shù)的最大參數(shù)數(shù)100由宏SQLITE_MAX_FUNCTION_ARG定義,可以提高,最大到 127
    復(fù)合 SELECT 語句中的SELECT數(shù)500由宏SQLITE_MAX_COMPOUND_SELECT定義,可以降低
    庫文件最大頁數(shù)1073741823由宏SQLITE_MAX_PAGE_COUNT定義,可以提高或降低限制,最大到4294967294。
    最大數(shù)據(jù)庫大小281TB結(jié)合最大頁數(shù)4294967294和最大頁面大小65536,得到最大數(shù)據(jù)庫大小為281TB,但是這是個理論值,未經(jīng)官方驗(yàn)證過。
    表中的最大行數(shù)2^64無法達(dá)到,會先達(dá)到281TB的數(shù)據(jù)庫大小限制

    數(shù)據(jù)庫中的B樹

    B樹與B+樹簡介

    B樹是一種平衡多路查找樹,每個結(jié)點(diǎn)包含三個部分:鍵,值,指向子結(jié)點(diǎn)的指針。假設(shè)一個B樹結(jié)點(diǎn)中有n個鍵,則它同時有n個值。如果這是一個葉子結(jié)點(diǎn),則它沒有指向子結(jié)點(diǎn)的指針,否則有n+1個指向子結(jié)點(diǎn)的指針。下圖為n==2時的結(jié)點(diǎn)情況。


    圖中鍵1和鍵2兩個值需要滿足鍵1<鍵2。 值1和值2分別與鍵1和鍵2對應(yīng);三個指向子結(jié)點(diǎn)的指針,分別指向具有不同范圍的鍵的子結(jié)點(diǎn)。子結(jié)點(diǎn)1中的鍵都小于鍵1;子結(jié)點(diǎn)2中的鍵都大于鍵1,且小于鍵2;子結(jié)點(diǎn)3中的鍵都大于鍵2。如下圖提供了一個3路B樹的示例。

    上圖中每個結(jié)點(diǎn)有三排,第一排是鍵;第二排是值;第三排是指向子結(jié)點(diǎn)的指針。根節(jié)點(diǎn)有50和100兩個鍵,因此它的左子樹中結(jié)點(diǎn)的鍵都小于50;中子樹中結(jié)點(diǎn)的鍵都大于50且小于100;右子樹中結(jié)點(diǎn)的鍵都大于100。

    B+樹和B樹類似,但是B+樹的內(nèi)部結(jié)點(diǎn)中只有鍵和指向子結(jié)點(diǎn)的指針,而葉子結(jié)點(diǎn)具有鍵、值和指向下一組值的指針,即只在葉子結(jié)點(diǎn)上存儲數(shù)據(jù)。因此父結(jié)點(diǎn)中的鍵還會再出現(xiàn)在子結(jié)點(diǎn)上。而且B+樹的葉子結(jié)點(diǎn)的指向下一組值的指針,將所有值都串成了一個鏈表。由于內(nèi)部結(jié)點(diǎn)不需要存儲值,B+樹可以存儲更多的鍵。下圖用5路B+樹存儲了上面3路B樹的內(nèi)容。

    B樹頁

    數(shù)據(jù)庫文件由一頁或多頁組成。同一個數(shù)據(jù)庫中,每頁的大小相同,都是 在512 和 65536 之間,并且為2的整數(shù)次冪。數(shù)據(jù)庫的頁分為鎖定字節(jié)(lock-byte)頁、freelist頁、B樹頁、負(fù)載溢出頁和指針映射頁。

    B樹算法為SQLite提供了鍵值存儲模式,而且保證了鍵的有序性和唯一性。SQLite數(shù)據(jù)庫中B樹的結(jié)點(diǎn)就是一個頁面,所以指向的子結(jié)點(diǎn)的指針實(shí)際上是對應(yīng)頁面的頁碼。SQLite數(shù)據(jù)庫使用了兩種B樹變體,在葉子節(jié)點(diǎn)存儲數(shù)據(jù)的表B樹和不存儲數(shù)據(jù)的索引B樹。一顆完整的樹只能是完全的表B樹或者完全的索引B樹。

    表B樹和索引B樹

    表B樹類似B+樹,只將值存放在葉子結(jié)點(diǎn)中;索引B樹是一顆沒有值的樹,鍵就是數(shù)據(jù)本身,因此索引B樹其實(shí)類似于B樹。下表列出了它們之間的一些差異。

    對比項(xiàng)表B樹索引B樹
    鍵長度(byte)8最長2147483647的隨機(jī)值
    值存放點(diǎn)葉子結(jié)點(diǎn)沒有值,鍵就是數(shù)據(jù)
    值長度最長2147483647沒有值,鍵就是數(shù)據(jù)
    葉子結(jié)點(diǎn)結(jié)構(gòu)鍵和值
    主要使用場景rowid表索引、WITHOUT_ROWID表

    總結(jié)

    以上是生活随笔為你收集整理的SQLite 简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。