SQLite 數據庫核心知識與 C 語言編程

一、數據庫基礎概念

1.1 數據庫分類

根據規模和應用場景,數據庫可分為以下幾類:

  • 大型數據庫:Oracle(適用于企業級高并發、大容量場景)
  • 中型數據庫:MySQL、MSSQL(適用于中小型系統、Web 應用)
  • 小型數據庫:SQLite、DB2(適用于嵌入式設備、輕量應用)

1.2 常用核心名詞

縮寫全稱核心作用
DBDatabase(數據庫)用于數據的存儲、查詢和更新,是數據的集合
DBMSDatabase Management System(數據庫管理系統)操作和管理數據庫的軟件,如 SQLite、MySQL
MISManagement Information System(管理信息系統)基于數據庫的企業管理系統,如 ERP、CRM
OAOffice Automation(辦公自動化)基于數據庫的協同辦公系統,如考勤、審批

1.3 關系型數據庫與 SQL 分類

關系型數據庫基于表結構存儲數據,通過SQL(Structured Query Language,結構化查詢語言)?操作數據,SQL 按功能分為三類:

  • DDL(數據定義語言):用于定義數據庫結構,如建表、刪表
  • DML(數據操作語言):用于修改數據,如新增、更新、刪除數據
  • DQL(數據查詢語言):用于查詢數據,如條件查詢、排序查詢

二、SQLite 核心特性

SQLite 是輕量級嵌入式數據庫,無需獨立服務器,核心特點如下:

  1. 開源免費:基于 C 語言開發,源代碼完全開放
  2. 極致輕量:核心代碼僅約 1 萬行,編譯后體積小于 10MB
  3. 無需安裝:綠色軟件,解壓即可使用,無復雜配置
  4. 文件存儲:整個數據庫存儲在單一文件中,便于移動和備份
  5. 容量充足:最大支持 2TB 數據存儲,滿足中小型應用需求
  6. 跨平臺兼容:支持 Windows、Linux、macOS 等主流操作系統

三、SQLite 安裝與基本使用

3.1 安裝方法(Ubuntu/Debian 系統)

# 安裝SQLite命令行工具
sudo apt-get install sqlite3
# 安裝開發庫(含頭文件和靜態庫,用于C語言開發)
sudo apt-get install libsqlite3-dev
驗證安裝
# 查看SQLite版本
sqlite3 --version
# 查看幫助信息
sqlite3 --help
編譯 C 程序
# 編譯時需鏈接SQLite庫和線程庫
gcc test.c -lsqlite3 -lpthread -o test

3.2 基本使用(命令行)

1. 啟動與退出
# 打開或創建名為test.db的數據庫文件(不存在則自動創建)
sqlite3 test.db# 退出SQLite命令行(兩種方式)
.q 或 .exit
  • 成功啟動后顯示?sqlite>?提示符
  • 若出現?...>?提示符,說明命令未結束,需輸入?;?結束
2. 創建數據庫
# 方法1:先創建空文件,再打開
touch test.db
sqlite3 test.db# 方法2:直接通過sqlite3命令創建并打開(推薦)
sqlite3 test.db

3.3 系統維護命令(以.開頭)

命令功能描述
.database列出當前數據庫及關聯文件路徑
.tables列出當前數據庫中的所有表
.schema [表名]顯示指定表的結構(CREATE 語句),無表名則顯示所有表
.dump [表名]導出數據庫或指定表的 SQL 腳本
.headers on/off開啟 / 關閉查詢結果的列標題顯示
.exit退出 SQLite 程序

3.4 數據庫導入與導出

導出數據庫(備份)
# 將test.db數據庫導出為SQL腳本backup.sql
sqlite3 test.db .dump > backup.sql
導入數據庫(恢復)
# 將backup.sql腳本導入到new.db數據庫(new.db不存在則創建)
sqlite3 new.db < backup.sql

四、SQL 基本語法

4.1 DDL(數據定義語言)

1. 創建表
-- 方式1:默認字段類型為TEXT
CREATE TABLE user(id, name, age);-- 方式2:指定字段類型(推薦)
CREATE TABLE user(id INT,        -- 整數類型name TEXT,     -- 文本類型age INT,       -- 整數類型dt DATETIME    -- 時間類型
);
  • SQLite 支持的數據類型:INT(整數)、TEXT(文本)、REAL(浮點數)、BLOB(二進制)
  • 若不指定類型,默認按TEXT處理
