数据库编程
SQLite是一种轻量级关系型数据库,适用于嵌入式设备和本地数据管理。本文介绍了SQLite的安装(Linux环境)、基本操作命令(.tables查看表、.schema查看结构)以及核心SQL操作(建表、增删改查)。重点讲解了C语言编程接口的使用流程:sqlite3_open打开数据库、sqlite3_exec执行SQL语句、sqlite3_close关闭连接,并提供了完整示例代码。SQLite因
目录
数据库是一种用于集中存储、高效统计及规范化管理数据(包含新增、查询、修改、删除等操作)的系统。其核心价值在于解决数据分散存储、管理效率低、一致性差的问题,不仅适用于服务器级别的业务系统,也能部署在智能手环、智能家居等嵌入式设备中,实现本地数据的轻量化管理。
1. 数据库概述
本质:一种高效对大批量数据做管理(如增删改查操作)的软件。
管理对象:上百万,上亿的数据
机制:运用了高效的算法和结构
与传统存储方式的对比
内存存储(链表、数组):数据存于内存,掉电丢失
文件存储:数据存于磁盘,掉电不丢失
数据库存储:结合磁盘持久化与高效管理机制,支持结构化存储和复杂查询
学习目标:在本地布局小数据库
2.分类:
关系型数据库
Oracle
Mysql
SQLServer
SQLite——所有数据库支持:SQL编程语言
非关系型数据库
Redit
3. SQLite数据库的安装(Linux环境)
1. 虚拟机网络连通: ping 8.8.8.8
2. apt-get工具集配置成功
3. 安装SQLite及相关工具
sudo apt-get install sqlite3 ——装软件
sudo apt-get install libsqlite3-dev——安装开发依赖库
sudo apt-get install sqlitebrowser——装可视化软件(Windows中常用Navicat)
4. 运行sqlite3软件

