数据库编程:从SQLite基础到C语言集成

📅 发布时间:2026/7/10 18:12:40 👁️ 浏览次数:
数据库编程:从SQLite基础到C语言集成
一、数据库概述1.1 数据库的定义与作用数据库Database是一种按照数据结构来组织、存储和管理数据的软件系统。它能够高效地处理大批量数据提供数据持久化、快速检索、并发控制、安全性保障等功能是应用程序与数据之间的桥梁。1.2 数据库的分类根据数据组织方式数据库主要分为两类关系型数据库基于关系模型使用表格二维表存储数据表与表之间通过外键等约束建立关联。常见的有Oracle大型企业级数据库功能强大但资源占用高。MySQL开源广泛使用适用于Web应用。SQL Server微软产品与.NET生态集成良好。SQLite轻量级嵌入式数据库无需独立服务进程直接集成到应用程序中。非关系型数据库以键值对、文档、列族或图结构存储数据适用于高并发、海量数据的场景。如Redis键值存储、MongoDB文档型等。本次学习主要围绕SQLite展开因为它轻巧、无需配置、支持标准SQL非常适合嵌入式设备和桌面应用开发。二、SQLite数据库基础2.1 SQLite的特点零配置不需要安装和配置服务器数据库就是一个单一的文件。跨平台支持Windows、Linux、macOS等多种操作系统。轻量级代码库小约250KB内存占用低。支持SQL实现了大部分SQL-92标准支持事务ACID。C语言接口提供原生C API便于嵌入式开发。2.2 SQLite的安装Ubuntu环境在Linux系统中通过apt-get工具集安装SQLite及相关开发包sudo apt-get install sqlite3 # SQLite命令行工具 sudo apt-get install libsqlite3-dev # SQLite开发库供C语言调用 sudo apt-get install sqlitebrowser # 图形化管理工具可选安装完成后终端输入sqlite3即可进入交互式命令行环境。2.3 SQLite常用命令在sqlite3提示符下以点号开头的命令用于管理数据库常见的有命令功能.databases列出当前打开的数据库文件.tables显示所有表名.header on/off开启/关闭查询结果头部显示.mode MODE设置输出格式如csv、column、list等.schema [表名]显示创建表的SQL语句.quit退出sqlite3例如设置列对齐显示sqlite .header on sqlite .mode column三、SQL语句详解SQLStructured Query Language是操作关系型数据库的标准语言。以下通过一个学生信息表student来演示常用操作。3.1 数据定义语言DDL创建表CREATE TABLE student ( 学号 INTEGER PRIMARY KEY, 姓名 TEXT, 性别 TEXT, 年龄 INTEGER, 成绩 INTEGER );PRIMARY KEY约束指定学号为主键唯一标识一条记录。SQLite支持的数据类型INTEGER、REAL、TEXT实际上SQLite采用动态类型但建议明确声明。删除表DROP TABLE student;3.2 数据操作语言DML插入数据全字段插入INSERT INTO student VALUES (1002, 李四, 女, 13, 80);部分字段插入INSERT INTO student (学号, 姓名, 性别) VALUES (1009, 熊大, 男);删除数据DELETE FROM student WHERE 姓名 赵五;更新数据UPDATE student SET 年龄 16, 成绩 85 WHERE 姓名 熊大;3.3 数据查询语言DQL基本查询SELECT * FROM student; -- 查询所有列 SELECT 学号, 成绩 FROM student; -- 查询指定列 SELECT 姓名 FROM student WHERE 成绩 60 AND 性别 男; -- 带条件查询 SELECT 姓名 FROM student WHERE 姓名 LIKE %田%; -- 模糊查询排序SELECT 学号, 姓名 FROM student WHERE 成绩 60 ORDER BY 成绩 DESC; -- 降序 SELECT 学号, 姓名 FROM student WHERE 成绩 60 ORDER BY 成绩 ASC; -- 升序3.4 多表联合查询实际应用中数据往往分散在多个表中需要通过连接JOIN获取完整信息。假设有以下三表学生信息表学生信息(学号, 姓名, ...)课程表学生课程(编号, 名称)成绩表学生成绩(学号, 课程编号, 成绩)交叉连接CROSS JOIN返回两表的笛卡尔积较少使用。SELECT 学生信息.姓名 AS 姓名, 学生课程.名称 AS 课程 FROM 学生信息 CROSS JOIN 学生课程;内连接INNER JOIN返回两表中满足连接条件的记录。SELECT 学生信息.姓名 AS 姓名, 学生成绩.成绩 AS 成绩 FROM 学生信息 INNER JOIN 学生成绩 ON 学生信息.学号 学生成绩.学号;左外连接LEFT OUTER JOIN返回左表全部记录右表无匹配时填充NULL。SELECT 学生信息.姓名 AS 姓名, 学生成绩.成绩 AS 成绩 FROM 学生信息 LEFT OUTER JOIN 学生成绩 ON 学生信息.学号 学生成绩.学号;三表联合查询SELECT 学生信息.姓名 AS 姓名, 学生课程.名称 AS 课程, 学生成绩.成绩 AS 成绩 FROM 学生信息 LEFT OUTER JOIN 学生成绩 ON 学生信息.学号 学生成绩.学号 LEFT OUTER JOIN 学生课程 ON 学生成绩.课程编号 学生课程.编号 WHERE 成绩 60 ORDER BY 成绩 DESC;四、C语言数据库编程SQLite APISQLite提供了一套C语言接口允许程序直接操作数据库。核心API如下4.1 打开数据库sqlite3_openint sqlite3_open(const char *filename, sqlite3 **ppDb);功能打开或创建一个SQLite数据库文件返回数据库句柄sqlite3 *。返回值成功返回SQLITE_OK否则返回错误码。4.2 错误处理sqlite3_errmsgconst char *sqlite3_errmsg(sqlite3 *db);功能根据数据库句柄获取最后一次操作的错误描述。4.3 执行SQL语句sqlite3_execint sqlite3_exec( sqlite3 *db, /* 数据库句柄 */ const char *sql, /* 要执行的SQL语句 */ int (*callback)(void*, int, char**, char**), /* 回调函数处理查询结果 */ void *arg, /* 传递给回调函数的参数 */ char **errmsg /* 错误信息指针 */ );该函数可以执行任何SQL语句DDL、DML、DQL。对于SELECT语句每检索到一行就会调用一次回调函数。回调函数原型int callback(void *arg, int nColumns, char **colValues, char **colNames);arg用户传入的参数。nColumns当前行的列数。colValues字符串数组存放各列的值。colNames字符串数组存放各列的字段名。返回值0表示继续处理后续行非0则终止查询。4.4 释放错误信息sqlite3_freevoid sqlite3_free(void *ptr);用于释放sqlite3_exec中由errmsg分配的内存。4.5 关闭数据库sqlite3_closeint sqlite3_close(sqlite3 *db);关闭数据库连接释放资源。4.6 示例查询学生信息#include stdio.h #include sqlite3.h int callback(void *arg, int nCol, char **val, char **colName) { for (int i 0; i nCol; i) printf(%s %s\n, colName[i], val[i] ? val[i] : NULL); printf(\n); return 0; } int main() { sqlite3 *db; char *errmsg NULL; int rc sqlite3_open(test.db, db); if (rc ! SQLITE_OK) { fprintf(stderr, Cant open database: %s\n, sqlite3_errmsg(db)); return 1; } const char *sql SELECT * FROM student;; rc sqlite3_exec(db, sql, callback, NULL, errmsg); if (rc ! SQLITE_OK) { fprintf(stderr, SQL error: %s\n, errmsg); sqlite3_free(errmsg); } sqlite3_close(db); return 0; }编译时需要链接SQLite库gcc example.c -lsqlite3 -o example五、实践作业分析本次学习的作业之一是构建一个单词查询系统要求将单词文件中的所有单词和含义插入到数据库中。从终端输入单词通过数据库查找对应的含义并打印若无匹配则提示输入有误。