当前位置: 首页 > web >正文

Linux下的软件编程——数据库

数据存储:

变量,数组,数据存储结构        ------->内存:掉电或者程序运行结束,数据丢失

文件        -------->硬盘:掉电或者程序运行结束,数据不丢失

数据库,专业的存储数据的结构        ------>硬盘:掉电或者程序运行结束,数据不丢失

1.常用数据库:

        1.关系型数据库

           将复杂的数据结构简化为二维表格形式

           大型:Oracle,DB2

           中型:MySql,SQLServer

           小型:Sqlite

        2.非关系型数据库

           以键值对存储,且结构不固定        JSON,Redis,MongoDB

2.sqlite数据库

        1.开源免费,c语言开发

        2.代码量少,1万行左右,总大小10M以内

        3.文件型数据库,可以移动,跨平台移植性好

        4.理论数据容量最大2T

3. 安装sqlite3数据库
sqlite3.22.0

      sudo apt-get install sqlite3
安装相关库:
sudo apt-get install libsqlite3-dev

      测试:
创建一个名字为xxx.db的数据库:
sqlite3 xxx.db

4. sqlite3学习:

     sqlite支持的数据类型:

     NULL : 空值
INTEGER : 整形
REAL: 浮点型
TEXT: 字符串类型
BLOB: 根据输入进行存储

     1)sqlite3相关的命令


.help                     查看支持的命令
.tables                  查看当前数据库中的表
.headers on/off    打开或者隐藏表头
.mode column     设置列左对齐
.quit                      退出数据库


2)sqlite3支持的SQL语句


注意:
1. SQL语句后面必须要有分号;
2. sqlite不区分大小写
1. 创建表
create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型);
create table class1(id INTEGER, name TEXT, age INTEGER, score REAL);
2. 数据插入
insert into 表名 values(值1, 值2, 值3);
insert into class1 values(1, "zhangsan", 19, 88.5);

           3. 查询数据
查询所有列数据:
select * from 表名;

查询指定列数据:
select 列名1,列名2,列名n  form 表名;

条件查询:
select * from 表名 where 列  条件;

关系运算符:
>  <  >=   <=  =  !=
and   ---->&&
or    ----->||

                 模糊查找(字符串):
select * from 表名 where 列  like "%梅";
select * from 表名 where 列  like "__梅";               

% : 可以模糊匹配多个字符
_  :  只能模糊匹配一个字符

排序查找:
升序排序:
select * from 表名 order by 列名  ASC;          
降序排序:
select * from 表名 order by 列名  DESC;

4.  删除数据
delete from 表名 where 删除的条件;
delete from class1 where score < 80;

          5. 修改数据
update 表名 set 列=新值 where 条件;
update class1 set score=100 where name="wanger";

6. 删除一张表
drop table 表名;

          7.  设置主键值自动增长列
注意:
1. 主键值自动增长列必须是INTEGER类型
2. 在创建表时,主键值自动增长列要增加:PRIMARY KEY AUTOINCREMENT
create table class2(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, score REAL);
3. 插入数据时,主键值自动增长列给NULL,让其自动增长
insert into class2 values(NULL, "张三", 90);

8.  时间相关
date("now");   年-月-日
datetime("now", "+8 hours");   年-月-日  时:分:秒

sqlite的可视化工具:
sudo apt-get install sqlitebrowser

          sqlitebrowser xxx.db

     3)sqliite3提供的C/C++  API(应用程序接口)接口

          int sqlite3_open(
const char *filename,   /* Database filename (UTF-8) */
sqlite3 **ppDb          /* OUT: SQLite db handle */
);
功能:打开一个数据库文件
参数:
filename:数据库名称
ppDb :保存数据库句柄的指针的地址
返回值:
成功:SQLITE_OK
失败:错误码

int sqlite3_close(sqlite3*);
功能:关闭数据库

      int sqlite3_exec(
sqlite3*pdb,                                  /* An open database */
const char *sql,                           /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**),  /* Callback function */
void *arg,                                    /* 1st argument to callback */
char **errmsg                              /* Error msg written here */
);
功能:执行SQL语句
参数:
pdb:数据库句柄
sql:要执行的sql语句
callback:执行select语句时使用的回调函数
arg:给回调函数传递的参数(实参)
errmsg:保存出错信息
返回值:
成功:SQLITE_OK
失败:错误码

