sqlite3数据库


SQLite数据库

SQLite数据库特点

SQLite是一种用ANSI-C编写的嵌入书关系数据库管理系统

SQLite是基于文件的,它与其他SQL数据库不同,因为与大多数其他SQL数据库不同,SQLite没有单独的服务器进程

SQLite支持SQL的很多特性,性能高,不支持存储过程,而SQL是一种查询语言,被不同的SQL数据库使用,它本身不是数据库

SQLite最初设计于2000年8月。最初命名为SQLite,是因为它于SQL Server或Oracle等其他数据库管理系统不同,非常小(小于500Kb大小)

  • SQLite是完全免费的:SQLite是开源的,不需要许可证
  • SQLite是无服务器的:SQLite不需要不同的服务器或系统来运行
  • SQLite非常灵活:可以在一个会话中同时处理多个数据库,SQLite不需要配置,无需设置或管理
  • SQLite是一个跨平台的DBMS:不需要Windows、Mac OS、Linux和Unix这样的大量不同平台。它可以用于许多嵌入书操作系统
  • 存储数据:SQLite提供了一种高效的数据存储方式
  • 列的可变长度:列的长度是可变的
  • 提供大量API:SQLite为大量编程语言提供API

SQLite优势

  • 轻量级:轻量级数据库
  • 更好的性能:读写操作非常快
  • 无需安装:不需要安装和配置
  • 可靠:不断更新内容,在断电或崩溃的情况下几乎不会丢失任何工作
  • 便携式:可以在32位和64位操作系统以及大端和小端架构中移植
  • 无障碍:SQLite数据库可通过各种第三方工具访问
  • 降低成本和复杂性:降低了应用程序成本

SQLite的缺点:用于处理中低流量的HTTP请求,大多数情况下,数据库大小限制在2GB

SQLite命令三种类型

  • DDL:数据定义语言create、alter、drop
  • DML:数据操作语言insert、updata、delete
  • DQL:数据查询语言select
  • SQLite点命令

SQLite语法

  • 区分大小写:不区分大小写,但是有些命令区分大小写;例如GLOB和glob在SQLite中具有不一样的含义
  • 注释:不能嵌套,以两个连续的“-”字符开头

SQLite数据类型

  • integer:带符号的整型(最多64位)
  • decimal(p,s):p精确值和s大小的十进位整数,p是多少个数字,s表示小数有多少个
  • float:32位实数
  • double:64位实数
  • char(n):n长度的字符串,n不能超过254
  • varchar(n):长度不固定且最大长度为n的字符串,n不能超过4000
  • date:包含年份、月份、日期 (2019-09-09)
  • time:包含小时、分钟、秒
  • real:8字节表示的浮点类型
  • text:字符类型,支持多种编码(如UTF-8、UTF-16),大小无限制
  • blob:任意类型的数据,大小无限制。BLOB二进制大对象,使用二进制保存数据
  • null:表示空值

SQLite3安装

# 只下载包但是不安装,其中不包含API接口
apt-get download sqlite3 
# 下载并安装
apt-get install sqlite3
# 进入sqlite3,这样进入写的数据是在内存中,退出后数据就会消失
sqlite3
# 进入sqlite3,并保存在哪个位置
sqlite3 student
# 退出sqlite3
.exit
# 查看表
.table
# 设置查询的间隙
.mode column
# 设置查询的表头
.header on
# 创建表
create table student (id integer,name text,age integer);
# 如果不存在就创建表否则不创建
create table if not exists student (id integer,name text,age integer);
# 查看表结构
.schema
# 插入数据
insert into student (id,name,age) values(1,"aa",11);
insert into student values(2,"bb",22),(3,"cc",33);
# 查询数据
select * from student;
# 修改数据
update student set age=25 where id=3;
# 删除数据
delete from student where id=1;
# 删除表
drop table student
# 创建会自增列
create table marketCommodity (商品编号 integer primary key autoincrement,商品名称 text);

SQLite的API

C语言API接口函数

# 安装头文件
apt-get install libsqlite3-dev
// filename: 数据库的名字,如果不存在则创建
// ppDb:返回数据库句柄
// 返回值:返回SQLITE_OK表示成功
int sqlite3_open(const char *filename,sqlite3 **ppDb);

