• 正文
    • SQLite
    • 安裝
    • 數(shù)據(jù)類型
    • 約束
    • 常用命令
    • 使用實(shí)例
    • sqlite進(jìn)階
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式數(shù)據(jù)庫sqlite3【基礎(chǔ)篇】-基本命令操作,小白一看就懂

2024/09/23
3060
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

作者D.RichardHipp

數(shù)據(jù)在實(shí)際工作中應(yīng)用非常廣泛,數(shù)據(jù)庫的產(chǎn)品也比較多,oracle、DB2、SQL2000、mySQL;基于嵌入式linux的數(shù)據(jù)庫主要有SQLite, Firebird, Berkeley DB, eXtremeDB。

本文主要講解數(shù)據(jù)庫SQLite,通過這個(gè)開源的小型的嵌入式數(shù)據(jù)庫帶領(lǐng)大家掌握一些基本的數(shù)據(jù)庫操作,這些操作在很多系統(tǒng)中都是通用的,可謂學(xué)一通百。

SQLite

SQLite,是一款輕型的數(shù)據(jù)庫,是遵守ACID的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它包含在一個(gè)相對(duì)小的C庫中。

2000年1月,Hipp開始和一個(gè)同事討論關(guān)于創(chuàng)建一個(gè)簡(jiǎn)單的嵌入式SQL數(shù)據(jù)庫的想法,這個(gè)數(shù)據(jù)庫將使用GNU DBM哈希庫(gdbm)做后臺(tái),同時(shí)這個(gè)數(shù)據(jù)庫將不需要安裝和管理支持。

后來,一有空閑時(shí)間,Hipp就開始實(shí)施這項(xiàng)工作,2000年8月,SQLite 1.0版發(fā)布了?!?strong>在此向大神獻(xiàn)上我的膝蓋!】

它的設(shè)計(jì)目標(biāo)是嵌入式的,而且已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。

它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時(shí)能夠跟很多程序語言相結(jié)合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數(shù)據(jù)庫管理系統(tǒng)來講,它的處理速度比他們都快。

SQLite特性

    零配置一無需安裝和管理配置;儲(chǔ)存在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫;數(shù)據(jù)庫文件可以在不同字節(jié)順序的機(jī)器間自由共享;支持?jǐn)?shù)據(jù)庫大小至2TB;足夠小,全部源碼大致3萬行c代碼,250KB;比目前流行的大多數(shù)數(shù)據(jù)庫對(duì)數(shù)據(jù)的操作要快。

安裝

現(xiàn)在運(yùn)行的主要是sqlite3版本,在ubuntu下安裝也非常方便。

sudo?apt-get?install?sqlite?sqlite3???安裝應(yīng)用程序
sudo?apt-get?install?libsqlite3-dev???安裝庫+頭文件,用代碼操作數(shù)據(jù)庫必須安裝

查看版本號(hào):輸入命令 sqlite3進(jìn)入操作界面,輸入命令.version,即可查看詳細(xì)版本號(hào)。

也可以使用下面命令,安裝圖形化操作工具:

sudo?apt-get?install?sqlitebrowser????圖形化工具建立數(shù)據(jù)庫

除此之外,還可以部署在windows下,本文只討論ubtuntu下,采用命令行方式來操作數(shù)據(jù)庫。

數(shù)據(jù)類型

操作數(shù)據(jù)庫,主要就是操作表,表的每一列內(nèi)容都有一定數(shù)據(jù)類型,比如整型值、字符串、布爾型等。

Sqlite3主要數(shù)據(jù)類型如下:

數(shù)據(jù)類型 定義
數(shù)據(jù)類型 ? ? NULL 表示該值為NULL值。
INTEGER 無符號(hào)整型值。
REAL 浮點(diǎn)值。
TEXT 文本字符串,存儲(chǔ)使用的編碼方式為UTF-8、UTF-16BE、UTF-16LE。
BLOB 存儲(chǔ)Blob數(shù)據(jù),該類型數(shù)據(jù)和輸入數(shù)據(jù)完全相同,1表示true,0表示false。

同時(shí)sqlite3也接受如下的數(shù)據(jù)類型:

