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

5. SQLite基本操作
SQL类型
INTEGER 整型
REAL 实型
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 数据类型,
}示例
cppCREATE 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*); // 关闭连接
示例
cpp
#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语法
跨平台兼容性强
