點擊左上方藍色“一口Linux”,選擇“設為星標”
第一時間看干貨文章? ?【干貨】嵌入式驅動工程師學習路線 ?【干貨】Linux嵌入式知識點-思維導圖-免費獲取 ?【就業(yè)】一個可以寫到簡歷的基于Linux物聯(lián)網綜合項目 ?【就業(yè)】找工作簡歷模版 ?
數據在實際工作中應用非常廣泛,數據庫的產品也比較多,oracle、DB2、SQL2000、mySQL;基于嵌入式linux的數據庫主要有SQLite, Firebird, Berkeley DB, eXtremeDB。
本文主要講解數據庫SQLite,通過這個開源的小型的嵌入式數據庫帶領大家掌握一些基本的數據庫操作,這些操作在很多系統(tǒng)中都是通用的,可謂學一通百。
SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統(tǒng),它包含在一個相對小的C庫中。
2000年1月,Hipp開始和一個同事討論關于創(chuàng)建一個簡單的嵌入式SQL數據庫的想法,這個數據庫將使用GNU DBM哈希庫(gdbm)做后臺,同時這個數據庫將不需要安裝和管理支持。
后來,一有空閑時間,Hipp就開始實施這項工作,2000年8月,SQLite 1.0版發(fā)布了。【在此向大神獻上我的膝蓋!】
它的設計目標是嵌入式的,而且已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。
它能夠支持Windows/Linux/Unix等等主流的操作系統(tǒng),同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統(tǒng)來講,它的處理速度比他們都快。
現在運行的主要是sqlite3版本,在ubuntu下安裝也非常方便。
sudo?apt-get?install?sqlite?sqlite3???安裝應用程序
sudo?apt-get?install?libsqlite3-dev???安裝庫+頭文件,用代碼操作數據庫必須安裝
查看版本號:輸入命令 sqlite3進入操作界面,輸入命令.version,即可查看詳細版本號。
也可以使用下面命令,安裝圖形化操作工具:
sudo?apt-get?install?sqlitebrowser????圖形化工具建立數據庫
除此之外,還可以部署在windows下,本文只討論ubtuntu下,采用命令行方式來操作數據庫。
操作數據庫,主要就是操作表,表的每一列內容都有一定數據類型,比如整型值、字符串、布爾型等。
Sqlite3主要數據類型如下:
| 數據類型 | 定義 |
|---|---|
| 數據類型 ? ? NULL | 表示該值為NULL值。 |
| INTEGER | 無符號整型值。 |
| REAL | 浮點值。 |
| TEXT | 文本字符串,存儲使用的編碼方式為UTF-8、UTF-16BE、UTF-16LE。 |
| BLOB | 存儲Blob數據,該類型數據和輸入數據完全相同,1表示true,0表示false。 |
同時sqlite3也接受如下的數據類型:
| 數據類型 | 定義 |
|---|---|
| smallint | 16位的整數。 |
| interger | 32位的整數。 |
| decimal(p,s) | 精確值p是指全部有幾個十進制數,s是指小數點后可以有幾位小數。如果沒有特別指定,則系統(tǒng)會默認為p=5 s=0 。 |
| float | 32位元的實數。 |
| double | 64位元的實數。 |
| char(n) | n 長度的字串,n不能超過 254。 |
| varchar(n) | 長度不固定且其最大長度為 n 的字串,n不能超過 4000。 |
| graphic(n) | 和 char(n) 一樣,不過其單位是兩個字節(jié), n不能超過127。這個形態(tài)是為了支持兩個字節(jié)長度的字體,如中文字。 |
| vargraphic(n) | 可變長度且其最大長度為n的雙字元字串,n不能超過2000 |
| date | 包含了 年份、月份、日期。 |
| time | 包含了 小時、分鐘、秒。 |
| timestamp | 包含了 年、月、日、時、分、秒、千分之一秒。 |
表的每一列都有一些限制屬性,比如有的列的數據不能重復,有的則限制數據范圍等,約束就是用來進一步描述每一列數據屬性的。
SQLite 數據庫常用約束如下:
| 名稱 | 定義 |
|---|---|
| NOT NULL | - 非空 |
| UNIQUE | 唯一 |
| PRIMARY KEY | 主鍵 |
| FOREIGN KEY | 外鍵 |
| CHECK | 條件檢查 |
| DEFAULT | 默認 |
有一些字段我們可能一時不知到該填些什么,同時它也沒設定默認值, 當添加數據時,我們把這樣的字段空著不填,系統(tǒng)認為他是 NULL 值。
但是還有另外一類字段,必須被填上數據,如果不填,系統(tǒng)就會報錯。這樣的字段被稱為 NOT NULL 非空字段,需要在定義表的時候事先聲明。
除了主列以為,還有一些列也不能有重復值。
一般是整數或者字符串,只要保證唯一就行。在 SQLite 中,主鍵如果是整數類型,該列的值可以自動增長。
我們的數據庫中已經有 Teachers 表了,假如我們再建立一個 Students 表, 要求 Students 表中的每一個學生都對應一個 Teachers 表中的教師。
很簡單,只需要在 Students 表中建立一個 TeacherId 字段,保存對應教師的 Id 號, 這樣,學生和教師之間就建立了關系。
問題是:我們有可能給學生存入一個不在 Teachers 表中的 TeacherId 值, 而且發(fā)現不了這個錯誤。
這種情況下,可以把 Students 表中 TeacherId 字段聲明為一個外鍵, 讓它的值對應到 Teachers 表中的 Id 字段上。
這樣,一旦在 Students 表中存入一個不存在的教師 Id ,系統(tǒng)就會報錯。
有一些特別的字段列,在每一條記錄中,他的值基本上都是一樣的。只是在個別情況下才改為別的值,這樣的字段列我們可以給他設一個默認值。
某些值必須符合一定的條件才允許存入,這是就需要用到這個 CHECK 約束。
下面介紹Shell模式中的各常用命令的使用。
| 命令 | 功能 |
|---|---|
| .help | 可顯示shell模式中可使用的所有命令列表 |
| .database | 顯示數據庫信息;包含當前數據庫的位置 |
| .mode ?column | 使得SQL語句處理的結果以列對齊的方式顯示 |
| .mode ? ?list | column |
| .headers on/off | 打開關閉列標題顯示開關,以使得查詢結果在屏幕顯示時具有列標題 |
| .tables | 列出當前打開的數據庫中共有多少張表 |
| .exit | 退出SQLite環(huán)境 |
| .schema foods | 顯示表foods 創(chuàng)建時的SQL語句 |
| .schema | 顯示所有表被創(chuàng)建時的語句 |
| .nullvalue STRING | 查詢時用指定的串代替輸出的NULL串 默認為.nullvalue '' |
| .show | 顯示shell模式中定義的與輸出相關的一些設置 |
| .output file.csv | 設置輸出文件格式為CSV,文件名為file.csv |
| .separator , | 設置select語句輸出的列數據間以“ ,”分隔 |
| .output stdout | 恢復輸出內容到標準輸出設備(屏幕) |
【注意】sqlite的命令都是.開頭的,操作語句前面是沒有.的。
數據庫的操作語句主要是增刪改查,下面我們通過一些實例讓大家了解數據庫的這些基本操作。
假設我們要創(chuàng)建一個教學管理的數據庫jxgl.db,數據庫中要保存學生表STUDENT。
| sno | sname | ssex | sage | sdept |
|---|---|---|---|---|
| 95001 | yikou | m | 21 | cs |
| 95002 | peng | m | 21 | cs |
根據我們的常識,可知每一列的數據有以下特性:
下面我們一步步實現這個數據庫的所有操作。
數據庫的打開和退出,使用如下命令。
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í)行結果:

看到STUDENT,說明該表創(chuàng)建好了。【注意】
插入數據采用insert into語句來實現,如下所示:
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í)行結果如下:

設置了not null那一列 必須要賦值,而且表名字不區(qū)分大小寫。
insert?into?student(sname,sage)?values?('一口',19);

用SELECT語句查看表中的內容:
SELECT?*?FROM?STUDENT;
其中的 * 表示查看所有的數據信息。
有沒有看到,結果看起來不舒服啊,下面我們來調整下顯示格式:
sqlite>?.headers?on??????????顯示列名
sqlite>?.mode?column?????????列對齊

delete?from?student?where?sname='一口';
由上圖可見,名字為“一口”的那條記錄被刪除了。
UPDATE?student?SET?sage=29?WHERE?sname='張立';

修改表結構,需要用到語句ALTER TABLE。
下面我們向STUDENT表增加“spwd”列,其數據類型為TEXT型,用SELECT命令查看表中內容。
ALTER?TABLE?STUDENT?ADD?spwd?TEXT?default?'123456';

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

DROP?TABLE?STUDENT;
sqlite3沒有實現刪除一列的命令,要實現這個操作,需要先將該表拷貝到一個新表,但是只集成需要的列,要刪除的列不繼承過來。
可以 用以下方式操作刪除一列:
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被刪除了。
如果我不想查看所有的數據,而指向查看某一個人的信息要怎么操作呢?
我們就要借助where子句來實現。
where子句可以結合操作語句來進程增刪改查,是最常用的一個子句。
根據姓名查找記錄:
Select?*?from?student?where?sname='一口';
根據學號查找記錄:
Select?*?from?student?where?sno=95001;
根據姓名和年齡同時查找記錄:
select?*from?student?where?sname='一口'?and?sage=19;
顯示某兩列的數據
select?sno,sname?from?student?;?

現在我們假設要將表foods備份出為foodsdb.sql,并用命令回復該數據庫。
按照以下步驟操作即可。
sqlite>.dump??????? --把創(chuàng)建表及向表中插入記錄的所有SQL語句顯示在屏幕上
sqlite>.output??foodsdb.sql?--指定dump命令輸出到文件的文件名
sqlite>.dump???????? --輸出創(chuàng)建并插入數據到基本表的SQL語句到output指定的文件
sqlite>.output?stdout?? --恢復輸出內容到標準輸出設備(屏幕)
sqlite>.dump??????????? --此時輸出的SQL語句轉回到屏幕?
sqlite>Drop table foods;? --刪除foods表語句說明:
上述Drop為SQL語句,用于刪除指定的表。
因為是SQL語句,因此以“;”結尾
sqlite>.read?foodsdb.sql????--執(zhí)行foodsdb.sql中的包含的所有SQL語句,用來重建剛刪除的4張表及相關數據
好了,跟著一口君一步步操作,基本上sqlite3的增刪改查操作,相信各位應該沒什么問題了,sqlite還有其他一些子句以及函數的用法,留待下一篇繼續(xù)介紹。
end
一口Linux?
關注,回復【1024】海量Linux資料贈送
精彩文章合集
文章推薦