數(shù)據(jù)類型 定義
smallint 16位的整數(shù)。
interger 32位的整數(shù)。
decimal(p,s) 精確值p是指全部有幾個(gè)十進(jìn)制數(shù),s是指小數(shù)點(diǎn)后可以有幾位小數(shù)。如果沒有特別指定,則系統(tǒng)會(huì)默認(rèn)為p=5 s=0 。
float 32位元的實(shí)數(shù)。
double 64位元的實(shí)數(shù)。
char(n) n 長(zhǎng)度的字串,n不能超過 254。
varchar(n) 長(zhǎng)度不固定且其最大長(zhǎng)度為 n 的字串,n不能超過 4000。
graphic(n) 和 char(n) 一樣,不過其單位是兩個(gè)字節(jié), n不能超過127。這個(gè)形態(tài)是為了支持兩個(gè)字節(jié)長(zhǎng)度的字體,如中文字。
vargraphic(n) 可變長(zhǎng)度且其最大長(zhǎng)度為n的雙字元字串,n不能超過2000
date 包含了 年份、月份、日期。
time 包含了 小時(shí)、分鐘、秒。
timestamp 包含了 年、月、日、時(shí)、分、秒、千分之一秒。

約束

表的每一列都有一些限制屬性,比如有的列的數(shù)據(jù)不能重復(fù),有的則限制數(shù)據(jù)范圍等,約束就是用來進(jìn)一步描述每一列數(shù)據(jù)屬性的。

SQLite 數(shù)據(jù)庫常用約束如下:

名稱 定義
NOT NULL - 非空
UNIQUE 唯一
PRIMARY KEY 主鍵
FOREIGN KEY 外鍵
CHECK 條件檢查
DEFAULT 默認(rèn)

非空 NOT NULL

有一些字段我們可能一時(shí)不知到該填些什么,同時(shí)它也沒設(shè)定默認(rèn)值, 當(dāng)添加數(shù)據(jù)時(shí),我們把這樣的字段空著不填,系統(tǒng)認(rèn)為他是 NULL 值。

但是還有另外一類字段,必須被填上數(shù)據(jù),如果不填,系統(tǒng)就會(huì)報(bào)錯(cuò)。這樣的字段被稱為 NOT NULL 非空字段,需要在定義表的時(shí)候事先聲明。

唯一 UNIQUE

除了主列以為,還有一些列也不能有重復(fù)值。

主鍵 PRIMARY KEY

一般是整數(shù)或者字符串,只要保證唯一就行。在 SQLite 中,主鍵如果是整數(shù)類型,該列的值可以自動(dòng)增長(zhǎng)。

外鍵 FOREIGN KEY

我們的數(shù)據(jù)庫中已經(jīng)有 Teachers 表了,假如我們?cè)俳⒁粋€(gè) Students 表, 要求 Students 表中的每一個(gè)學(xué)生都對(duì)應(yīng)一個(gè) Teachers 表中的教師。

很簡(jiǎn)單,只需要在 Students 表中建立一個(gè) TeacherId 字段,保存對(duì)應(yīng)教師的 Id 號(hào), 這樣,學(xué)生和教師之間就建立了關(guān)系。

問題是:我們有可能給學(xué)生存入一個(gè)不在 Teachers 表中的 TeacherId 值, 而且發(fā)現(xiàn)不了這個(gè)錯(cuò)誤。

這種情況下,可以把 Students 表中 TeacherId 字段聲明為一個(gè)外鍵, 讓它的值對(duì)應(yīng)到 Teachers 表中的 Id 字段上。

這樣,一旦在 Students 表中存入一個(gè)不存在的教師 Id ,系統(tǒng)就會(huì)報(bào)錯(cuò)。

默認(rèn)值 DEFAULT

有一些特別的字段列,在每一條記錄中,他的值基本上都是一樣的。只是在個(gè)別情況下才改為別的值,這樣的字段列我們可以給他設(shè)一個(gè)默認(rèn)值。

條件檢查 CHECK

某些值必須符合一定的條件才允許存入,這是就需要用到這個(gè) CHECK 約束。

常用命令

下面介紹Shell模式中的各常用命令的使用。