5. SQLite基本操作
SQL类型
1. INTEGER 整型
2. REAL 实型
3. TEXT 文本类型
常用命令
.database:查看当前连接的数据库文件路径(查看数据库中的表信息)
.tables:列出所有表
.schema 表名:查看表结构
.quit/.exit:退出SQLite环境.header(s)ON OFF :开启/关闭头部显示
.mode MODE : 设置数据的显示格式
CSV
column
html
insert
line
list
tabs
tcl.schema ?TABLE?: 显示创建表时的格式
注意:SQL 语句是操作数据库的标准语言,在 SQLite 中需以分号结尾
6. SQL核心操作
数据操作语言(DML)
创建表:create table
CREATE TABLE 表名称 { 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, }示例
CREATE TABLE if not exists student( 学号 INTEGER PRIMARY KEY, 姓名 TEXT, 性别 TEXT, 年龄 INTEGER, 成绩 INTEGER );
插入数据——INSERT INTO:
INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO student VALUES(1, '张三', '男', 18, 90); insert into student values (1002, "李四", "女", 13, 80); insert into student (学号,姓名,性别) values (1009, "熊大", "男");- 删除表——drop table(需谨慎操作,数据将被清空)
drop table 表名称; drop table student;
删除表元素——delete from
DELETE FROM 表名称 WHERE 列名称 = 值 delete from student where 姓名 = "赵五";
更新数据(添加功能)——update:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 UPDATE student SET 年龄=16, 成绩=85 WHERE 姓名="熊大"; update student set 年龄=16,成绩=85 where 姓名="熊大";查询数据——select:
SELECT 列名称 FROM 表名称 SELECT 学号, 姓名 FROM student WHERE 成绩 > 60 ORDER BY 成绩 DESC; select * from student; select 学号,成绩 from student; select 姓名 from student where 成绩<60 and 性别="男"; select 姓名 from student where 姓名 like "%田%"; 模糊查询(使用LIKE操作符): 通过通配符匹配字符串,常用通配符包括: _:代表一个任意字符; %:代表任意多个任意字符;排序——order by
多表联合查询
//cross join select 学生信息.姓名 as 姓名, 学生课程.名称 as 课程 from 学生信息 cross join 学生课程; //inner join select 学生信息.姓名 as 姓名, 学生成绩.成绩 as 成绩 from 学生信息 inner join 学生成绩 on 学生信息.学号 = 学生成绩.学号; //outer join 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;
7. SQLite编程接口(C语言)
通过 C 语言操作 SQLite 的核心流程为:
sqlite3_open——打开数据库
原型: int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */);功能:打开数据库获得操作数据库的句柄参数:filename:打开文件的路径ppDb:存放数据库句柄空间的首地址返回值:成功返回SQLITE_OK失败返回错误码,可以通过sqlite3_errmsg 来获得其对应的英文描述sqlite3_errmsg[功能类似 perror]原型:const char *sqlite3_errmsg(sqlite3*);功能:传入sqlite3 的句柄,返回句柄出错的英文字符串sqlite3_exec——执行 SQL 语句
原型:int sqlite3_exec(sqlite3*, /* An open database */const char *sql, /* SQL to be evaluated */原型:int (*callback)(void*,int,char**,char**), /* Callback function */void *, /* lst argument to callback */char **errmsg /* Error msg written here */);功能:执行一条SQL语句参数:数据库句柄要执行的sql语句callback:只有 select 才会用到,执行找到匹配的数据后的操作对callback 回调函数的传参errmsg:存放出错字符串空间的首地址返回值:成功返回SQLITE_OK失败返回错误码void sqlite3_free(void*);功能:释放申请的空间sqlite3_close——关闭数据库
原型:int sqlite3_close(sqlite3*);功能:关闭sqlite3 连接句柄
int sqlite3_open(const char *filename, sqlite3 **ppDb); // 打开数据库
int sqlite3_exec(sqlite3*, const char *sql, callback, void*, char **errmsg); // 执行SQL
void sqlite3_close(sqlite3*); // 关闭连接
示例
#include <sqlite3.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student
{
char name[32];
char sex[4];
int age;
int score;
}stu_t;
/***************************************************
* 注意:该回调函数可能多次被执行,每找到一条符合条件的数据就会执行一次回调函数
*
* parg:回调函数的参数,可以通过sqlite3_exec第4个参数传递
* columno:select命令生成新表的列数
* pcontents:所有列数据字符串的指针数组名
* pheaders:所有列名称字符串的指针数组名
***************************************************/
int pcallbackfun(void *parg, int columno, char **pcontents, char **pheaders)
{
int i = 0;
printf("=========================\n");
for (i = 0; i < columno; i++)
{
printf("%s:%s\n", pheaders[i], pcontents[i]);
}
printf("=========================\n");
return 0;
}
int main(void)
{
sqlite3 *pdb = NULL;
int ret = 0;
int i = 0;
char cmdbuf[1024] = {0};
char *perrmsg = NULL;
stu_t s[4] = {
{"张三", "男", 16, 50},
{"李四", "女", 15, 80},
{"王二", "男", 14, 80},
{"赵五", "女", 13, 60},
};
ret = sqlite3_open("student.db", &pdb);
if (ret != SQLITE_OK)
{
fprintf(stderr, "fail to sqlite3_open:%s\n", sqlite3_errmsg(pdb));
return -1;
}
sprintf(cmdbuf, "create table if not exists student (id integer primary key asc, name text, sex text, age integer, score integer);");
ret = sqlite3_exec(pdb, cmdbuf, NULL, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "fail to sqlite3_exec:%s\n", perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pdb);
return -1;
}
#if 0
for (i = 0; i < 4; i++)
{
sprintf(cmdbuf, "insert into student values(NULL, \"%s\", \"%s\", %d, %d);", s[i].name, s[i].sex, s[i].age, s[i].score);
ret = sqlite3_exec(pdb, cmdbuf, NULL, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "fail to sqlite3_exec:%s\n", perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pdb);
return -1;
}
}
#endif
sprintf(cmdbuf, "select name,score from student;");
ret = sqlite3_exec(pdb, cmdbuf, pcallbackfun, NULL, &perrmsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "fail to sqlite3_exec:%s\n", perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pdb);
return -1;
}
sqlite3_close(pdb);
return 0;
}
注意:编译时加上库链接
8. 应用场景
SQLite特别适合以下场景:
移动应用(Android/iOS本地存储)
嵌入式设备(智能家居、工业控制器)
小型工具软件(本地笔记、轻量级管理系统)
其核心优势包括:
单文件存储,便于迁移
无需服务器,零配置
支持标准SQL语法
跨平台兼容性强
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)