// ppDb:表示数据库的句柄
// 返回值:返回错误描述字符串
const char *sqlite3_errmsg(sqlite3* ppDb);    

// 万能函数处理指令
int sqlite3_exec(
    sqlite3*,		/*数据库句柄*/					
    const char *sql, /*将要执行的指令的字符串*/
    int (*callback)(void *,int,char **,char **), /*回调函数,如果执行的指令的结果需要处理,就需要用回调函数处理,创建表就不需要回调函数*/
	void *, /*回调函数的第一个参数*/
	char **errmsg /*保存错误信息*/
);

int sqlite3_get_table(
    sqlite3 *db,	/*数据库句柄*/
    const char *zSql,  /*查询语句*/
    char ***pazResult,  /*保存结果的指针*/
    int *pnRow,        /*行数*/
    int *pnColumn,      /*列数*/
    char **pzErrmsg     /*保存错误信息*/
);

pazResult存放结构

image-20210618104412006

#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>

int print(void *arg,int column,char **value,char **name)
{
	for(int i=0;i<column;i++){
		printf("%s=%s ",name[i],value[i]);
	}
	printf("\n");
	return 0;
}
int main()
{

	int ret=0;
	char commod[128];
	sqlite3 *ppdb;
    //打开数据库,如果不存在则创建
    ret=sqlite3_open("student.db",&ppdb);
	if(ret!=SQLITE_OK){
		fprintf(stderr,"sqlite3_open error:%s",sqlite3_errmsg(ppdb));
		exit(1);
	}
	//创建表,如果存在则不执行
	memset(commod,0,sizeof(commod));
	sprintf(commod,"create table if not exists student (id integer,name text,age integer);");
	ret=sqlite3_exec(ppdb,commod,NULL,NULL,NULL);
	if(ret!=SQLITE_OK){
		fprintf(stderr,"sqlite3_exec error:%s",sqlite3_errmsg(ppdb));
		exit(1);
	}

    //插入数据
	int age,id;
	char name[64]={0};
	for(int i=0;i<2;i++){
		printf("请输入学号 姓名 年龄:\n");
		scanf("%d%s%d",&id,name,&age);
		memset(commod,0,sizeof(commod));
		sprintf(commod,"insert into student values(%d,'%s',%d);",id,name,age);
		ret=sqlite3_exec(ppdb,commod,NULL,NULL,NULL);
		if(ret!=SQLITE_OK){
			fprintf(stderr,"sqlite3_exec error:%s",sqlite3_errmsg(ppdb));
			exit(1);
		}
	}

    //查询数据
	memset(commod,0,sizeof(commod));
	sprintf(commod,"select * from student");
	ret=sqlite3_exec(ppdb,commod,print,NULL,NULL);
	if(ret!=SQLITE_OK){
		fprintf(stderr,"sqlite3_exec error:%s",sqlite3_errmsg(ppdb));
		exit(1);
	}

    //查询数据
	char **pazresult;
	int row;
	int column;
	memset(commod,0,sizeof(commod));
	sprintf(commod,"select * from student");
	ret=sqlite3_get_table(ppdb,commod,&pazresult,&row,&column,NULL);
	if(ret!=SQLITE_OK){
		fprintf(stderr,"sqlite3_get_table error:%s",sqlite3_errmsg(ppdb));
		exit(1);
	}
	int index=column;
    // row不包含第一行,也就是说当row=50时就表示一共有50行数据
	for(int i=0;i<row;i++){
		for(int j=0;j<column;j++){
			printf("%s=%s ",pazresult[j],pazresult[index++]);
		}
		printf("\n");
	}
	return 0;
}

注意编译时要加上动态库,例如gcc -o build main.c -lsqlite3


文章作者: dyl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dyl !
 上一篇
MYSQL命令行 MYSQL命令行
本文章记录MYSQL的基本命令行操作,对于新手较友好,本文章来自于博主在各个网站搜索汇总,具有一定的参考价值
2023-12-10 dyl
下一篇 
Json-c API使用 Json-c API使用
该文总结了如何在Ubuntu下安装JSON-C库,介绍了几个JSON-C库中几个有用的API,对于新手来说比较友好,该视频来自博主看视频与网页总结
2023-12-10 dyl
  目录