目录

数据库的基本概念和常用数据库

sqlite介绍

sqlite安装步骤

sqlite常用命令

sqlite3的C语言的API函数详解

sqlite3使用项目案例


数据库的基本概念和常用数据库

数据库的基本概念:

  1. 数据库(Database):是一个按照规定格式存储数据的仓库。
  2. 数据库管理系统(Database Management System,DBMS):是一种允许用户定义、创建、维护和控制访问数据库的软件系统。
  3. 数据表(Table):是由行和列组成的二维表格,是数据库中的基本存储单元。
  4. 字段(Field):表中列的属性,表示一个数据的特定部分。
  5. 记录(Record):表中的一行数据。
  6. 主键(Primary Key):表中唯一标识每个记录的字段。
  7. 外键(Foreign Key):用于建立两个或多个表之间的关系。
  8. 索引(Index):用于加快数据的检索速度,类似于书的目录。

常用的数据库:

  1. MySQL:是一款免费开源的关系型数据库管理系统,被广泛应用于互联网应用领域。
  2. Oracle:是一款商业关系型数据库管理系统,具有高性能、高可靠和高安全性等优点。
  3. SQL Server:是微软公司开发的关系型数据库管理系统,适用于大型企业应用。
  4. MongoDB:是一款基于文档的NoSQL数据库,具有高可扩展性和灵活性。
  5. PostgreSQL:是一款开源的关系型数据库管理系统,具有高度的可扩展性和安全性。
  6. sqilte:是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作,非常适用嵌入式开发。

sqlite介绍

SQLite 是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作。SQLite 主要包括以下几个概念:

  1. 数据库文件:SQLite 基于文件的方式进行存储,每个数据库对应一个文件,文件以 .db 为后缀名。数据库文件中包含了一个或多个表,表包含了多个数据行。

  2. 表:表是 SQLite 中的基本数据存储单位。一个表由多个字段组成,每个字段对应表中一列数据。

  3. 字段:表中的每个列称为一个字段,字段包含了数据的类型、长度等信息。

  4. 数据行:表中的每一行称为一个数据行,每个数据行包含了对应字段的数据。

  5. 主键:每个表都必须有一个主键,用来唯一标识表中的每行数据。主键可以是一个或多个字段的组合。在 SQLite 中,每个表可以自动创建一个名为 “rowid” 的隐藏字段作为主键。

  6. SQL:SQL(Structured Query Language)是一种用于管理关系型数据库的语言。SQLite 也支持 SQL,可以使用 SQL 对数据库进行查询、插入、更新、删除等操作。

sqlite安装步骤

以下是在Ubuntu上安装SQLite的步骤:

  1. 打开终端窗口。

  2. 通过以下命令更新Ubuntu软件包列表:

    sudo apt-get update
    
  3. 安装SQLite软件包:

    sudo apt-get install sqlite3
    
  4. 等待安装完成。

  5. 检查SQLite是否成功安装:

    sqlite3 --version
    

    如果SQLite版本号被显示出来,说明SQLite已经成功安装。

安装可视化工具

sudo apt-get install sqlitebrowser

sqlite常用命令

下面是SQLite常用的系统命令:

  1. .help:查询SQLite帮助信息。

  2. .tables:列出当前数据库中的所有表。

  3. .schema:列出指定表的架构。

  4. .header on|off:打开或关闭输出的列头。

  5. .mode MODE:设置输出模式,如:linecolumnlist

  6. .show:显示当前的设置参数。

  7. .quit:退出SQLite命令行界面。

  8. .backup FILENAME:备份数据库,将当前数据库备份到指定文件中。

  9. .restore FILENAME:恢复备份的数据库。

  10. .dump:将整个数据库导出为SQL脚本。

  11. .timeout MS:设置命令的超时时间。

  12. .echo on|off:打开或关闭命令行输出。

  13. .explain on|off:打开或关闭查询计划的输出。

  14. .separator STRING:设置输出分隔符。

  15. .import FILE TABLE:将指定文件中的数据导入到指定表中。

  16. .exit      退出.

注意:命令前面需要加一个英文的.,表示这是一个系统命令。