命令 功能
.help 可顯示shell模式中可使用的所有命令列表
.database 顯示數(shù)據(jù)庫信息;包含當(dāng)前數(shù)據(jù)庫的位置
.mode ?column 使得SQL語句處理的結(jié)果以列對(duì)齊的方式顯示
.mode ? ?list column
.headers on/off 開關(guān)閉列標(biāo)題顯示開關(guān),以使得查詢結(jié)果在屏幕顯示時(shí)具有列標(biāo)題
.tables 列出當(dāng)前打開的數(shù)據(jù)庫中共有多少?gòu)埍?/td>
.exit 退出SQLite環(huán)境
.schema foods 顯示表foods 創(chuàng)建時(shí)的SQL語句
.schema 顯示所有表被創(chuàng)建時(shí)的語句
.nullvalue STRING 查詢時(shí)用指定的串代替輸出的NULL串 默認(rèn)為.nullvalue ''
.show 顯示shell模式中定義的與輸出相關(guān)的一些設(shè)置
.output file.csv 設(shè)置輸出文件格式為CSV,文件名為file.csv
.separator , 設(shè)置select語句輸出的列數(shù)據(jù)間以“ ,”分隔
.output stdout 恢復(fù)輸出內(nèi)容到標(biāo)準(zhǔn)輸出設(shè)備(屏幕)

【注意】sqlite的命令都是.開頭的,操作語句前面是沒有.的。

使用實(shí)例

數(shù)據(jù)庫的操作語句主要是增刪改查,下面我們通過一些實(shí)例讓大家了解數(shù)據(jù)庫的這些基本操作。

表類型

假設(shè)我們要?jiǎng)?chuàng)建一個(gè)教學(xué)管理的數(shù)據(jù)庫jxgl.db,數(shù)據(jù)庫中要保存學(xué)生表STUDENT。

sno sname ssex sage sdept
95001 yikou m 21 cs
95002 peng m 21 cs

根據(jù)我們的常識(shí),可知每一列的數(shù)據(jù)有以下特性:

    sno ? ? ?學(xué)號(hào):整型值,每個(gè)人學(xué)號(hào)是唯一的,學(xué)校一般用學(xué)號(hào)來區(qū)分所有的學(xué)生,而且一般學(xué)號(hào)是遞增的,所以我們?cè)O(shè)置sno為primary key;sname 姓名:一般是字符串,可以重復(fù),但是不能為空;ssex ? ?性別:字符串,可以為空;sage ? 年齡:整型值,假定年齡要大于14;sdept ?專業(yè):字符串,可以為空,此處我們默認(rèn)為'CS'。

下面我們一步步實(shí)現(xiàn)這個(gè)數(shù)據(jù)庫的所有操作。

創(chuàng)建教學(xué)管理“jxgl”數(shù)據(jù)庫

數(shù)據(jù)庫的打開和退出,使用如下命令。

創(chuàng)建表:

CREATE?TABLE?IF?NOT?EXISTS?STUDENT(Sno?integer?primary?key,???Sname?text?not?null,? ?Ssex?text,Sage?integer?check(Sage>14),Sdept?text?default?'CS');

該表的屬性就是按照上一節(jié)表屬性 執(zhí)行結(jié)果:

查看表:

看到STUDENT,說明該表創(chuàng)建好了?!咀⒁狻?/p>

    操作語句不是命令,前面不要加. ;操作語句后面一定要;結(jié)尾,如果漏掉了,一定要補(bǔ)上分號(hào);操作語句對(duì)字母的全角半角很敏感,所有的符號(hào)都要用半角。

插入數(shù)據(jù)

插入數(shù)據(jù)采用insert into語句來實(shí)現(xiàn),如下所示:

INSERT?INTO?STUDENT?VALUES('95001','李勇','M',20,'CS');
INSERT?INTO?STUDENT?VALUES('95002','劉晨','F',19,'IS');
INSERT?INTO?STUDENT?VALUES('95003','王敏','F',18,'MA');
INSERT?INTO?STUDENT?VALUES('95004','張立','M',18,'IS');

執(zhí)行結(jié)果如下:

插入的數(shù)據(jù)只初始化部分值

