摘要:數(shù)據(jù)庫是用來存儲和管理數(shù)據(jù)的專用軟件,使得管理數(shù)據(jù)更加安全,方便和高效。數(shù)據(jù)庫對數(shù)據(jù)的管理的基本單位是表(table),在嵌入式linux中有時候它也需要用到數(shù)據(jù)庫,聽起來好難,其實就是幾個函數(shù),掌握了就好。
一、常見的數(shù)據(jù)庫
大型數(shù)據(jù)庫(大型機)Oracle(億級),中型數(shù)據(jù)庫(分布式超大型)mysql(百萬級),輕型數(shù)據(jù)庫(嵌入式設(shè)備)sqlite(萬級),訪問數(shù)據(jù)庫使用SQL語句,適用于所有的數(shù)據(jù)庫。
二、安裝SQLite3
有C環(huán)境就可以調(diào)用sqlite
2.1直接用命令安裝
?
sudo?apt-get?update sudo?apt-get?install?sqlite3
?
2.2 直接編譯源碼
將源碼拷貝到Ubuntu的非共享目錄解壓
解壓命令:
?
tar?zvxf?sqlite-autoconf-3380500.tar.gz
?
配置
?
cd?sqlite-snapshot-201708031550 ./configure?--prefix=/home/gec/sqlite
?
編譯
?
make????????
?
安裝
?
make?install?????????
?
三、SQLite的使用
?
新建數(shù)據(jù)庫文件 sqlite3?數(shù)據(jù)庫文件的路徑???//打開/創(chuàng)建 //比如:sqlite3 first.db
![70e4502c-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t2AGfjEAAAMZGdABAI927.png)
?
3.1 基本操作命令
?
.exit/.quit?--------?退出數(shù)據(jù)庫命令行 .help?--------------?幫助說明信息 .tables?------------?查看當(dāng)前數(shù)據(jù)庫中所有的表
?
3.2 數(shù)據(jù)庫訪問的SQL語句
基本語法:
?
所有的SQL語句都以分號(;)結(jié)束 不區(qū)分大小寫
?
3.3 新建表格
?
create?table?表名(字段名1?字段類型1,字段名2?字段類型2,字段名3?字段類型3,...); 比如: //創(chuàng)建一個stutbl的表,表中有3個字段 //分別是整數(shù)類型的學(xué)號id,字符串類型的name和整數(shù)類型的age create?table?zhiguoxin(id?int,name?char[20],age?int); //不存在則創(chuàng)建 create?table?if?not?exists?zhiguoxin(id?int,name?char[20],age?int); //如果希望表中某個字段的內(nèi)容不重復(fù),可以用unique修飾該字段 create?table?if?not?exists?zhiguoxin(id?int?unique,name?char[20],age?int);
![710c0e0a-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t2ARvpVAAAW_91ZKg4808.png)
?
3.4 刪除表格
?
drop?table?表名; //drop?table?zhiguoxin;
?
3.5 往表格中插入數(shù)據(jù)
?
insert?into?表名?values(字段值1,字段值2,字段值3,....); //字段值如果是字符串,必須用''(單引號)括起來 比如: insert?into?zhiguoxin?values(1001,'劉堯',18); insert?into?zhiguoxin?values(1002,'聶衍文',19); insert?into?zhiguoxin?values(1003,'楊佳晨',20); insert?into?zhiguoxin?values(1004,'馮華陽',21);
![71230c86-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t2APCBKAAAjjALtbCQ230.png)
?
完成插入之后,zhiguoxin 的表格內(nèi)容如下:
id | name | age |
---|---|---|
1001 | 劉堯 | 18 |
1002 | 聶衍文 | 19 |
1003 | 楊佳晨 | 20 |
1004 | 馮華陽 | 21 |
3.6 查詢表中的數(shù)據(jù)
//查詢表中的所有數(shù)據(jù)
?
select?*?from?表名; //select?*?from?zhiguoxin;
![716211b0-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AS1xHAAAP3CUF2WM402.png)
?
3.7 查看數(shù)據(jù)庫
可以把first.db數(shù)據(jù)庫文件拷貝至windows下,使用SQLite Developer打開即可看到。SQLite Developer下載地址
?
https://mydown.yesky.com/pcsoft/443425.html
![717eb86a-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AHk_rAAEj4YlEzzc406.png)
?
3.8 按條件查找
1.使用where指定查詢條件
?
select?*?from?zhiguoxin?where?id=1003;//查詢id值為1003的條目 select?*?from?zhiguoxin?where?age>=19?and?age<21; select?*?from?zhiguoxin?where?age>=19?or?age<21;
![71af7e64-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6ANPqBAAAepYQCHIk364.png)
?
2.指定查詢的字段
?
select?id,name,age?from?zhiguoxin;//只查詢id,name,age的字段?
![71bfa4d8-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AfS_vAAAQRx5dBoY418.png)
?
3.使用where+like實現(xiàn)模糊查詢
?
select?*?from?zhiguoxin?where?name?like?'劉%';//查找名字以劉開頭的條目
![71daf120-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AFZzXAAAKIlrbDnw901.png)
?
4.使用order by實現(xiàn)查詢結(jié)果按某個字段的值升序/降序輸出
?
select?*?from?zhiguoxin?order?by?age?desc;//按年齡降序排序????? select?*?from?zhiguoxin?order?by?id?asc;??//按id升序排序???
![71eea346-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AQrvuAAAcy6w-eV0933.png)
?
3.9 刪除表中的條目
?
delete?from?表名?where?條件;//刪除所有符合條件的條目 比如: delete?from?zhiguoxin?where?id=1001;
![7207a738-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AFFskAAAQ72Up6Ek680.png)
?
3.10 更新(修改)表中的條目
?
update?表名?set?字段名1=字段值1,字段名2=字段值2...?where?條件;//修改符合條件的條目 比如: update?zhiguoxin?set?age=100?where?id=1002;
![721a4c12-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t6AHyNqAAAQ1K84HWs454.png)
?
3.11 SQLite中字段類型
數(shù)字:
?
int?-------?整型 smallint?----?短整型 tinyint?-----?微型整數(shù)(0~255) bit?---------?0?or?1 float?------?單精度浮點型 real?-------?雙精度浮點型
?
字符串:
?
char?----------?非unicode定長字符串?8000 varchar?-------?非unicode變長字符串?8000 text?----------?非unicode變長字符串?2^32-1 nchar?----------?unicode定長字符串?8000 nvarchar?-------?unicode變長字符串?8000 ntext?----------?unicode變長字符串?2^32-1
?
sqlite本身自帶C語言訪問接口,在C語言的環(huán)境下可以直接使用,使用這些接口的代碼需要 sqlite的源碼編譯進(jìn)可執(zhí)行程序 或者 編譯時鏈接sqlite的庫。
4.1 打開 sqlite3_open
?
int?sqlite3_open( ??const?char?*filename,???/*?數(shù)據(jù)庫的文件路徑?*/ ??sqlite3?**ppDb??????????/*?輸出參數(shù):傳出代表打開數(shù)據(jù)庫的句柄?*/ ); //成功返回SQLITE_OK,否則打開失敗char ----------?非unicode定長字符串?< 8000 varchar :非unicode變長字符串?8000 text :非unicode變長字符串?2^32-1 nchar:unicode定長字符串?8000 nvarchar?:?unicode變長字符串?8000 ntext?:unicode變長字符串?2^32-1
?
4.2 關(guān)閉 sqlite3_close
?
int?sqlite3_close(sqlite3?*pDb); //傳入要關(guān)閉的數(shù)據(jù)庫的句柄
?
4.3 編譯方法
?
1.直接編譯源碼 gcc?sqlite3.c?sqlite_test.c?-pthread?-ldl?-o?sqlite_test 2.鏈接sqlite3的動態(tài)庫 gcc?sqlite_test.c?-pthread?-ldl?-lsqlite3?-L?/home/gec/sqlite/lib?-o?sqlite_test?? //如果運行時找不到sqlite3的庫,可以將編譯出來的庫文件拷貝到/usr/lib目錄下(cp?-r)??????
?
4.4 執(zhí)行SQL語句的接口 sqlite3_exec
?
int?sqlite3_exec( ??sqlite3?*pDb,??????????????????????????????/*?打開的數(shù)據(jù)庫的句柄?*/ ??const?char?*sql,???????????????????????????/*?要執(zhí)行的SQL語句?*/ ??int?(*callback)(void?*arg,int?col,char?**str,char?**name),?? ??/*?回調(diào)函數(shù),處理SQL語句執(zhí)行返回的結(jié)果(查詢),一條結(jié)果調(diào)用一次? ??????arg?-?exec的第四個參數(shù) ??????col?-?本條結(jié)果的字段數(shù) ??????str?-?記錄字段值的數(shù)組 ??????name?-?記錄字段名的數(shù)組 ?????回調(diào)函數(shù)必須返回SQLITE_OK?*/ ??void?*arg,?????????????????????????????????/*?傳遞給回調(diào)函數(shù)的第一個參數(shù)?*/ ??char?**errmsg??????????????????????????????/*?錯誤信息?*/ ); //成功返回SQLITE_OK,否則執(zhí)行失敗
?
幾個例子
?
//連接數(shù)據(jù)庫 int?Connection_Sqlite3DataBase() { ????rc?=?sqlite3_open("./face_database/face.db",?&db); ????if?(rc?!=?SQLITE_OK) ????{ ????????fprintf(stderr,?"Can't?open?database:?%s ",?sqlite3_errmsg(db)); ????????sqlite3_close(db); ????????exit(1); ????} ????else ????????printf("You?have?opened?a?sqlite3?database?named?bind.db?successfully! Congratulation!?Have?fun! "); ????return?0; } //將圖片插入到數(shù)據(jù)庫 void?insert_face_data_toDataBase(const?char?*name,?MByte?*face_feature,?MInt32?featureSize) { ????sqlite3_prepare(db,?"insert?into?face_data_table(name,face_feature,feature_size)?values?(?,?,?);",?-1,?&stmt,?NULL); ????sqlite3_bind_text(stmt,?1,?name,?strlen(name),?NULL); ????sqlite3_bind_blob(stmt,?2,?face_feature,?featureSize,?NULL); ????sqlite3_bind_int(stmt,?3,?featureSize); ????sqlite3_step(stmt); }
![72359f3a-47c5-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/D6/wKgaomTl-t-AEczTAAM1ytnBXNY699.png)
?
審核編輯:湯梓紅
評論