下面是sqlite常用的sql语句:

  1. 创建表:CREATE TABLE table_name (column1 datatype, column2 datatype, column3 datatype, ...);

  2. 插入数据:INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

  3. 修改数据:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

  4. 删除数据:DELETE FROM table_name WHERE condition;

  5. 查询数据:SELECT column1, column2, ... FROM table_name WHERE condition;

  6. 聚合函数:SELECT COUNT(column_name), AVG(column_name), SUM(column_name), MAX(column_name), MIN(column_name) FROM table_name;

  7. 排序:SELECT column1, column2, ... FROM table_name ORDER BY column_name [ASC|DESC];

  8. 分组:SELECT column1, column2, ... FROM table_name GROUP BY column_name;

  9. 连接查询:SELECT column1, column2, ... FROM table_name1 INNER/LEFT/RIGHT JOIN table_name2 ON table_name1.column_name = table_name2.column_name;

  10. 子查询:SELECT column1, column2, ... FROM table_name WHERE column_name IN (SELECT column_name FROM table_name WHERE condition);

sqlite3的C语言的API函数详解

SQLite是一个轻量级的嵌入式数据库,它的API函数非常简单易用,以下是它的C语言API函数详解和参数定义:

1.sqlite3_open - 打开一个数据库

函数原型:int sqlite3_open(const char *filename, sqlite3 **ppDb);

参数说明:

  • filename:要打开的数据库文件名。
  • ppDb:指向sqlite3 *类型的指针的指针,用于存储打开的数据库的句柄。

返回值:

  • 成功返回SQLITE_OK,否则返回其他错误码。

2.sqlite3_close - 关闭一个数据库

函数原型:int sqlite3_close(sqlite3 *db);

参数说明:

  • db:要关闭的数据库句柄。

返回值:

  • 成功返回SQLITE_OK,否则返回其他错误码。

3.sqlite3_exec是一个SQLite C API中的函数,它可以执行一个或多个SQL语句并返回结果,使用简单方便。

函数原型:

int sqlite3_exec(sqlite3*,                                  /* An open database */const char *sql,                           /* SQL to be executed */int (*callback)(void*,int,char**,char**),  /* Callback function */void *,                                    /* 1st argument to callback */char **errmsg                              /* Error msg written here */
);

参数列表:

  • sqlite3 *db:已打开的SQLite数据库句柄;
  • const char *sql:要执行的SQL语句;
  • int (callback)(void,int,char**,char**):回调函数指针(可选参数);
  • void *:回调函数的第一个参数(可选参数);
  • char **errmsg:如果出现错误,错误信息将被记录在这个指针指向的变量中。

返回值:

  • 如果执行成功,则返回 SQLITE_OK;
  • 如果执行出错,则返回错误代码,返回码的列表可以在文档中查找。

使用方法:

下面是一个使用sqlite3_exec函数执行SELECT语句的示例:

#include <stdio.h>
#include <sqlite3.h>int main(int argc, char** argv)
{sqlite3* db;char* sql;char* errmsg;int ret;sqlite3_stmt* stmt;const char* tail;const unsigned char* val;// 打开数据库ret = sqlite3_open("test.db", &db);if (ret != SQLITE_OK){printf("open database fail:%s\n", sqlite3_errmsg(db));sqlite3_close(db);return -1;}// 执行查询语句,返回结果集sql = "SELECT * FROM t_user";ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if (ret != SQLITE_OK){printf("exec sql fail: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return -1;}// 取出查询结果集的值并输出while (sqlite3_step(stmt) == SQLITE_ROW){val = sqlite3_column_text(stmt, 0);printf("%s\n", val);}// 释放资源sqlite3_finalize(stmt);sqlite3_close(db);return 0;
}
#include <sqlite3.h>
#include <iostream>int callback(void* data, int argc, char** argv, char** azColName) {std::cout << "Callback function called." << std::endl;for(int i = 0; i < argc; i++) {std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl;}return 0;
}int main() {sqlite3* db;char* zErrMsg = 0;int rc;rc = sqlite3_open("test.db", &db);if(rc) {std::cout << "Can't open database: " << sqlite3_errmsg(db) << std::endl;return(0);} else {std::cout << "Database opened successfully." << std::endl;}const char* sql = "CREATE TABLE COMPANY(""ID INT PRIMARY KEY NOT NULL,""NAME TEXT NOT NULL,""AGE INT NOT NULL);";rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if(rc != SQLITE_OK) {std::cout << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Table created successfully." << std::endl;}sqlite3_close(db);return 0;
}

回调函数详解:

int (*callback)(void*, int, char**, char**);
其中,第一个参数是一个指针,通常用于传递应用程序自定义的数据;第二个参数是结果集中当前行的列数;第三个参数是当前行的值;第四个参数是当前行的列名。回调函数的返回值是整数类型,如果返回非0值,那么sqlite3_exec将停止执行后续的SQL语句。

sqlite3使用项目案例

假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了,好久需要再次进货,那些水果畅销,那些水果不畅销,那些水果春夏秋冬的价格波动,好,那么现在我想将这些信息保存在数据库中

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>#define DATABASE "fruit.db"void do_stock(sqlite3 *);
void do_sell(sqlite3 *);
void do_select_in(sqlite3 *);
void do_select_avg(sqlite3 *);
void do_select_stock_list(sqlite3 *);
void do_select_sell_list(sqlite3 *);int main(int argc, const char *argv[])
{sqlite3 *db;int ret;char *msgerr;if (sqlite3_open(DATABASE, &db) != SQLITE_OK){printf("open database failed %s\n", sqlite3_errmsg(db));exit(0);}else{printf("open database success\n");}// 创建进货表和卖出表和库存表if(sqlite3_exec(db, "create table if not exists fruit_stock(id integer primary key autoincrement, name char, price float, number int, time char);", NULL, NULL, &msgerr) != SQLITE_OK ){printf("%s", msgerr);exit(0);}if(sqlite3_exec(db, "create table if not exists fruit_sell(id integer primary key autoincrement, name char, price float, number int, time char);", NULL, NULL, &msgerr) != SQLITE_OK ){printf("%s", msgerr);exit(0);}if(sqlite3_exec(db, "create table if not exists fruit_in(id integer primary key autoincrement, name char, number int);", NULL, NULL, &msgerr) != SQLITE_OK ){printf("%s", msgerr);exit(0);}// while(1){printf("*****************************************************************************************\n");printf("1:fruit_stock 2:fruit_sell 3:select_in 4:select_frult_avg 5:stock_list 6:sell_list 7:exit\n");printf("*****************************************************************************************\n");printf("please select:");scanf("%d", &ret);getchar();switch(ret){case 1://进货do_stock(db);break;case 2://出货do_sell(db);break;case 3:// 查询库存do_select_in(db);break;case 4:// 查询卖出水果平均价格do_select_avg(db);break;case 5:// 查询出货记录do_select_stock_list(db);break;case 6:// 查询入库记录do_select_sell_list(db);break;case 7:// 退出sqlite3_close(db);exit(0);}}return 0;
}void do_stock(sqlite3 * db){char sql[512];char name[32];float price;int number;char ntime[64];time_t now;struct tm *st;char *msgerr;printf("input fruit stock name:");scanf("%s", name);getchar();printf("input fruit stock price:");scanf("%f", &price);getchar();printf("input fruit stock number:");scanf("%d", &number);getchar();now = time(NULL);st = localtime(&now);strftime(ntime, 64, "%Y-%m-%d %H:%M:%S", st);sprintf(sql, "insert into fruit_stock(name, price, number, time) values( '%s', %f ,%d, '%s');", name, price, number, ntime);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("stock done success\n");}memset(sql, 0, 512);sprintf(sql, "update fruit_in set number=(select number from fruit_in where name='%s') + %d where name='%s';", name, number, name);//printf("sql ==== %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("update fruit_in success\n");}return ;
}void do_sell(sqlite3 * db){char sql[512];char name[32];float price;int number;char ntime[64];time_t now;struct tm *st;char *msgerr;printf("input fruit stock name:");scanf("%s", name);printf("input fruit stock price:");scanf("%f", &price);printf("input fruit stock number:");scanf("%d", &number);st = localtime(&now);strftime(ntime, 64, "%Y-%m-%d %H:%M:%S", st);sprintf(sql, "insert into fruit_sell(name, price, number, time) values( '%s', %f ,%d, '%s');", name, price, number, ntime);//printf("sql ==== %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("stock done success\n");}memset(sql, 0, 512);sprintf(sql, "update fruit_in set number=(select number from fruit_in where name='%s') - %d where name='%s';", name, number, name);//printf("sql ==== %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("update fruit_in success\n");}return ;
}int callback(void *arg, int f_num, char **f_val, char **f_name){int i;for (i=0; i < f_num; i++){printf("%-8s", f_val[i]);}printf("\n");return 0;
}void do_select_in(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name ,number from fruit_in;");printf("name   number\n");if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_in success\n");}
}void do_select_avg(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name, avg(price) from fruit_sell group by name;");printf("%s\n",sql);if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_sell success\n");}
}void do_select_stock_list(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name, price, time from fruit_stock;");printf("%s\n",sql);if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_stock success\n");}
}void do_select_sell_list(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name, price, time from fruit_sell;");printf("%s\n",sql);if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_in is avg success\n");}
}