2. 刪除表
-- 刪除名為user的表(謹慎操作,數據不可恢復)
DROP TABLE user;

4.2 DML(數據操作語言)

1. 插入數據
-- 插入指定字段的數據(未指定字段值為NULL)
INSERT INTO user(id, age) VALUES(1, 10);-- 插入完整記錄(需與表字段順序一致)
INSERT INTO user VALUES(3, "wang", 11, datetime('now', '+8 hours'));-- 只插入部分字段(其余字段為NULL)
INSERT INTO user(age) VALUES(12);
  • datetime('now', '+8 hours'):獲取當前東八區時間
2. 更新數據
-- 單條件更新:修改name為'li'的記錄的id為1
UPDATE user SET id = 1 WHERE name = 'li';-- 多條件更新(AND):同時滿足兩個條件
UPDATE user SET id = 1 WHERE name = "li" AND passwd = "123";-- 多條件更新(OR):滿足任一條件
UPDATE user SET id = 2 WHERE name = "li" OR name = "zhao";
3. 刪除數據
-- 刪除表中所有數據(謹慎操作,無條件刪除)
DELETE FROM user;-- 單條件刪除:刪除id為1的記錄
DELETE FROM user WHERE id = 1;-- 多條件刪除(AND/OR)
DELETE FROM user WHERE id = 1 AND name = "zhang";
DELETE FROM user WHERE id = 1 OR id = 2;

4.3 DQL(數據查詢語言)

1. 基本查詢
-- 查詢表中所有字段和數據
SELECT * FROM user;-- 查詢指定字段
SELECT id FROM user;
SELECT id, name FROM user;
2. 條件查詢
-- 邏輯條件查詢(NOT):查詢age不小于30的記錄
SELECT * FROM user WHERE NOT age < 30;-- 模糊查詢(LIKE):%匹配0-任意字符,_匹配1個字符
SELECT * FROM user WHERE name LIKE '張%';  -- 匹配姓張的所有記錄
SELECT * FROM user WHERE name LIKE '張_';   -- 匹配姓張且名字為2個字的記錄-- 排序查詢(ORDER BY):ASC升序(默認),DESC降序
SELECT * FROM user ORDER BY id;          -- 按id升序
SELECT * FROM user ORDER BY id DESC;     -- 按id降序-- 限制結果數量(LIMIT):只返回前2條記錄
SELECT * FROM user LIMIT 2;-- 組合查詢:條件+排序+限制
SELECT * FROM user 
WHERE age > 20 OR age < 50 
ORDER BY age DESC 
LIMIT 2;

4.4 高級特性:自動增長列

SQLite 通過INTEGER PRIMARY KEY實現自動增長,無需AUTOINCREMENT

-- 創建含自動增長列的表
CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,  -- ASC表示升序增長(默認)name TEXT,age INT,dt DATETIME
);-- 插入數據:id傳入NULL觸發自增(首條記錄id=1,后續自動+1)
INSERT INTO user3 VALUES(NULL, '李四', 23, datetime('now'));

五、SQLite C 語言接口

5.1 開發環境準備

  • 頭文件:#include <sqlite3.h>
  • 編譯命令:gcc test.c -lsqlite3 -lpthread -o test

5.2 核心 API 函數

1. 打開數據庫:sqlite3_open
int sqlite3_open(const char *path,  // 數據庫文件路徑(如"./test.db")sqlite3 **db       // 數據庫連接句柄的指針(輸出參數)
);
  • 功能:打開指定路徑的數據庫文件,不存在則創建
  • 返回值:成功返回SQLITE_OK(0),失敗返回非 0 錯誤碼
  • 錯誤處理:通過sqlite3_errmsg(db)獲取錯誤信息
2. 關閉數據庫:sqlite3_close
int sqlite3_close(sqlite3 *db);  // db:數據庫連接句柄
  • 功能:關閉數據庫連接
  • 返回值:成功返回SQLITE_OK,失敗返回錯誤碼
  • 注意:關閉前需確保所有 SQL 操作已完成
