一、数据库基本概念
数据:能够输入计算机并能被计算机程序识别和处理的信息集合。
数据库:数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。
二、常用的数据库
1.大型数据库
Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。
2.中型数据库
Server是微软开发的数据库产品,主要支持windows平台。
3.小型数据库
mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。
三、基于嵌入式的数据库
基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB
Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
SQLite关系型数据库,体积小,支持ACID事务
Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中
eXtremeDB是内存数据库,运行效率高
四、SQLite基础
1.SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。
2.SQLite有以下特性:
(1)零配置一无需安装和管理配置;
(2)储存在单一磁盘文件中的一个完整的数据库;
(3)数据库文件可以在不同字节顺序的机器间自由共享;
(4)支持数据库大小至2TB;
(5)足够小,全部源码大致3万行c代码,250KB;
(6)比目前流行的大多数数据库对数据的操作要快;
五、创建数据库
1.手工创建
―使用SQLite3工具,通过手工输入SQL命令行完成数据库创建.
―用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具
2.代码创建
―在代码中常动态创建数据库
―在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库
3.数据库的安装
本地安装:sudo dpkg -i *.deb
在线安装:sudo qpt-get install-sqlite3
六、SQLite常用命令介绍
1.在终端下运行sqlite3 <*.db>,出现如下提示符
―SQLite version 3.7.2
―Enter “.help” for instructions
―Enter SQL statements terminated with a “;”
―sqlite>
<*.db> 是要打开的数据库文件。若该文件不存在,则自动创建
2.显示所有命令:sqlite> .help
3.退出sqlite3:sqlite>.quit
4.显示当前打开的数据库文件:sqlite>.database
5.显示数据库中所有表名:sqlite>.tables
6.查看表的结构:―sqlite>.schema <table_name>
/*******************************************/
7.以下为SQL命令,每个命令以;结束
(1)创建新表―sqlite>create table <table_name> (f1 type1, f2 type2,…);
create table stuinfo(id integer, name text, age integer, score float);//创建表格
(2)删除表―sqlite>drop table <table_name>
drop table stuinfo;
(3)查询表中所有记录―sqlite>select * from <table_name>;
select * from stu;//查询所有字段
(4)按指定条件查询表中记录―sqlite>select * from <table_name> where <expression>;
select * from stuinfo;//查询所有字段
select * from stuinfo where score = 80;
select * from stuinfo where score = 80 and name= 'zhangsan';
select * from stuinfo where score = 80 or name='wangwu';
select name,score from stuinfo; 查询指定的字段
select * from stuinfo where score >= 85 and score < 90;
(5)向表中添加新记录―sqlite>insert into <table_name> values (value1, value2,…);
insert into stuinfo values(1001, 'zhangsan', 18, 80);
insert into stuinfo (id, name, score) values(1002, 'lisi', 90);
(6)按指定条件删除表中记录―sqlite>delete from <table_name> where <expression>
delete from stuinfo where id=1003 and name='zhangsan';
(7)更新表中记录
―sqlite>update <table_name> set <f1=value1>, <f2=value2>… where <expression>;
update stuinfo set age=20 where id=1003;//设置一个字段的更新
update stuinfo set age=30, score = 82 where id=1003;//设置两个字段的更新
(8)在表中添加字段―sqlite>alter table <table> add column <field> <type> default …;
alter table stuinfo add column sex char;
(9)在表中删除字段(删除一列)
Sqlite中不允许删除字段,可以通过下面步骤达到同样的效果
sqlite> create table stu1 as select id, name, score from stu//创建一张新的表
sqlite> drop table stu//删除原有的表
sqlite> alter table stu1 rename to stu//讲新的表名字改成原有旧表的名字
数据库设置主键:
create table info(id integer primary key autoincrement, name vchar);
(10)创建带约束数据表
创建表格的时候设置字段约束
PRIMARY KEY主键,NOT NULL不能为NULL,UNIQUE唯一,DEFAULT默认值,ID INTEGER PRIMARY KEY AUTOINCREMENT id自动增长
以此表格为例:
(1)创建数据表
create table device (id integer primary key autoincrement,
name varchar(256) unique ,
status int not NULL default 0,
online int not NULL);
创建时加入条件(表不存在是创建)
create table if not exists device(id integer primary key autoincrement,
name varchar(256) unique,
status int default 0,
online int not NULL);
insert into stu(name, online) values('led6', 0);可以实现部分赋值,id值自增
七、SQLite编程接口
1. int sqlite3_open(char *path, sqlite3 **db);
―功能:打开sqlite数据库
―path:数据库文件路径、
―db:指向sqlite句柄的指针、
―返回值:成功返回0,失败返回错误码(非零值)
2. int sqlite3_close(sqlite3 *db);
―功能:关闭sqlite数据库
―返回值:成功返回0,失败返回错误码
3. const char *sqlite3_errmg(sqlite3 *db);
―返回值:返回错误信息
4. Typedef int (*sqlite3_callback)(void *, int,char **, char **);
5. Int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);、
―功能:执行SQL操作
―db:数据库句柄
―sql:SQL语句
―callback:回调函数
―errmsg:错误信息指针的地址
―返回值:成功返回0,失败返回错误码
6. typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
―功能:每找到一条记录自动执行一次回调函数
―para:传递给回调函数的参数
―f_num:记录中包含的字段数目
―f_value:包含每个字段值的指针数组
―f_name:包含每个字段名称的指针数组
―返回值:成功返回0,失败返回-1
7.不使用回调函数执行SQL语句
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
―功能:执行SQL操作
―db:数据库句柄
―sql:SQL语句
―resultp:用来指向sql执行结果的指针
―nrow:满足条件的记录的数目
―ncolumn:每条记录包含的字段数目
―errmsg:错误信息指针的地址、
―返回值:成功返回0,失败返回错误码
8.void sqlite3_free_table(char **result);//查询文章来源:https://www.toymoban.com/news/detail-497835.html
任务:假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了,
好久需要再次进货,那些水果畅销,那些水果不畅销,那些水果春夏秋冬的价格波动,好,那么现在我想将
这些信息保存在数据库中,那么我应该怎么做;
提示: 建立一张fruit表,
假如水果有: 苹果,香蕉,梨,橘子,葡萄....(可以自己查一下英文保存到数据库)
水果价格: 苹果 5元/斤 香蕉 3元/斤 梨 3.5元/斤 橘子2.5元/斤 葡萄 8元/斤....
当前存货: 苹果 80斤 香蕉 200斤 梨 50斤 橘子300斤 葡萄 100斤....
超市每天水果都有进货和卖出嘛,水果的价格随着季节和天气也会有波动,顾客也会看一下每天水果的价格的嘛,
所以要求,根据上述提示,利用数据库完成水果店各种水果的增(进货)删(卖出)改(波动)查(看价格)功能。
并将进出货的时间和顾客光顾的时间记录到数据库中保存。文章来源地址https://www.toymoban.com/news/detail-497835.html
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "fruit.db"
int do_insert(sqlite3 * db){
int id;
char name[32] = {};
float price;
float stock;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
printf("Integer name:");
scanf("%s",name);
getchar();
printf("Input price:");
scanf("%f", &price);
getchar();
printf("Input stock:");
scanf("%f", &stock);
getchar();
sprintf(sql,"insert into fruit values(%d, '%s', %.1f, %.1f);", id, name, price, stock);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("Insert done.\n");
}
return 0;
}
int do_delete(sqlite3 * db){
int id;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
sprintf(sql,"delete from fruit where id=%d", id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("Delete done.\n");
}
return 0;
}
int do_update(sqlite3 * db){
int id;
char sql[128] = {};
float price;
float stock;
char *errmsg;
printf("Input price:");
scanf("%f", &price);
getchar();
printf("Input stock:");
scanf("%f", &stock);
getchar();
printf("Input id:");
scanf("%d", &id);
getchar();
sprintf(sql,"update fruit set price = %.1f,stock = %.1f where id = %d",price, stock, id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("update done.\n");
}
return 0;
}
int callback(void *para, int f_num, char **f_value, char **f_name){
int i = 0;
for(i = 0; i < f_num; i++){
printf("%-11s ", f_value[i]);
}
putchar(10);
return 0;
}
int do_query(sqlite3 * db){//查询
char sql[128] = {};
char *errmsg;
sprintf(sql,"select * from fruit;");
if(sqlite3_exec(db, sql, callback, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("query done.\n");
}
}
int do_query1(sqlite3 * db){//查询
char sql[128] = {};
char *errmsg;
char **resultp;
int nrow;
int index;
int ncloumn;
int ret;
int i,j;
sprintf(sql,"select * from fruit;");
ret = sqlite3_get_table(db, sql, &resultp, &nrow,&ncloumn, &errmsg);
for(j = 0; j<ncloumn; j++){
printf("%-11s ", resultp[j]);
}
putchar(10);
index = ncloumn;
for(i = 0;i < nrow; i++){
for(j = 0; j<ncloumn; j++){
printf("%-11s ", resultp[index++]);
}
putchar(10);
}
if(ret != SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("Query done.\n");
}
return 0;
}
int main(int argc, char argv[]){
sqlite3 *db;
char *errmsg;
int cmd;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
printf("%s\n", sqlite3_errmsg(db));
return -1;
}else{
printf("Open DATABASE success.\n");
}
//创建一张数据库表格
if(sqlite3_exec(db, "create table fruit (id Integer , name char , price Integer, stock Integer);", NULL , NULL , &errmsg) != SQLITE_OK ){
printf("%s\n", errmsg);
}else{
printf("creat table or success.\n");
}
while(1){
printf("*******************************************************\n");
printf("1:insert 2:delete 3:query 4:update 5:quit.\n");
printf("*******************************************************\n");
printf("Input cmd:");
scanf("%d", &cmd);
getchar();
switch (cmd){
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
//do_query(db);
do_query1(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
defalut:
printf("Error cmd.\n");
}
}
return 0;
}
到了这里,关于嵌入式数据库之sqlite3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!