sqlite3數(shu)據(ju)庫常(chang)用指令及函數(shu)接口介紹
時間:2018-07-30 來源(yuan):未知
【1】 sqlite3的安(an)裝(zhuang):
1.離(li)線(xian)安(an)裝:sudo dpkg -i *.deb
2.在(zai)線安(an)裝: sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
【2】 sqlite3的(de)基本命令:
1.系統命令:
以‘.’(點)開頭(tou)的命令
.help 幫助
.quit 退(tui)出
.exit 退出(chu)
.schema 查(cha)看標的結構圖
.databases 查看打開(kai)的數據庫(ku)
.table 查看表
2.sql命令:
不以(yi)‘.’(點(dian))開頭,但是(shi)需要(yao)以(yi)‘;’(分號)結尾;
1)創建一張數據(ju)的(de)表
create table student(no Integer,name char,score float);
數據類型:
Integer 整型(xing)
char 字符串,也可以用string
...
2)插入一(yi)條數據:
完(wan)整數據插入(ru):
insert into student values(1, ‘zhangsan', 80);
注意:字(zi)符串zhangsan既(ji)可(ke)以用(yong)單(dan)引號‘zhangsan’,也(ye)可(ke)以用(yong)雙引號“zhangsan”;
部分數據插入:
insert into student (no,name) values(2, 'lisi');
3)查詢記錄
完整數據查詢:
select * from student;
部分(fen)數(shu)據查(cha)詢:
select no,name from student;
按照(zhao)條件查詢:
select * from student where score=100;
select * from student where no=1 and score=100;
select * from student where no=1 or score=100;
4)刪除記錄:
刪除某(mou)一條記錄:
delete from student where name='lisi';
刪(shan)除整張表數據(ju):
delete from student;
5)更新記錄:
update student set name=‘lisi’ where id=3;
update student set name='lisi',score=80 where id=2;
6)在表中增加一列
alter table student add column address char
7)在表中刪除一列:
不支持直(zhi)接刪一列:
1)創建一(yi)個新的表(biao)并從原有表(biao)中提取字(zi)段;
create table stu as select id, name, score from student;
2)刪除(chu)原有的表(biao)格;
drop table student;
3)將新(xin)的表格名字(zi)改為原有表的名字(zi)
alter table stu rename to student;
【3】 sqlite3函數接口:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) 要操作的數據(ju)庫文件的路徑(jing);*、
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功(gong)能:打開一個數據庫(ku);
參數:
filename: 代表數據庫(ku)的路(lu)徑名;
ppdb: 代表數(shu)據庫的操作句柄(指(zhi)針);
返回值(zhi):成功(gong)-SQLITE_OK,出(chu)錯-錯誤碼;
int sqlite3_close(sqlite3*);
功能:關閉數據庫
參數:
db :操作數據庫的(de)句柄;
返回值:成功-SQLITE_OK,出錯(cuo)-錯(cuo)誤碼;
const char *sqlite3_errmsg(sqlite3*);
功能:通(tong)過(guo)db句柄,得(de)到數據庫(ku)操作(zuo)的錯誤信息;
返(fan)回值(zhi):錯誤信息的首地(di)址;
/********************************************************
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
功(gong)能:執行一條sql語(yu)句;
參數:
db :數據庫(ku)操(cao)作句柄;
sql :一條sql語(yu)句(ju);
callback:只有sql為查詢語句的時候(hou),才會(hui)執(zhi)行此(ci)語句;
arg :給回調(diao)函數(shu)callback傳遞參(can)數(shu);
errmsg :錯(cuo)誤消息
返(fan)回值(zhi):成功(gong)-SQLITE_OK,出錯-錯誤碼;
int (*callback)(void *arg, int, char **, char **); /* Callback function */
功能(neng):查(cha)詢的(de)結果,是一個函數(shu)指(zhi)針類型,傳遞一個函數(shu)名即可。
參數:
para :傳遞給回調函數(shu)的(de)參數(shu);
f_num :記(ji)錄(lu)中包(bao)含的字段數目;
f_value :包含每個字段值的指針數組;
f_name :包含每個(ge)字段名稱的(de)指針數組
返(fan)回(hui)值:成功返(fan)回(hui)0,失(shi)敗返(fan)回(hui)-1;
***********************************************************/
查詢數據:
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
功能,查詢表中數據
參數:
db :數據庫操作句柄
zSql :查詢的sql語句
pazResult :查詢結果的返回(hui)地址;
pnRow :滿足條件的記錄(lu)數目(表(biao)中的行數)
pnColumn:每條(tiao)記錄(lu)包含的字段(duan)數目(表(biao)中的列(lie)數)
pzErrmsg:錯誤信(xin)息指針(zhen)的地址;
返回(hui)值:成功返回(hui)0,失敗返回(hui)錯(cuo)誤(wu)碼。
void sqlite3_free_table(char **result);
sqlite3 語句總(zong)結(jie)
1、
sqlite3長(chang)用于 輕量級(ji)的數據存儲,象單片機這一類,但是現(xian)在的sqlite3,已經很先進,不能(neng)小看
2、sqlite3常用命(ming)令
當前目(mu)錄下(xia)建立或打(da)開test.db數據庫文件,并進入sqlite命(ming)令終端,以sqlite>前綴標識:
#sqlite3 test.db
查看數據庫(ku)文件(jian)信息(xi)命(ming)令(注意命(ming)令前帶字符'.'):
sqlite>.database
查(cha)看(kan)所有表(biao)的創建語句(ju):
sqlite>.schema
查(cha)看指定表的創建(jian)語(yu)句:
sqlite>.schema table_name
以sql語句的形式列出表內容:
sqlite>.dump table_name
設(she)置(zhi)顯示信息的分隔符:
sqlite>.separator symble
Example:設置顯示信息以‘:’分隔
sqlite>.separator :
設(she)置顯(xian)示模式:
sqlite>.mode mode_name
Example:默認為list,設置為column,其他模式可通過.help查看mode相(xiang)關內容(rong)
sqlite>.mode column
輸出幫助信息:
sqlite>.help
設置每一列的顯(xian)示寬度:
sqlite>.width width_value
Example:設置(zhi)寬度(du)為2
sqlite>.width 2
列出當前顯示格式的配(pei)置:
sqlite>.show
退出sqlite終端命令:
sqlite>.quit
或
sqlite>.exit
3、sqlite3指(zhi)令
sql的指令格式:所有sql指令都是以分號(hao)(;)結(jie)尾,兩個減號(hao)(--)則表(biao)示注釋。
如:
sqlite>create studen_table(Stu_no interger PRIMARY KEY, Name text NOT NULL, Id interger UNIQUE, Age interger CHECK(Age>6), School text DEFAULT 'xx小學(xue));
該語(yu)句創建(jian)一個記錄學(xue)生信息的數據表(biao)。
3.1 sqlite3存儲數(shu)據的類型
NULL:標識一個NULL值
INTERGER:整數類型(xing)
REAL:浮點數
TEXT:字符(fu)串
BLOB:二進制(zhi)數
3.2 sqlite3存儲數據的(de)約束條(tiao)件
Sqlite常用約束條件如下(xia):
PRIMARY KEY - 主(zhu)鍵:
1)主鍵的值(zhi)必須(xu)唯一(yi),用于標識每一(yi)條記錄(lu),如學生的學號
2)主鍵同時也(ye)是一個索引,通過(guo)主鍵查(cha)找(zhao)記錄速度較快
3)主鍵如(ru)果是整數(shu)類型,該列的值可(ke)以自動增長(chang)
NOT NULL - 非空(kong):
約(yue)束列記錄(lu)不(bu)能為空(kong),否則(ze)報錯(cuo)
UNIQUE - 唯一:
除主(zhu)鍵外,約束其他列的數據(ju)的值唯一
CHECK - 條件檢查(cha):
約束該(gai)列的值必須符合條件才可(ke)存入(ru)
DEFAULT - 默認值:
列數據中的值基本(ben)都是一樣的,這樣的字段列可設(she)為(wei)默認值
3.3 sqlite3常(chang)用指令(ling)
1)建立數據表(biao)
create table table_name(field1 type1, field2 type1, ...);
table_name是要創建數據(ju)表名稱,fieldx是數據(ju)表內字段(duan)名稱,typex則(ze)是字段(duan)類型(xing)。
例(li),建立一個簡(jian)單的學(xue)生(sheng)(sheng)信息表(biao),它(ta)包含學(xue)號(hao)與姓名等學(xue)生(sheng)(sheng)信息:
create table student_info(stu_no interger primary key, name text);
create table if not exists 表(biao)名(字(zi)段名1,字(zi)段名2...);
2)添加數據(ju)記錄
insert into table_name(field1, field2, ...) values(val1, val2, ...);
valx為需要存入字段的值。
例,往(wang)學生(sheng)信息表添(tian)加數(shu)據:
Insert into student_info(stu_no, name) values(0001, alex);
3)修改(gai)數據(ju)記錄
update table_name set field1=val1, field2=val2 where expression;
where是sql語句(ju)中用(yong)于條(tiao)件判(pan)斷的命(ming)令,expression為判(pan)斷表達(da)式
例,修(xiu)改學(xue)生信息(xi)表學(xue)號為0001的(de)數(shu)據記(ji)錄:
update student_info set stu_no=0001, name=hence where stu_no=0001;
4)刪(shan)除數(shu)據記錄
delete from table_name [where expression];
不加判斷條(tiao)件則(ze)清空表所有數(shu)據記(ji)錄。
例(li),刪除學生信(xin)息表學號為0001的數據記錄:
delete from student_info where stu_no=0001;
5)查詢數據記錄
select指令(ling)基本格式(shi):
select columns from table_name [where expression];
a查詢輸出所(suo)有數據記錄
select * from table_name;
b限制輸出數據(ju)記錄數量(liang)
select * from table_name limit val;
c升序(xu)輸出數(shu)據記錄
select * from table_name order by field asc;
d降序輸出數據(ju)記錄
select * from table_name order by field desc;
e條件查詢
select * from table_name where expression;
select * from table_name where field in ('val1', 'val2', 'val3');
select * from table_name where field between val1 and val2;
f查詢記錄數目
select count (*) from table_name;
g區分列(lie)數據
select distinct field from table_name;
有一些字段(duan)的值(zhi)可能(neng)會重復(fu)(fu)出現,distinct去掉(diao)重復(fu)(fu)項,將列中各字段(duan)值(zhi)單個(ge)列出。
6)建立(li)索(suo)引
當說數據表(biao)存在大量記錄,索(suo)引有(you)助于加快(kuai)查(cha)找(zhao)數據表(biao)速度。
create index index_name on table_name(field);
例,針對學(xue)生表stu_no字段(duan),建(jian)立一個索(suo)引:
create index student_index on student_table(stu_no);
建立完成后,sqlite3在對該(gai)(gai)字段查詢時,會自(zi)動使(shi)用該(gai)(gai)索引。
7)刪除數據表或索引
drop table table_name;
drop index index_name;
打開數據庫鏈(lian)接sqlite3_open用法
原型:
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ )
用這個(ge)(ge)函數(shu)開始數(shu)據(ju)庫操作(zuo)(zuo)。需要(yao)傳(chuan)入兩個(ge)(ge)參數(shu),一是(shi)(shi)數(shu)據(ju)庫文(wen)(wen)件名,比如(ru):E:/test.db。文(wen)(wen)件名不(bu)需要(yao)一定存在(zai),如(ru)果此(ci)文(wen)(wen)件不(bu)存在(zai),sqlite會(hui)自動(dong)建(jian)立(li)它(ta)(ta)。如(ru)果它(ta)(ta)存在(zai),就嘗(chang)試把它(ta)(ta)當數(shu)據(ju)庫文(wen)(wen)件來打開。二是(shi)(shi)sqlite3**,即(ji)前(qian)面(mian)提(ti)到的(de)(de)關(guan)鍵數(shu)據(ju)結構。這個(ge)(ge)結構底層細節如(ru)何,你不(bu)要(yao)管它(ta)(ta)。函數(shu)返(fan)回值(zhi)表(biao)示(shi)操作(zuo)(zuo)是(shi)(shi)否正(zheng)確,如(ru)果是(shi)(shi)SQLITE_OK則表(biao)示(shi)操作(zuo)(zuo)正(zheng)常(chang)。相關(guan)的(de)(de)返(fan)回值(zhi)sqlite定義了一些宏(hong)。具(ju)體這些宏(hong)的(de)(de)含義可以(yi)(yi)參考(kao)sqlite3.h 文(wen)(wen)件。里面(mian)有詳(xiang)細定義(順便說(shuo)一下,sqlite3 的(de)(de)代碼(ma)注釋率自稱是(shi)(shi)非(fei)常(chang)高(gao)的(de)(de),實(shi)際上也的(de)(de)確很高(gao)。只要(yao)你會(hui)看英文(wen)(wen),sqlite 可以(yi)(yi)讓你學到不(bu)少東西)。
關閉(bi)數據庫鏈接sqlite3_close用(yong)法
原型:
int sqlite3_close(sqlite3 *ppDb)
Db為剛才使用sqlite3_open打開的數據庫鏈接(jie)
執行sql操作sqlite3_exec用法
原型:
int sqlite3_exec( sqlite3* ppDb, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ )
這(zhe)就是執行(xing)一(yi)條(tiao)sql 語(yu)句(ju)的(de)函(han)數(shu)。第1個(ge)(ge)參(can)(can)數(shu)不再說了,是前面open函(han)數(shu)得到(dao)(dao)的(de)指(zhi)針(zhen)。說了是關鍵數(shu)據結構。第2個(ge)(ge)參(can)(can)數(shu)constchar*sql是一(yi)條(tiao)sql 語(yu)句(ju),以(yi)\0結尾。第3個(ge)(ge)參(can)(can)數(shu)sqlite3_callback 是回調(diao),當這(zhe)條(tiao)語(yu)句(ju)執行(xing)之(zhi)后,sqlite3會(hui)去調(diao)用(yong)你提供的(de)這(zhe)個(ge)(ge)函(han)數(shu)。第4個(ge)(ge)參(can)(can)數(shu)void*是你所提供的(de)指(zhi)針(zhen),你可以(yi)傳(chuan)遞任(ren)何一(yi)個(ge)(ge)指(zhi)針(zhen)參(can)(can)數(shu)到(dao)(dao)這(zhe)里,這(zhe)個(ge)(ge)參(can)(can)數(shu)最終會(hui)傳(chuan)到(dao)(dao)回調(diao)函(han)數(shu)里面,如果不需要傳(chuan)遞指(zhi)針(zhen)給回調(diao)函(han)數(shu),可以(yi)填NULL。等(deng)下我(wo)們再看(kan)回調(diao)函(han)數(shu)的(de)寫(xie)法,以(yi)及(ji)這(zhe)個(ge)(ge)參(can)(can)數(shu)的(de)使用(yong)。第5個(ge)(ge)參(can)(can)數(shu)char** errmsg 是錯(cuo)誤信息(xi)。注意是指(zhi)針(zhen)的(de)指(zhi)針(zhen)。sqlite3里面有(you)很多固定的(de)錯(cuo)誤信息(xi)。執行(xing)sqlite3_exec 之(zhi)后,執行(xing)失(shi)敗時可以(yi)查閱這(zhe)個(ge)(ge)指(zhi)針(zhen)(直接cout<
exec 的回調
typedef int(*sqlite3_callback)(void*,int,char**,char**);你的(de)(de)回(hui)調(diao)(diao)函數必須定(ding)義成(cheng)上面這個(ge)(ge)函數的(de)(de)類型。下面給個(ge)(ge)簡單的(de)(de)例子://sqlite3的(de)(de)回(hui)調(diao)(diao)函數//sqlite 每查到一(yi)條記錄,就調(diao)(diao)用一(yi)次這個(ge)(ge)回(hui)調(diao)(diao)int LoadMyInfo(void* para,intn_column,char** column_value,char** column_name)
//para是(shi)(shi)(shi)你(ni)(ni)在sqlite3_exec 里傳入的(de)(de)void*參數(shu)通過para參數(shu),你(ni)(ni)可以傳入一些特殊(shu)的(de)(de)指針(zhen)(比如類指針(zhen)、結構指針(zhen)),//然后(hou)(hou)在這(zhe)里面強制轉換(huan)成對應的(de)(de)類型(xing)(這(zhe)里面是(shi)(shi)(shi)void*類型(xing),必須強制轉換(huan)成你(ni)(ni)的(de)(de)類型(xing)才(cai)可用(yong))。然后(hou)(hou)操(cao)作這(zhe)些數(shu)據//n_column是(shi)(shi)(shi)這(zhe)一條記錄有(you)多少(shao)(shao)個(ge)(ge)字(zi)段(duan)(即這(zhe)條記錄有(you)多少(shao)(shao)列)//char** column_value 是(shi)(shi)(shi)個(ge)(ge)關鍵(jian)值(zhi),查出來的(de)(de)數(shu)據都保存在這(zhe)里,它(ta)實際(ji)上是(shi)(shi)(shi)個(ge)(ge)1維(wei)數(shu)組(不要以為(wei)是(shi)(shi)(shi)2維(wei)數(shu)組),//每一個(ge)(ge)元素(su)都是(shi)(shi)(shi)一個(ge)(ge)char*值(zhi),是(shi)(shi)(shi)一個(ge)(ge)字(zi)段(duan)內容(用(yong)字(zi)符串來表示(shi),以\0結尾)//char** column_name 跟column_value是(shi)(shi)(shi)對應的(de)(de),表示(shi)這(zhe)個(ge)(ge)字(zi)段(duan)的(de)(de)字(zi)段(duan)名稱
實例:
#include using namespace std; #include "sqlite/sqlite3.h" int callback(void*,int,char**,char**); int main() { sqlite3* db; int nResult = sqlite3_open("test.db",&db); if (nResult != SQLITE_OK) { cout<<"打(da)開數(shu)據庫失敗:"<

