【1】 sqlite3的安裝:
1.離線安裝:sudo dpkg -i *.deb
2.在線安裝: sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
【2】 sqlite3的基本命令:
1.系統命令:
以‘.’(點)開頭的命令
.help 幫助
.quit 退出
.exit 退出
.schema 查看標的結構圖
.databases 查看打開的數據庫
.table 查看表
2.sql命令:
不以‘.’(點)開頭,但是需要以‘;’(分號)結尾;
1)創建一張數據的表
create table student(no Integer,name char,score float);
數據類型:
Integer 整型
char 字符串,也可以用string
...
2)插入一條數據:
完整數據插入:
insert into student values(1, ‘zhangsan', 80);
注意:字符串zhangsan既可以用單引號‘zhangsan’,也可以用雙引號“zhangsan”;
部分數據插入:
insert into student (no,name) values(2, 'lisi');
3)查詢記錄
完整數據查詢:
select * from student;
部分數據查詢:
select no,name from student;
按照條件查詢:
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)刪除記錄:
刪除某一條記錄:
delete from student where name='lisi';
刪除整張表數據:
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)在表中刪除一列:
不支持直接刪一列:
1)創建一個新的表并從原有表中提取字段;
create table stu as select id, name, score from student;
2)刪除原有的表格;
drop table student;
3)將新的表格名字改為原有表的名字
alter table stu rename to student;
【3】 sqlite3函數接口:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) 要操作的數據庫文件的路徑;*、
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:打開一個數據庫;
參數:
filename: 代表數據庫的路徑名;
ppdb: 代表數據庫的操作句柄(指針);
返回值:成功-SQLITE_OK,出錯-錯誤碼;
int sqlite3_close(sqlite3*);
功能:關閉數據庫
參數:
db :操作數據庫的句柄;
返回值:成功-SQLITE_OK,出錯-錯誤碼;
const char *sqlite3_errmsg(sqlite3*);
功能:通過db句柄,得到數據庫操作的錯誤信息;
返回值:錯誤信息的首地址;
/********************************************************
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 */
);
功能:執行一條sql語句;
參數:
db :數據庫操作句柄;
sql :一條sql語句;
callback:只有sql為查詢語句的時候,才會執行此語句;
arg :給回調函數callback傳遞參數;
errmsg :錯誤消息
返回值:成功-SQLITE_OK,出錯-錯誤碼;
int (*callback)(void *arg, int, char **, char **); /* Callback function */
功能:查詢的結果,是一個函數指針類型,傳遞一個函數名即可。
參數:
para :傳遞給回調函數的參數;
f_num :記錄中包含的字段數目;
f_value :包含每個字段值的指針數組;
f_name :包含每個字段名稱的指針數組
返回值:成功返回0,失敗返回-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 :查詢結果的返回地址;
pnRow :滿足條件的記錄數目(表中的行數)
pnColumn:每條記錄包含的字段數目(表中的列數)
pzErrmsg:錯誤信息指針的地址;
返回值:成功返回0,失敗返回錯誤碼。
void sqlite3_free_table(char **result);
sqlite3 語句總結
1、
sqlite3長用于 輕量級的數據存儲,象單片機這一類,但是現在的sqlite3,已經很先進,不能小看
2、sqlite3常用命令
當前目錄下建立或打開test.db數據庫文件,并進入sqlite命令終端,以sqlite>前綴標識:
#sqlite3 test.db
查看數據庫文件信息命令(注意命令前帶字符'.'):
sqlite>.database
查看所有表的創建語句:
sqlite>.schema
查看指定表的創建語句:
sqlite>.schema table_name
以sql語句的形式列出表內容:
sqlite>.dump table_name
設置顯示信息的分隔符:
sqlite>.separator symble
Example:設置顯示信息以‘:’分隔
sqlite>.separator :
設置顯示模式:
sqlite>.mode mode_name
Example:默認為list,設置為column,其他模式可通過.help查看mode相關內容
sqlite>.mode column
輸出幫助信息:
sqlite>.help
設置每一列的顯示寬度:
sqlite>.width width_value
Example:設置寬度為2
sqlite>.width 2
列出當前顯示格式的配置:
sqlite>.show
退出sqlite終端命令:
sqlite>.quit
或
sqlite>.exit
3、sqlite3指令
sql的指令格式:所有sql指令都是以分號(;)結尾,兩個減號(--)則表示注釋。
如:
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小學);
該語句創建一個記錄學生信息的數據表。
3.1 sqlite3存儲數據的類型
NULL:標識一個NULL值
INTERGER:整數類型
REAL:浮點數
TEXT:字符串
BLOB:二進制數
3.2 sqlite3存儲數據的約束條件
Sqlite常用約束條件如下:
PRIMARY KEY - 主鍵:
1)主鍵的值必須唯一,用于標識每一條記錄,如學生的學號
2)主鍵同時也是一個索引,通過主鍵查找記錄速度較快
3)主鍵如果是整數類型,該列的值可以自動增長
NOT NULL - 非空:
約束列記錄不能為空,否則報錯
UNIQUE - 唯一:
除主鍵外,約束其他列的數據的值唯一
CHECK - 條件檢查:
約束該列的值必須符合條件才可存入
DEFAULT - 默認值:
列數據中的值基本都是一樣的,這樣的字段列可設為默認值
3.3 sqlite3常用指令
1)建立數據表
create table table_name(field1 type1, field2 type1, ...);
table_name是要創建數據表名稱,fieldx是數據表內字段名稱,typex則是字段類型。
例,建立一個簡單的學生信息表,它包含學號與姓名等學生信息:
create table student_info(stu_no interger primary key, name text);
create table if not exists 表名(字段名1,字段名2...);
2)添加數據記錄
insert into table_name(field1, field2, ...) values(val1, val2, ...);
valx為需要存入字段的值。
例,往學生信息表添加數據:
Insert into student_info(stu_no, name) values(0001, alex);
3)修改數據記錄
update table_name set field1=val1, field2=val2 where expression;
where是sql語句中用于條件判斷的命令,expression為判斷表達式
例,修改學生信息表學號為0001的數據記錄:
update student_info set stu_no=0001, name=hence where stu_no=0001;
4)刪除數據記錄
delete from table_name [where expression];
不加判斷條件則清空表所有數據記錄。
例,刪除學生信息表學號為0001的數據記錄:
delete from student_info where stu_no=0001;
5)查詢數據記錄
select指令基本格式:
select columns from table_name [where expression];
a查詢輸出所有數據記錄
select * from table_name;
b限制輸出數據記錄數量
select * from table_name limit val;
c升序輸出數據記錄
select * from table_name order by field asc;
d降序輸出數據記錄
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區分列數據
select distinct field from table_name;
有一些字段的值可能會重復出現,distinct去掉重復項,將列中各字段值單個列出。
6)建立索引
當說數據表存在大量記錄,索引有助于加快查找數據表速度。
create index index_name on table_name(field);
例,針對學生表stu_no字段,建立一個索引:
create index student_index on student_table(stu_no);
建立完成后,sqlite3在對該字段查詢時,會自動使用該索引。
7)刪除數據表或索引
drop table table_name;
drop index index_name;
打開數據庫鏈接sqlite3_open用法
原型:
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ )
用這個函數開始數據庫操作。需要傳入兩個參數,一是數據庫文件名,比如:E:/test.db。文件名不需要一定存在,如果此文件不存在,sqlite會自動建立它。如果它存在,就嘗試把它當數據庫文件來打開。二是sqlite3**,即前面提到的關鍵數據結構。這個結構底層細節如何,你不要管它。函數返回值表示操作是否正確,如果是SQLITE_OK則表示操作正常。相關的返回值sqlite定義了一些宏。具體這些宏的含義可以參考sqlite3.h 文件。里面有詳細定義(順便說一下,sqlite3 的代碼注釋率自稱是非常高的,實際上也的確很高。只要你會看英文,sqlite 可以讓你學到不少東西)。
關閉數據庫鏈接sqlite3_close用法
原型:
int sqlite3_close(sqlite3 *ppDb)
Db為剛才使用sqlite3_open打開的數據庫鏈接
執行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 */ )
這就是執行一條sql 語句的函數。第1個參數不再說了,是前面open函數得到的指針。說了是關鍵數據結構。第2個參數constchar*sql是一條sql 語句,以\0結尾。第3個參數sqlite3_callback 是回調,當這條語句執行之后,sqlite3會去調用你提供的這個函數。第4個參數void*是你所提供的指針,你可以傳遞任何一個指針參數到這里,這個參數最終會傳到回調函數里面,如果不需要傳遞指針給回調函數,可以填NULL。等下我們再看回調函數的寫法,以及這個參數的使用。第5個參數char** errmsg 是錯誤信息。注意是指針的指針。sqlite3里面有很多固定的錯誤信息。執行sqlite3_exec 之后,執行失敗時可以查閱這個指針(直接cout<
exec 的回調
typedef int(*sqlite3_callback)(void*,int,char**,char**);你的回調函數必須定義成上面這個函數的類型。下面給個簡單的例子://sqlite3的回調函數//sqlite 每查到一條記錄,就調用一次這個回調int LoadMyInfo(void* para,intn_column,char** column_value,char** column_name)
//para是你在sqlite3_exec 里傳入的void*參數通過para參數,你可以傳入一些特殊的指針(比如類指針、結構指針),//然后在這里面強制轉換成對應的類型(這里面是void*類型,必須強制轉換成你的類型才可用)。然后操作這些數據//n_column是這一條記錄有多少個字段(即這條記錄有多少列)//char** column_value 是個關鍵值,查出來的數據都保存在這里,它實際上是個1維數組(不要以為是2維數組),//每一個元素都是一個char*值,是一個字段內容(用字符串來表示,以\0結尾)//char** column_name 跟column_value是對應的,表示這個字段的字段名稱
實例:
#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<<"打開數據庫失敗:"<