設(shè)置了not null那一列 必須要賦值,而且表名字不區(qū)分大小寫。

insert?into?student(sname,sage)?values?('一口',19);

查看表

用SELECT語句查看表中的內(nèi)容:

SELECT?*?FROM?STUDENT;

其中的 * 表示查看所有的數(shù)據(jù)信息。

有沒有看到,結(jié)果看起來不舒服啊,下面我們來調(diào)整下顯示格式:

sqlite>?.headers?on??????????顯示列名
sqlite>?.mode?column?????????列對(duì)齊

刪除一行信息

delete?from?student?where?sname='一口';

由上圖可見,名字為“一口”的那條記錄被刪除了。

修改一條記錄的某個(gè)內(nèi)容

UPDATE?student?SET?sage=29?WHERE?sname='張立';

修改數(shù)據(jù)表結(jié)構(gòu)。

修改表結(jié)構(gòu),需要用到語句ALTER TABLE。

下面我們向STUDENT表增加“spwd”列,其數(shù)據(jù)類型為TEXT型,用SELECT命令查看表中內(nèi)容。

ALTER?TABLE?STUDENT?ADD?spwd?TEXT?default?'123456';

修改表名字

alter?table?student?rename?to?stu;

刪除數(shù)據(jù)表。

DROP?TABLE?STUDENT;

刪除列

sqlite3沒有實(shí)現(xiàn)刪除一列的命令,要實(shí)現(xiàn)這個(gè)操作,需要先將該表拷貝到一個(gè)新表,但是只集成需要的列,要?jiǎng)h除的列不繼承過來。

可以 用以下方式操作刪除一列:

sqlite>?create?table?test?as?select?sno,?sname,ssex,sage,sdept??from?stu;
sqlite>?drop?table?stu;
sqlite>?alter?table?test?rename?to?stu;

由上圖可知,我們剛才增加的列spwd被刪除了。

sqlite進(jìn)階

where子句

如果我不想查看所有的數(shù)據(jù),而指向查看某一個(gè)人的信息要怎么操作呢?

我們就要借助where子句來實(shí)現(xiàn)。

where子句可以結(jié)合操作語句來進(jìn)程增刪改查,是最常用的一個(gè)子句。

根據(jù)姓名查找記錄:

Select?*?from?student?where?sname='一口';

根據(jù)學(xué)號(hào)查找記錄:

Select?*?from?student?where?sno=95001;

根據(jù)姓名和年齡同時(shí)查找記錄:

select?*from?student?where?sname='一口'?and?sage=19;

顯示某兩列的數(shù)據(jù)

select?sno,sname?from?student?;?

數(shù)據(jù)庫的備份和恢復(fù)

現(xiàn)在我們假設(shè)要將表foods備份出為foodsdb.sql,并用命令回復(fù)該數(shù)據(jù)庫。

按照以下步驟操作即可。

sqlite>.dump???????         --把創(chuàng)建表及向表中插入記錄的所有SQL語句顯示在屏幕上
sqlite>.output??foodsdb.sql?--指定dump命令輸出到文件的文件名
sqlite>.dump????????        --輸出創(chuàng)建并插入數(shù)據(jù)到基本表的SQL語句到output指定的文件
sqlite>.output?stdout??     --恢復(fù)輸出內(nèi)容到標(biāo)準(zhǔn)輸出設(shè)備(屏幕)
sqlite>.dump???????????     --此時(shí)輸出的SQL語句轉(zhuǎn)回到屏幕?
sqlite>Drop table foods;?   --刪除foods表語句說明:

上述Drop為SQL語句,用于刪除指定的表。

因?yàn)槭荢QL語句,因此以“;”結(jié)尾

sqlite>.read?foodsdb.sql???? --執(zhí)行foodsdb.sql中的包含的所有SQL語句, 用來重建剛刪除的4張表及相關(guān)數(shù)據(jù)

好了,跟著一口君一步步操作,基本上sqlite3的增刪改查操作,相信各位應(yīng)該沒什么問題了,sqlite還有其他一些子句以及函數(shù)的用法,留待下一篇繼續(xù)介紹。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門和技術(shù)進(jìn)階。