SQLite3只是一個輕型的嵌入式數據庫引擎,佔用資源很是低,處理速度比Mysql還快,專門用於移動設備上進行適量的數據存取,它只是一個文件,不須要服務器進程。html
SQL語句是SQL操做的指令,咱們用C/C++訪問數據庫時,須要用char*即C字符串來保存SQL語句,而後調用相應sqlite3庫的函數,傳入C字符串,來執行SQL指令。程序員
經常使用術語:表(table)、字段(column,列,屬性)、記錄(row,record)。sql
轉載並改編自:http://www.cnblogs.com/hankkk/p/5782321.html數據庫
特色:不區分大小寫,每條語句後加";"結尾。編程
關鍵字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,數據庫中不能使用關鍵字命名錶和字段。緩存
數據定義語句(DDL:Data Definition Language)服務器
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL); 多線程
DROP TABLE IF EXISTS t_person; 函數
數據操做語句(DML:Data Manipulation language)工具
INSERT INTO t_person (name, age) VALUES ('大明', 22);
UPDATE t_person SET name = '小明', age = 10; // 把表中name字段的值所有改爲小明,age字段的值所有改爲10。
UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改成12。
DELETE FROM t_person; // 刪除表中的全部記錄。
DELETE FROM t_person WHERE age = 25; // 刪除表中字段age等於25的這條記錄。
DELETE FROM t_person WHERE age > 12 AND age < 15; // 刪除表中年齡大於12且小於15的記錄。
數據查詢語句(DQL:Data Query Language)
SELECT name, age FROM t_person WHERE age < 80;
SELECT * FROM t_person WHERE age < 80;
SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
SELECT count(*) FROM t_person ren WHERE ren.age > 80;
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC; // 先按年齡降序,再按名字升序。
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先篩選,後排序,再分頁。
SELECT * FROM t_person WHERE name like '%明%';
存儲類型:integer(整型)、real(浮點型)、text(文本字符串)、blob(二進制數據)。
實際上SQLite是無類型的,建表時聲明的類型是爲了方便程序員之間的交流,是一種良好的編程規範。
字段約束:
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT 30);
外鍵:利用外鍵約束能夠用來創建表與表之間的聯繫,通常是一張表的某個字段,引用着另外一張表的主鍵的字段。
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, class_id integer NOT NULL, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id));
SELECT t.name t_name, t.age t_age, tc.name c_name FROM t_student t, t_class tc WHERE t.class_id = tc.id; // 查詢全部學生對應的班級
SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班'); // 查詢四班的全部學生
一、配置好C/C++項目環境:導入sqlite3.lib和sqlite3.dll,包含頭文件#include <sqlite3.h>。(具體步驟此處不講,可參考該網頁)
二、打開或者建立數據庫。
1 sqlite3 *sql = NULL; // 一個打開的數據庫實例 2 const char * path = "..../test.db";//某個sql文件的路徑 3 4 // 根據文件路徑打開數據庫鏈接。若是數據庫不存在,則建立。 5 // 數據庫文件的路徑必須以C字符串傳入。 6 int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL); 7 8 if (result == SQLITE_OK) { 9 std::clog << "打開數據庫鏈接成功"; 10 } 11 else { 12 std::clog << "打開數據庫鏈接失敗"; 13 }
三、執行不返回數據的SQL語句(增、刪、改)。
(執行更新、刪除語句和執行創表、添加語句基本相似,只需更改sql語句便可。)
1 const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); "; //SQL語句 2 sqlite3_stmt *stmt = NULL; //stmt語句句柄 3 4 //進行插入前的準備工做——檢查語句合法性 5 //-1表明系統會自動計算SQL語句的長度 6 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); 7 8 if (result == SQLITE_OK) { 9 std::clog<< "添加數據語句OK"; 10 //執行該語句 11 sqlite3_step(stmt); 12 } 13 else { 14 std::clog << "添加數據語句有問題"; 15 } 16 //清理語句句柄,準備執行下一個語句 17 sqlite3_finalize(stmt);
四、執行返回數據的SQL語句(查)。
1 const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;"; //SQL語句 2 sqlite3_stmt *stmt = NULL; // stmt語句句柄 3 4 //進行查詢前的準備工做——檢查語句合法性 5 //-1表明系統會自動計算SQL語句的長度 6 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); 7 8 if (result == SQLITE_OK) { 9 std::clog << "查詢語句OK"; 10 // 每調一次sqlite3_step()函數,stmt語句句柄就會指向下一條記錄 11 while (sqlite3_step(stmt) == SQLITE_ROW) { 12 // 取出第0列字段的值 13 const unsigned char *name = sqlite3_column_text(stmt, 0); 14 // 取出第1列字段的值 15 int age = sqlite3_column_int(stmt, 1); 16 //輸出相關查詢的數據 17 std::clog << "name = " << name <<", age = "<< age; 18 } 19 } 20 else { 21 std::clog << "查詢語句有問題"; 22 } 23 //清理語句句柄,準備執行下一個語句 24 sqlite3_finalize(stmt);
五、關閉數據庫:sqlite3_close_v2(sqlite3* sql)
1 if (sql) { 2 sqlite3_close_v2(sql); 3 sql = nullptr; 4 }
1.打開數據庫
int sqlite3_open_v2( const char *filename, // 數據庫的文件路徑 sqlite3 **ppDb, // 數據庫實例 int flags, // 標誌 const char *zVfs // 使用該數據庫的虛擬機的名字,這裏咱們不須要用,直接NULL );
其中:
flags參數有以下標誌:
SQLITE_OPEN_NOMUTEX: 設置數據庫鏈接運行在多線程模式(沒有指定單線程模式的狀況下)
SQLITE_OPEN_FULLMUTEX:設置數據庫鏈接運行在串行模式。
SQLITE_OPEN_SHAREDCACHE:設置運行在共享緩存模式。
SQLITE_OPEN_PRIVATECACHE:設置運行在非共享緩存模式。
SQLITE_OPEN_READWRITE:指定數據庫鏈接能夠讀寫。
SQLITE_OPEN_CREATE:若是數據庫不存在,則建立。
2.檢查SQL語句的合法性(查詢前的準備)
若語句合法即編譯經過,則將語句產生的指令塞進stmt句柄(此時並未執行指令)
int sqlite3_prepare_v2( sqlite3 *db, // 數據庫實例 const char *zSql, // 須要檢查的SQL語句 int nByte, // SQL語句的最大字節長度 sqlite3_stmt **ppStmt, // stmt句柄,用來存儲SQL stmt指令 const char **pzTail );
3.執行stmt句柄(執行存儲在stmt句柄的指令)
若是指令能查詢到下一行數據,就會返回SQLITE_ROW
若是指令(例如寫入數據)不須要返還數據,就會返還SQLITE_DONE
int sqlite3_step( sqlite3_stmt* stmt //stmt句柄 );
4.利用stmt句柄得到第iCol字段的值(字段的下標從0開始)
//執行完查詢句柄後,stmt就會指向查到的數據
//而後能夠經過stmt獲取相應數據
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點數據 int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數據 sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數據 const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進制文本數據 const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串數據
其餘:
清理語句句柄(以便重複使用同一個stmt句柄)
int sqlite3_finalize( sqlite_stmt* stmt //stmt句柄 );
關閉數據庫鏈接
int sqlite3_close_v2( sqlite3 * sql, // 數據庫實例 );
直接編譯並執行 SQL語句
(不推薦使用:一、沒有SQL語法檢查 二、每一句SQL語句即便徹底同樣,也會從新編譯執行,對批量指令來講效率不高。)
int sqlite3_exec( sqlite3* sql, // 一個打開的數據庫實例 const char * sqlSentence, // 須要執行的SQL語句 int (*callback)(void*,int,char**,char**), // SQL語句執行完畢後的回調 void *, // 回調函數的第1個參數 char **errmsg // 錯誤信息 );
SQLiteStudio是一個可視化的數據庫管理工具。
經過可視化界面,它能夠方便快捷地查看或操做數據庫信息。
它是程序sqlite數據調試檢查不可或缺的輔助工具。
(界面大概如圖:)
SQLiteStudio 下載地址:https://sqlitestudio.pl/index.rvt?act=download