3. 執行 SQL 語句:sqlite3_exec
int sqlite3_exec(sqlite3 *db,                // 數據庫連接句柄const char *sql,            // 要執行的SQL語句int (*callback)(void*,int,char**,char**),  // 回調函數(處理查詢結果)void *arg,                  // 傳遞給回調函數的參數char **errmsg               // 錯誤信息指針(輸出參數)
);
  • 功能:執行 SQL 語句(INSERT/UPDATE/DELETE/SELECT 等)
  • 回調函數:僅 SELECT 查詢時需要,用于逐行處理結果;非查詢語句可設為NULL
  • 錯誤處理:錯誤信息需通過sqlite3_free(errmsg)釋放內存

5.3 回調函數定義

回調函數用于處理sqlite3_exec執行 SELECT 后的查詢結果:

// 回調函數:逐行處理查詢結果
static int callback(void *NotUsed,    // 用戶自定義參數(由sqlite3_exec的arg傳入)int argc,         // 結果列數char **argv,      // 結果數據數組(argv[i]為第i列的值,NULL表示空值)char **azColName  // 列名數組(azColName[i]為第i列的列名)
) {int i;// 遍歷列數據,打印列名和對應值for (i = 0; i < argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");  // 每行數據后換行return 0;      // 返回0表示繼續處理下一行,非0則中斷
}

5.4 完整示例代碼

示例 1:控制臺輸出查詢結果
#include <stdio.h>
#include <sqlite3.h>// 回調函數:處理并打印查詢結果
int show(void* arg, int col, char** result, char** title) {static int flag = 0;  // 標記是否首次調用(僅打印一次列名)int i = 0;// 首次調用:打印列名if (0 == flag) {flag = 1;for (i = 0; i < col; i++) {printf("%s\t", title[i]);}}// 打印當前行數據printf("\n");for (i = 0; i < col; i++) {printf("%s\t", result[i] ? result[i] : "NULL");}return 0;
}int main(int argc, char** argv) {sqlite3* db = NULL;       // 數據庫連接句柄char* errmsg = NULL;      // 錯誤信息指針int ret;// 1. 打開數據庫ret = sqlite3_open("./test.db", &db);if (SQLITE_OK != ret) {fprintf(stderr, "打開數據庫失敗:%s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}// 2. 執行查詢SQLchar sql_cmd[] = "SELECT * FROM user;";ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);if (SQLITE_OK != ret) {fprintf(stderr, "執行SQL失敗:%s(SQL:%s)\n", errmsg, sql_cmd);sqlite3_free(errmsg);  // 釋放錯誤信息內存sqlite3_close(db);return 1;}// 3. 關閉數據庫sqlite3_close(db);return 0;
}
示例 2:查詢結果寫入文件
#include <stdio.h>
#include <sqlite3.h>// 回調函數:將查詢結果寫入文件
int show(void* arg, int col, char** result, char** title) {FILE* fp = (FILE*)arg;    // 傳入的文件指針static int flag = 0;      // 標記是否首次調用int i = 0;// 首次調用:寫入列名if (0 == flag) {flag = 1;for (i = 0; i < col; i++) {fprintf(fp, "%s\t", title[i]);}}// 寫入當前行數據fprintf(fp, "\n");for (i = 0; i < col; i++) {fprintf(fp, "%s\t", result[i] ? result[i] : "NULL");}return 0;
}int main(int argc, char** argv) {sqlite3* db = NULL;char* errmsg = NULL;int ret;// 1. 打開數據庫ret = sqlite3_open("./test.db", &db);if (SQLITE_OK != ret) {fprintf(stderr, "打開數據庫失敗:%s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}// 2. 打開文件(用于寫入結果)FILE* fp = fopen("result.txt", "w");if (NULL == fp) {perror("打開文件失敗");sqlite3_close(db);return 1;}// 3. 執行查詢SQL,將文件指針傳入回調函數char sql_cmd[] = "SELECT * FROM user;";ret = sqlite3_exec(db, sql_cmd, show, fp, &errmsg);if (SQLITE_OK != ret) {fprintf(stderr, "執行SQL失敗:%s(SQL:%s)\n", errmsg, sql_cmd);sqlite3_free(errmsg);sqlite3_close(db);fclose(fp);return 1;}// 4. 關閉資源fclose(fp);sqlite3_close(db);return 0;
}

