数据库技术sqlite3

一、数据库简介

概念

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)icon-default.png?t=N7T8https://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;
}

 

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值