嵌入式数据库--sqlite相关推荐

  1. 嵌入式数据库SQLite的编译、安装和使用[ZT]

    嵌入式数据库SQLite的编译.安装和使用 下文介绍的内容都是基于 RedHat Linux 9.0 平台的. 引言:sqlite简介 sqlite是嵌入式SQL数据库引擎SQLite(SQLite ...

  2. 【嵌入式实验】《嵌入式数据库 sqlite 移植及使用》

    嵌入式数据库 sqlite 移植及使用 一.实验目的 二.实验内容 三.预备知识 四.实验设备及工具(包括软件调试工具) 五.实验步骤 实验一:移植嵌入式数据库 sqlite 1~5:安装 sqlit ...

  3. 嵌入式数据库Sqlite移植教程-转

    嵌入式数据库Sqlite移植教程 sqlite-3.3.6编译安装与交叉编译全过程详细记录 本文介绍的内容都是基于 Linux RedHat 9.0 平台的. 一.PC机编译安装 请阅读在安装包里的 ...

  4. android 内嵌 数据库,安卓开发之嵌入式数据库sqlite的操作方法

    安卓App开发经常会需要嵌入式数据库sqlite的辅助,它可以存放我们必要的应用数据,下面介绍下如何使用java连接读取sqlite中的数据. 本文中的代码经本人测试可用,可以参考. 代码如下: DB ...

  5. 南京邮电大学嵌入式系统开发实验3:嵌入式数据库sqlite移植及使用

    实验3  嵌入式数据库sqlite移植及使用 一.实验目的 理解嵌入式软件移植的基本方法,掌握sqlite数据库软件移植的步骤,掌握sqlite开发的两种方式-命令模式和C代码开发模式的使用方法,并编 ...

  6. Sqlite 移动嵌入式数据库Sqlite的日常SQL操作语句汇总

    序言:     嵌入式数据库Sqlite的基本sql使用汇总,使用测试起来,与关系型数据库mysql在语法上有很多的相似之处,先准备测试数据: CREATE TABLE COMPANY(ID INT ...

  7. Linux网络编程小项目sqlite,嵌入式数据库sqlite

    *************************************** * 嵌入式数据库sqlite在LPC22XX上的应用 * ******************************* ...

  8. 嵌入式数据库SQLite与Java

    嵌入式数据库SQLite与Java SQLite作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机.PDA.机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运 ...

  9. Java与嵌入式数据库SQLite的结合

    为什么80%的码农都做不了架构师?>>>    最近研究了一下嵌入式数据库,并使用Java与一个叫做SQLite的轻量级数据库结合写了个小程序,这个过程中也获得了不少经验,下面来总结 ...

  10. 嵌入式数据库 SQLite 浅析

    SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS,它可移植性好,很容易使用,很小,高效而且可靠.SQLite嵌入到使用它的应用程序中,它们共 ...

最新文章

  1. 如何避免云整合的问题
  2. asp.net 微信企业号办公系统-流程设计--保存与发布
  3. 微软开源的Trill是什么?
  4. 21个深度学习调参的实用技巧
  5. 英特尔的务实创新之路:实在做技术,赋能开发者 | InfoQ推荐
  6. SpringCloud 基于OAth2.0 搭建认证授权中心_02
  7. oracle数据库常用操作语句
  8. 成都大数据等新经济代表行业在全国城市位居前列
  9. 教你一招解决#65279导致页面莫名其妙空行
  10. .Net中数据绑定控件应用小技巧
  11. android状态栏自定义,如何自定义Android状态栏颜色
  12. C#建立手机号段全库
  13. 生成条码 -- jsbarcode
  14. leetcode刷题(第739题)——每日温度
  15. 量子计算深化:大规模量子计算(相关论文108篇推荐)
  16. 爱因斯坦五五问题(zebra问题)斑马问题
  17. vii php,VIIShop php网上商店系统
  18. 华大单片机HC32F005串口烧录程序
  19. Java 编程中,有哪些好的习惯应该从一开始就值得坚持?
  20. gis利器之Gdal(一)

热门文章

  1. oracle手动 建库_ORACLE 手动建库
  2. 一些JavaScript特性
  3. Freeswitch显示变量与通道变量对应表
  4. java类加载 静态变量和构造方法加载顺序
  5. 资源任你选,这几个网站你值得收藏
  6. 区块链快速入门(四)——BFT(拜占庭容错)共识算法
  7. 小而美的Nginx日志分析利器GoAccess
  8. 2022-2023山东大学软件学院计算机网络期末试题回忆及复习建议
  9. 数字图像处理(冈萨雷斯版)学习笔记(3)第3,6章
  10. 【html】html常见标签的居中问题