一、数据库简介
概念
1.数据是能被计算机识别或处理的信息集合,不仅仅是01234,也包括文字等二进制信息。
2.数据库是在数据库管理系统(DBMS)的管理和控制下,存储在存储介质上的数据集合。
3.数据库管理系统是管理或操作数据库的大型软件。
分类
1.大型数据库如DB2,支持广泛的操作系统,具有网上功能和多媒体支持。
2.中型数据库如Microsoft SQL Server,主要支持Windows平台。
3.小型数据库如MySQL,开源且免费,广泛应用于网站后台存储数据。
嵌入式数据库特点
1.嵌入式数据库体积小、代码量小,能完成大型数据库的绝大多数功能。
2.与大型数据库相比,嵌入式数据库在数据类型检测等部分功能上可能有所限制。
3.嵌入式平台下的数据库安装要求资源较少,适合资源受限的环境。
SQLite数据库介绍
1.SQLite是一个轻量级的数据库,源码用C和C++编写,完全开放。
2.SQLite无需安装和管理配置,以文件形式存储在磁盘上,操作简单。
3.支持的数据大小可达2TB,适用于存储大量数据。
4.体积小,源码约三万行,编译后约250KB,资源占用少。
5.操作速度快,因其轻量级特性。
二、SQLite安装
在Linux上安装SQLite通常可以通过包管理器来完成。
1、以下是一些常见Linux发行版上安装SQLite的命令:
(1)在线安装:
sudo apt-get update
sudo apt-get install sqlite3
查看是否安装命令:sqlite3
(2)本地安装:
下载 .deb包
sudo dpkg -i *.deb
2、安装库+头文件,用代码操作数据库必须安装,否则调用头文件<sqlite3.h>可能会出错:
sudo apt-get install libsqlite3-dev
三、SQLite3基本命令
数据库创建
命令:sqlite3 + 数据库名.db
例:创建一个teacher数据库
1、系统命令
以“ . ”开头的命令
.help 帮助
.quit 退出
.exit 退出
.schema 查看表的结构
.databases 查看当前数据库
.table 查看当前数据库下所有表格
2、sql命令
创建表
命令:create table + 表名 +(字段名 字段类型,字段名 字段类型……);
例:创建一张stu表包括学号、姓名、分数字段
表中插入整体数据
命令:insert into + 表名+ values(第一个字段值,第二个,第三个,……);
例:stu表插入一个学生的学号、姓名、分数值
表中插入部分数据
命令:insert into + 表名(字段,字段,……)+ values(对应字段值,第二个,……);
例:stu表插入一个学生的学号、姓名
查看表中内容
查看全部命令:select * from 表名;
查看部分命令:select 字段名,字段名,…… from 表名;
查看满足条件的命令:select * from 表名 where 条件 and/or 条件;
例:查看学生表中所有内容
例:查看学生表中所有分数在95分的全部学生
删除表中内容
命令:delete from 表名 where 条件;
例:删除stu表中id为1的内容
更新表中内容
命令:update 表名 set 更新内容,更新内容 where 更新条件
例:更新stu表中id为2的分数为80
增加新的字段
命令:alter table 表名 add colum 字段名 字段类型
例:stu表中添加地址(address)字段
删除字段
三个步骤
(1)创建一张新表
(2)删除原有表
(3)将新表重命名为旧表名
例:删除address字段
(1)参照stu表创建一张没有address的新表stux
(2)删除原有stu表
(3)将新表重命名为旧表名stu
四、SQLite编程接口
SQLite C/C++ 接口简介 | SQLite中文网 (readdevdocs.com)https://sqlite.readdevdocs.com/cintro.html
1、打开一个新的数据库连接
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:打开一个数据库
参数:filename:数据库路径名
ppDb:数据库操作句柄(指针)
返回值:成功 SQLITE_OK
失败 出错错误码
2、关闭数据库连接
int sqlite3_close(sqlite3* db);
功能:关闭一个数据库
参数:db:操作数据库的指针
返回值:成功 SQLITE_OK
失败 出错错误码
3、数据库错误信息
const char *sqlite3_errmsg(sqlite3 *db)
功能:通过db句柄,得到数据库操作的错误信息
返回值:错误信息的首地址
4、一步查询执行接口
int sqlite3_exec(
sqlite3* db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void* arg,int num,char** value,char** name), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
功能:执行一条sql语句
参数:db:数据库操作句柄
sql:一条sql语句
callback:回调函数,只有sql为查询语句的时候,才会执行此语句。
num:记录中包含的字段数目
value:包含每个字段值的指针数组
name:包含每个字段名称的指针数组
返回值:成功0,失败-1
arg:表示的是给回调函数传递参数
errmsg:错误消息
返回值:成功 SQLITE_OK
失败 出错错误码
5、运行查询的便捷例程
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
void sqlite3_free_table(char **result);
功能:执行sql操作
参数:db:数据库操作句柄
zsql:sql语句
pazResult:用来指向sql执行结果的指针
pnRow:满足条件记录的数目
pnColumn:每条记录包含的字段数目
pzErrmsg:错误信息的地址
返回值:成功 SQLITE_OK
失败 出错错误码
五、实例:学生成绩管理系统
插入操作
int do_insert(sqlite3 *db)
{
int id;
char name[32] ={};
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d",&id);
getchar();
printf("Input name:");
scanf("%s",name);
getchar();
printf("Input score:");
scanf("%d",&score);
getchar();
sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score);
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 stu 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;
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d",&id);
getchar();
printf("Update score:");
scanf("%d",&score);
getchar();
sprintf(sql,"update stu set score = %d where id = %d;",score,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* arg,int num,char** value,char** name)
{
int i=0;
for(i=0;i<num;i++)
{
printf("%-11s",value[i]);
}
putchar(10);
return 0;
}
//查询语句1
int do_query(sqlite3 *db)
{
char sql[128]={};
char *errmsg;
sprintf(sql,"select * from stu;");
if(sqlite3_exec(db,sql,callback,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("Query done.\n");
}
return 0;
}
查询操作方法二
int do_query2(sqlite3 *db)
{
char sql[128]={};
char *errmsg;
char **resultp;
int nrow;
int ncloumn;
int i,j;
int index;
sprintf(sql,"select * from stu;");
if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("Query2 done .\n");
}
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);
}
return 0;
}
整体代码实现
使用 gcc student.c -lsqlite3命令编译
使用.out 执行
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "teacher.db"
//插入操作
int do_insert(sqlite3 *db)
{
int id;
char name[32] ={};
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d",&id);
getchar();
printf("Input name:");
scanf("%s",name);
getchar();
printf("Input score:");
scanf("%d",&score);
getchar();
sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score);
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 stu 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;
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d",&id);
getchar();
printf("Update score:");
scanf("%d",&score);
getchar();
sprintf(sql,"update stu set score = %d where id = %d;",score,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* arg,int num,char** value,char** name)
{
int i=0;
for(i=0;i<num;i++)
{
printf("%-11s",value[i]);
}
putchar(10);
return 0;
}
//查询语句1
int do_query(sqlite3 *db)
{
char sql[128]={};
char *errmsg;
sprintf(sql,"select * from stu;");
if(sqlite3_exec(db,sql,callback,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("Query done.\n");
}
return 0;
}
//查询语句2
int do_query2(sqlite3 *db)
{
char sql[128]={};
char *errmsg;
char **resultp;
int nrow;
int ncloumn;
int i,j;
int index;
sprintf(sql,"select * from stu;");
if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("Query2 done .\n");
}
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);
}
return 0;
}
int main(int argc, const 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 stu (id Integer,name char,score Integer);",NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("%s\n",errmsg);
}
else
{
printf("create table or open success.\n");
}
while(1)
{
printf("*****************************************************************\n");
printf("1:insert \t2:delete \t3:query \t4:update \t5:quit \t\n");
printf("*****************************************************************\n");
printf("Input cmd:");
scanf("%d",&cmd);
switch(cmd)
{
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
do_query(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
defalut:
printf("Error cmd.\n");
}
printf("*********************************************\n");
}
return 0;
}