#include <stdio.h>
#include <sqlite3.h>int main(int argc, const char *argv[])
{sqlite3 *pdb;int ret = sqlite3_open("./stu.db", &pdb);if (ret != SQLITE_OK){fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));return -1;}char *psql = "create table if not exists class3(id INTEGER, name TEXT, score REAL);";ret = sqlite3_exec(pdb, psql, NULL, NULL, NULL);if (ret != SQLITE_OK){fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}char sql[128] = {"insert into class3 values(1, \"zhangsan\", 99);"};ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);if (ret != SQLITE_OK){fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}sqlite3_close(pdb);return 0;
}

    int (*callback)(void*arg,int column,char**column_values,char**column_name);
功能:执行select语句时调用的回调函数
参数:
arg:sqlite3_exec传递的第四个参数
column:查询到的数据的列数
column_values:指针数组,多个指针分别指向每一列数据的字符串
column_name:指针数组,多个指针指向每一列的列名

#include <stdio.h>
#include <sqlite3.h>int flag = 0;int callback(void *arg, int column, char **values, char **name)
{
//	printf("column = %d\n", column);if (0 == flag){for (int i = 0; i < column; i++){printf("%s ", name[i]);}printf("\n");flag = 1;}for (int i = 0; i < column; i++){printf("%s ", values[i]);}printf("\n");return 0;
}int main(int argc, const char *argv[])
{sqlite3 *pdb;int ret = sqlite3_open("./stu.db", &pdb);if (ret != SQLITE_OK){fprintf(stderr, "sqlite3_open error : %s\n", sqlite3_errmsg(pdb));return -1;}char *psql = "select * from data;";ret = sqlite3_exec(pdb, psql, callback, NULL, NULL);if (ret != SQLITE_OK){fprintf(stderr, "sqlite3_exec error : %s\n", sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;	}sqlite3_close(pdb);return 0;
}


注意:
1. 回调函数成功的话必须要有返回值,返回0.
sqlite3_exec error : query aborted
2. 从数据库查询出来的数据,统统是字符串类型
3. 从数据库中查询数据,查到几条,回调函数就会被执行几次

                         

http://www.xdnf.cn/news/19222.html

相关文章:

  • 【备战2025数模国赛】(三)数模常见赛题类型及解决办法
  • 《Unity Shader入门精要》学习笔记三(复杂的光照)
  • 神经网络基础
  • C++中类,this指针,构造函数,析构函数。拷贝构造函数,初步理解运算符重载,初步理解赋值运算符重载
  • 数据结构——线性表(链表,力扣中等篇,增删查改)
  • AWS集成开发最佳实践:构建高效可靠的云管理平台
  • React前端开发_Day4
  • 2025年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • SyncBack 备份同步软件: 使用 FTPS、SFTP 和 HTTPS 安全加密传输文件
  • IDEA之GO语言开发
  • 虚拟私有网络笔记
  • 成都五块石写字楼出租,国际数字影像产业园影像企业专属
  • Tinymce富文本编辑器封装
  • 云手机技术中都有着哪些局限性?
  • mysql中cross join于普通join的区别
  • 无懈可击的 TCP AIMD
  • 网络请求优化:用 Retrofit 拦截器玩转日志、重试与缓存,OkHttp 和 Volley 谁更香?
  • STM32 USBx Device MSC standalone 移植示例 LAT1488
  • Product Hunt 每日热榜 | 2025-08-29
  • typescript postgres@3.x jsonb数据插入绕过类型检测错误问题
  • SwiGLU激活函数的原理
  • TensorFlow 面试题及详细答案 120道(51-60)-- 模型保存、加载与部署
  • 微软正在公开测试其首个完全自主训练的大语言模型——MAI-1-preview
  • python 日常学习记录
  • Java全栈开发工程师面试实录:从基础到微服务的深度技术解析
  • 【python】相机输出图片时保留时间戳数据
  • Blender模拟结构光3D Scanner(三)获取相机观测点云的真值
  • 信息系统生命周期
  • 小程序版碰一碰发视频:源码搭建与定制化开发的源头技术解析
  • CSS scale函数详解