C++ Sqlite3的使用方法
|SQLite3簡(jiǎn)介
SQLite3只是一個(gè)輕型的嵌入式數(shù)據(jù)庫(kù)引擎,占用資源非常低,處理速度比Mysql還快,專門用于移動(dòng)設(shè)備上進(jìn)行適量的數(shù)據(jù)存取,它只是一個(gè)文件,不需要服務(wù)器進(jìn)程。
SQL語句是SQL操作的指令,我們用C/C++訪問數(shù)據(jù)庫(kù)時(shí),需要用char*即C字符串來保存SQL語句,然后調(diào)用相應(yīng)sqlite3庫(kù)的函數(shù),傳入C字符串,來執(zhí)行SQL指令。
常用術(shù)語:表(table)、字段(column,列,屬性)、記錄(row,record)。
|SQL(structured query language)語句
特點(diǎn):不區(qū)分大小寫,每條語句后加";"結(jié)尾。
關(guān)鍵字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,數(shù)據(jù)庫(kù)中不能使用關(guān)鍵字命名表和字段。
數(shù)據(jù)定義語句(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;
數(shù)據(jù)操作語句(DML:Data Manipulation language)
- 添加表中的數(shù)據(jù) ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串內(nèi)容用單引號(hào)。
INSERT INTO t_person (name, age) VALUES ('大明', 22);
- 修改表中的數(shù)據(jù) ⟹ 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。
- 刪除表中的數(shù)據(jù) ⟹ 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的記錄。
數(shù)據(jù)查詢語句(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;
- 計(jì)算記錄條數(shù):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 字段(默認(rèn)升序);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 數(shù)值1,數(shù)值2;分頁查詢,數(shù)值1表示跳過前面多少條,數(shù)值2表示取出之后多少條。select * from 表名 limit 數(shù)值2;(跳過前面0條,相當(dāng)于select * from 表名 limit 0,數(shù)值2,表示最前面多少條數(shù)據(jù))
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 '%明%';
存儲(chǔ)類型:integer(整型)、real(浮點(diǎn)型)、text(文本字符串)、blob(二進(jìn)制數(shù)據(jù))。
實(shí)際上SQLite是無類型的,建表時(shí)聲明的類型是為了方便程序員之間的交流,是一種良好的編程規(guī)范。
字段約束:
- not null:字段的值不能為空。
- unique:字段的值必需唯一。
- default:指定字段的默認(rèn)值。
- primary key:主鍵,用來唯一的標(biāo)識(shí)某條記錄,相當(dāng)于記錄的身份證。主鍵可以是一個(gè)或多個(gè)字段,應(yīng)由計(jì)算機(jī)自動(dòng)生成和管理。主鍵字段默認(rèn)包含了not null和unique兩個(gè)約束。
- autoincrement:當(dāng)主鍵是integer類型時(shí),應(yīng)該增加autoincrement約束,能實(shí)現(xiàn)主鍵值的自動(dòng)增長(zhǎng)。
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT 30);
外鍵:利用外鍵約束可以用來建立表與表之間的聯(lián)系,一般是一張表的某個(gè)字段,引用著另一張表的主鍵的字段。
- 創(chuàng)建一個(gè)表:
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
- 創(chuàng)建一個(gè)帶外鍵的表:t_student表中有一個(gè)叫做fk_student_class的外鍵,這個(gè)外鍵的作用是讓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));
- 利用外鍵來查詢多張表中的數(shù)據(jù):
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; // 查詢所有學(xué)生對(duì)應(yīng)的班級(jí) SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班'); // 查詢四班的所有學(xué)生
|C/C++上使用SQLite3
1、配置好C/C++項(xiàng)目環(huán)境:導(dǎo)入sqlite3.lib和sqlite3.dll,包含頭文件#include <sqlite3.h>。(具體步驟此處不講,可參考該網(wǎng)頁)
2、打開或者創(chuàng)建數(shù)據(jù)庫(kù)。
sqlite3 *sql = NULL; // 一個(gè)打開的數(shù)據(jù)庫(kù)實(shí)例 const char * path = "..../test.db";//某個(gè)sql文件的路徑 // 根據(jù)文件路徑打開數(shù)據(jù)庫(kù)連接。如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建。 // 數(shù)據(jù)庫(kù)文件的路徑必須以C字符串傳入。 int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL); if (result == SQLITE_OK) { std::clog << "打開數(shù)據(jù)庫(kù)連接成功"; } else { std::clog << "打開數(shù)據(jù)庫(kù)連接失敗"; }
3、執(zhí)行不返回?cái)?shù)據(jù)的SQL語句(增、刪、改)。
(執(zhí)行更新、刪除語句和執(zhí)行創(chuàng)表、添加語句基本類似,只需更改sql語句即可。)
const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); "; //SQL語句 sqlite3_stmt *stmt = NULL; //stmt語句句柄 //進(jìn)行插入前的準(zhǔn)備工作——檢查語句合法性 //-1代表系統(tǒng)會(huì)自動(dòng)計(jì)算SQL語句的長(zhǎng)度 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); if (result == SQLITE_OK) { std::clog<< "添加數(shù)據(jù)語句OK"; //執(zhí)行該語句 sqlite3_step(stmt); } else { std::clog << "添加數(shù)據(jù)語句有問題"; } //清理語句句柄,準(zhǔn)備執(zhí)行下一個(gè)語句 sqlite3_finalize(stmt);
4、執(zhí)行返回?cái)?shù)據(jù)的SQL語句(查)。
const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;"; //SQL語句 sqlite3_stmt *stmt = NULL; // stmt語句句柄 //進(jìn)行查詢前的準(zhǔn)備工作——檢查語句合法性 //-1代表系統(tǒng)會(huì)自動(dòng)計(jì)算SQL語句的長(zhǎng)度 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL); if (result == SQLITE_OK) { std::clog << "查詢語句OK"; // 每調(diào)一次sqlite3_step()函數(shù),stmt語句句柄就會(huì)指向下一條記錄 while (sqlite3_step(stmt) == SQLITE_ROW) { // 取出第0列字段的值 const unsigned char *name = sqlite3_column_text(stmt, 0); // 取出第1列字段的值 int age = sqlite3_column_int(stmt, 1); //輸出相關(guān)查詢的數(shù)據(jù) std::clog << "name = " << name <<", age = "<< age; } } else { std::clog << "查詢語句有問題"; } //清理語句句柄,準(zhǔn)備執(zhí)行下一個(gè)語句 sqlite3_finalize(stmt);
5、關(guān)閉數(shù)據(jù)庫(kù):sqlite3_close_v2(sqlite3* sql)
if (sql) { sqlite3_close_v2(sql); sql = nullptr; }
|SQLite3 庫(kù)函數(shù) 總結(jié)
1.打開數(shù)據(jù)庫(kù)
int sqlite3_open_v2( const char *filename, // 數(shù)據(jù)庫(kù)的文件路徑 sqlite3 **ppDb, // 數(shù)據(jù)庫(kù)實(shí)例 int flags, // 標(biāo)志 const char *zVfs // 使用該數(shù)據(jù)庫(kù)的虛擬機(jī)的名字,這里我們不需要用,直接NULL );
其中
flags參數(shù)有如下標(biāo)志:
SQLITE_OPEN_NOMUTEX: 設(shè)置數(shù)據(jù)庫(kù)連接運(yùn)行在多線程模式(沒有指定單線程模式的情況下) SQLITE_OPEN_FULLMUTEX:設(shè)置數(shù)據(jù)庫(kù)連接運(yùn)行在串行模式。 SQLITE_OPEN_SHAREDCACHE:設(shè)置運(yùn)行在共享緩存模式。 SQLITE_OPEN_PRIVATECACHE:設(shè)置運(yùn)行在非共享緩存模式。 SQLITE_OPEN_READWRITE:指定數(shù)據(jù)庫(kù)連接可以讀寫。 SQLITE_OPEN_CREATE:如果數(shù)據(jù)庫(kù)不存在,則創(chuàng)建。
2.檢查SQL語句的合法性(查詢前的準(zhǔn)備)
若語句合法即編譯通過,則將語句產(chǎn)生的指令塞進(jìn)stmt句柄(此時(shí)并未執(zhí)行指令)
int sqlite3_prepare_v2( sqlite3 *db, // 數(shù)據(jù)庫(kù)實(shí)例 const char *zSql, // 需要檢查的SQL語句 int nByte, // SQL語句的最大字節(jié)長(zhǎng)度 sqlite3_stmt **ppStmt, // stmt句柄,用來存儲(chǔ)SQL stmt指令 const char **pzTail );
3.執(zhí)行stmt句柄(執(zhí)行存儲(chǔ)在stmt句柄的指令)
如果指令能查詢到下一行數(shù)據(jù),就會(huì)返回SQLITE_ROW
如果指令(例如寫入數(shù)據(jù))不需要返還數(shù)據(jù),就會(huì)返還SQLITE_DONE
int sqlite3_step( sqlite3_stmt* stmt //stmt句柄 );
4.利用stmt句柄獲得第iCol字段的值(字段的下標(biāo)從0開始)
//執(zhí)行完查詢句柄后,stmt就會(huì)指向查到的數(shù)據(jù)
//然后可以通過stmt獲取相應(yīng)數(shù)據(jù)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點(diǎn)數(shù)據(jù) int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數(shù)據(jù) sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長(zhǎng)整型數(shù)據(jù) const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進(jìn)制文本數(shù)據(jù) const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串?dāng)?shù)據(jù)
其他:
清理語句句柄(以便重復(fù)使用同一個(gè)stmt句柄)
int sqlite3_finalize( sqlite_stmt* stmt //stmt句柄 );
關(guān)閉數(shù)據(jù)庫(kù)連接
int sqlite3_close_v2( sqlite3 * sql, // 數(shù)據(jù)庫(kù)實(shí)例 );
直接編譯并執(zhí)行 SQL語句
(不推薦使用:1、沒有SQL語法檢查 2、每一句SQL語句即使完全一樣,也會(huì)重新編譯執(zhí)行,對(duì)批量指令來說效率不高。)
int sqlite3_exec( sqlite3* sql, // 一個(gè)打開的數(shù)據(jù)庫(kù)實(shí)例 const char * sqlSentence, // 需要執(zhí)行的SQL語句 int (*callback)(void*,int,char**,char**), // SQL語句執(zhí)行完畢后的回調(diào) void *, // 回調(diào)函數(shù)的第1個(gè)參數(shù) char **errmsg // 錯(cuò)誤信息 );
|額外:使用SQLiteStudio工具來輔佐
SQLiteStudio是一個(gè)可視化的數(shù)據(jù)庫(kù)管理工具。
通過可視化界面,它可以方便快捷地查看或操作數(shù)據(jù)庫(kù)信息。
它是程序sqlite數(shù)據(jù)調(diào)試檢查不可或缺的輔助工具。
(界面大概如圖:)
SQLiteStudio 下載地址:http://chabaoo.cn/database/132497.html
以上就是C++ Sqlite3的使用方法的詳細(xì)內(nèi)容,更多關(guān)于C++ Sqlite3的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問題
這篇文章主要給大家介紹了關(guān)于如何利用C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問題,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-12-12C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解
這篇文章主要介紹了C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10詳解c++11以正確的姿勢(shì)輸出enum class的值
這篇文章主要介紹了詳解c++11以正確的姿勢(shì)輸出enum class的值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10C語言實(shí)現(xiàn)簡(jiǎn)易通訊錄(靜態(tài)版本)的代碼分享
這篇文章主要為大家詳細(xì)介紹了如何錄音C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)易的通訊錄(靜態(tài)版本),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-10-10Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例
這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例,本文代碼中包含大量注釋來講解CCControlColourPicker控件類的使用,需要的朋友可以參考下2014-09-09