5.5 運行示例

# 1. 編譯代碼
gcc query_to_file.c -lsqlite3 -lpthread -o query_to_file# 2. 執行程序(前提:test.db已存在且含user表)
./query_to_file# 3. 查看結果文件
cat result.txt

理想輸出(result.txt)

id      name    age     dt
1       張三    23      2024-05-20 15:30:45
2       李四    25      2024-05-20 15:31:20

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922144.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Netty 調優篇:實戰配置、性能監控與常見坑

&#x1f680; Netty 調優篇&#xff1a;實戰配置、性能監控與常見坑前面我們已經深入了 Netty 的 線程模型、Pipeline、EventLoop、內存池、零拷貝和背壓機制。 但在實際工作中&#xff0c;很多人踩坑的地方不是“源碼沒看懂”&#xff0c;而是 調優沒做好。 今天我們就從三個…

Linux Node.js 安裝及環境配置詳細教程

如果您喜歡此文章&#xff0c;請收藏、點贊、評論&#xff0c;謝謝&#xff0c;祝您快樂每一天。 一、Node.js是什么 Node.js是一個基于Chrome V8引擎的[JavaScript運行環境]。 Node.js使用了一個事件驅動、非阻塞式I/O 的模型。 Node.js是一個讓JavaScript運行在服務端的開…

呼叫中心系統IVR流程設計的心理學

呼叫中心的 IVR&#xff08;交互式語音應答&#xff09;系統看似是 “機器與用戶的對話”&#xff0c;實則暗藏對用戶心理的精準把握。其設計需圍繞降低焦慮、提升效率、強化信任三大核心目標&#xff0c;背后依托認知心理學、行為心理學、情感心理學等理論支撐。一、認知負荷理…

一些開源或免費的網絡管理工具

整理開源及免費網絡管理工具推薦,涵蓋監控、配置、安全、流量分析等場景,適用于不同規模的網絡環境: ?一、網絡監控與性能分析? 1. ?Zabbix? ?特點?:企業級監控方案,支持SNMP、IPMI、JMX等多種協議,提供實時儀表盤、告警通知和自動化發現功能。 ?適用場景?:服…

谷粒商城項目-P16快速開發-人人開源搭建后臺管理系統

1.對腳手架工程進行改造 此項目選用的腳手架工程是人人開源 地址&#xff1a;人人開源 選擇的是下圖標紅的renren-fast作為后端&#xff0c;renren-fast-vue作為前端 克隆上述兩個項目 2.后端改造 2.1將renrenfast項目的git文件夾刪除后&#xff0c;拖進后端代碼文件夾中 2…

V少JS基礎班之第八彈:this

文章目錄一、 前言二、本節涉及知識點三、重點內容1、從新的角度認識this2、this是函數的參數3、this的值4、函數的調用1- 裸函數調用2- 函數作為構造函數調用3- 函數作為對象的方法調用4- 函數顯示調用5- 箭頭函數一、 前言 第八彈內容是this。this相對來說難度不大&#xff…

《堆的詳解:結構、操作及堆排序算法》

目錄 一.堆的概念與結構 1.1 堆的概念 1.2 堆性質&#xff1a; 1.3 堆的結構定義 二.堆的初始化和銷毀 2.1 堆的初始化&#xff1a; 2.2 堆的銷毀&#xff1a; 三.堆的插入數據(含向上調整算法的實現) 3.1 插入邏輯 3.2 插入函數 3.3 向上調整算法 三. 堆的刪除數…

深入解析 Kubernetes 中的 Service 資源:為應用提供穩定的網絡訪問

什么是 Kubernetes 中的 Service&#xff1f; 在現代微服務架構中&#xff0c;服務之間的通信和負載均衡是至關重要的。尤其是在 Kubernetes 環境中&#xff0c;由于 Pod 是動態創建和銷毀的&#xff0c;如何為一組 Pod 提供穩定的訪問入口&#xff0c;成為了架構設計中的一個關…

使用Samba網絡磁盤作為MacOS時間機器的遠程備份磁盤

