C++ Sqlite3的基本使用

SQLite3簡介 

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數據庫

SQL(structured query language)語句 

特色:不區分大小寫,每條語句後加";"結尾。編程

關鍵字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,數據庫中不能使用關鍵字命名錶和字段。緩存

數據定義語句(DDL:Data Definition Language)服務器

  • 新建表 ⟹ create:create table 表名 (字段名1 字段類型1,字段名2 字段類型2,。。。); create table if not exists 表名 (字段名1 字段類型1,字段名2 字段類型2,。。。);

   CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL); 多線程

  • 刪除表 ⟹ drop:dorp table 表名;drop table if exists 表名;

   DROP TABLE IF EXISTS t_person; 函數

數據操做語句(DML:Data Manipulation language)工具

  • 添加表中的數據 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串內容用單引號。

   INSERT INTO t_person (name, age) VALUES ('大明', 22); 

  • 修改表中的數據 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;

    UPDATE t_person SET name = '小明', age = 10; // 把表中name字段的值所有改爲小明,age字段的值所有改爲10。  

    UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改成12。  

  • 刪除表中的數據 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。

   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:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查詢全部的字段)
  • 表別名:select 字段1 別名, 字段2 別名,。。。from 表名 別名;select 字段1 別名, 字段2 as 別名,。。。from 表名 as 別名;select 別名.字段1,別名.字段2,。。。from 表名 別名;

   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(字段或者*) from 表名;

   SELECT count(name) FROM t_person ren WHERE ren.age > 80; 

   SELECT count(*) FROM t_person ren WHERE ren.age > 80; 

  • where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
  • order by:select * from 表名 order by 字段(默認升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);

   SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC; // 先按年齡降序,再按名字升序。  

  • limit:select * from 表名 limit 數值1,數值2;分頁查詢,數值1表示跳過前面多少條,數值2表示取出以後多少條。select * from 表名 limit 數值2;(跳過前面0條,至關於select * from 表名 limit 0,數值2,表示最前面多少條數據)

   SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5; // 先篩選,後排序,再分頁。 

  • like:模糊查詢,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;

   SELECT * FROM t_person WHERE name like '%明%'; 

存儲類型integer(整型)、real(浮點型)、text(文本字符串)、blob(二進制數據)。

實際上SQLite是無類型的,建表時聲明的類型是爲了方便程序員之間的交流,是一種良好的編程規範。

字段約束

  • not null:字段的值不能爲空。
  • unique:字段的值必需惟一。
  • default:指定字段的默認值。
  • primary key:主鍵,用來惟一的標識某條記錄,至關於記錄的身份證。主鍵能夠是一個或多個字段,應由計算機自動生成和管理。主鍵字段默認包含了not null和unique兩個約束。
  • autoincrement:當主鍵是integer類型時,應該增長autoincrement約束,能實現主鍵值的自動增加。

   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);

  • 建立一個帶外鍵的表:t_student表中有一個叫作fk_student_class的外鍵,這個外鍵的做用是讓t_student表中的class_id字段引用t_class表中的id字段。

   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

一、配置好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     }

 

|SQLite3 庫函數 總結

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工具來輔佐

SQLiteStudio是一個可視化的數據庫管理工具。

經過可視化界面,它能夠方便快捷地查看或操做數據庫信息。

它是程序sqlite數據調試檢查不可或缺的輔助工具。

(界面大概如圖:)

 

SQLiteStudio 下載地址:https://sqlitestudio.pl/index.rvt?act=download

相關文章
相關標籤/搜索