最近考慮MacOS系統升級&#xff0c;所以需要做磁盤備份&#xff0c;MacOS里有個備份磁盤很方便的工具&#xff1a;時間機器&#xff0c;可以自動定期備份磁盤&#xff0c;但是一般需要一個大點的移動硬盤插在macbook上選擇其為備份磁盤&#xff0c;可惜我并沒有移動硬盤&#x…

智能頭盔實時監控系統設計與實現

智能頭盔實時監控系統設計與實現 源碼 https://gitee.com/intostars/csdn-demo/tree/master/src/views/smartHelmet 預覽 一、功能概述 智能頭盔實時監控系統是基于Vue 3和TypeScript開發的一套用于遠程監控和控制智能頭盔設備的前端應用模塊。該系統通過WebSocket與后端服務…

Docker 學習筆記(八):容器運行時工具實踐及 OpenStack 部署基礎

容器管理工具Containerd nerdctl 實踐 nerdctl管理存儲 nerdctl命令創建容器的時候&#xff0c;可以使用-v選項將本地目錄掛載給容器實現數據持久化 示例&#xff1a; [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# nerdctl run -d -v /data:/data busybox -- sleep infi…

Unity鍵盤控制角色運動

以下是一個完整的Unity角色移動和跳躍腳本,支持WASD或方向鍵移動: 使用說明 確保組件設置正確: 確保您的游戲對象有一個CharacterController組件 如果沒有,可以通過菜單 "Component -> Physics -> Character Controller" 添加 相機設置: 確保場景中有一…

linux 宏 DEVICE_ATTR

理解 DEVICE_ATTR DEVICE_ATTR 是 Linux 內核中用于創建設備屬性的宏&#xff0c;通常用于 sysfs 文件系統。通過 sysfs&#xff0c;用戶空間的程序可以讀取或修改內核中的設備屬性。DEVICE_ATTR 宏定義在 <linux/device.h> 頭文件中&#xff0c;用于聲明和定義一個設備屬…

MCP模型上下文協議以及交互流程

1. MCP 是什么全稱&#xff1a;Model Context Protocol定位&#xff1a;讓大語言模型&#xff08;LLM&#xff09;能在“上下文”之外&#xff0c;按統一格式訪問外部數據、調用插件、持久化狀態。動機&#xff1a;以前每家框架&#xff08;LangChain、LlamaIndex 等&#xff0…

MySQLTransactionRollbackException

問題描述mysql部署1主3從&#xff0c;昨天發現主庫有大量報警錯誤&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis環境搭建指南:Windows/Linux/Docker多場景安裝與配置

Redis環境搭建指南&#xff1a;Windows/Linux/Docker多場景安裝與配置 1. Redis安裝方式概覽 1.1 安裝方式對比 安裝方式適用場景優點缺點難度Windows直接安裝開發調試安裝簡單&#xff0c;Windows兼容好性能不如Linux&#xff0c;生產不推薦?Linux源碼編譯生產環境性能最佳…

leetcode.80刪除有序數組中的重復項2

題目描述 給你一個有序數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使得出現次數超過兩次的元素只出現兩次 &#xff0c;返回刪除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。…

運動卡新手入門及常見問題處理

1.新手入門1.1 插卡打開包裝&#xff0c;拿出PCI板卡&#xff0c;如下圖&#xff1a;打開電腦機箱蓋&#xff0c;找到PCI插槽&#xff0c;如下圖&#xff08;紅色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他顏色&#xff09;&#xff1a;插入板卡&#xff0c;如下圖…

PRINCE2與PMP項目管理體系對比

在全球范圍內&#xff0c;PRINCE2與PMP是兩大最具影響力的項目管理體系。PRINCE2注重流程和治理結構&#xff0c;強調“控制”與“規范”&#xff1b;而PMP基于PMBOK指南&#xff0c;強調知識體系和方法論的全面性&#xff0c;更關注“工具”與“實踐”。 不同體系的側重點&…

在UniApp跨平臺開發中實現相機自定義濾鏡的鏈式處理架構

以下是進階方案&#xff1a;架構核心設計分層結構$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示鏈式處理操作符$Capture$ 為原始圖像采集層$Filter_n$ 為可插拔濾鏡單元$Render$ 為…