数据库SQLite基础

SQLite的存储结构 --->B树
大型数据库 :Oracle

中型数据库 :Server是微软开发的数据库产品,主要支持windows平台

小型数据库 : MySQL是一个小型关系型数据库管理系统。开放源码 (嵌入式不需要存储太多数据)

一、SQLite基础

SQLite的源代码是C,其源代码完全开放。它是一个轻量级的嵌入式数据库。

SQLite有以下特性:

零配置一无需安装和管理配置;

储存在单一磁盘文件中的一个完整的数据库;

数据库文件可以在不同字节顺序的机器间自由共享;

支持数据库大小至2TB(1024G = 1TB);//嵌入式足够

足够小,全部源码大致3万行c代码,250KB;

比目前流行的大多数数据库对数据的操作要快;
操作方式:

手动:

使用sqlite3工具,手工输入命令

命令行输入

代码:

利用代码编程,调用接口

二、使用命令

【腾讯文档】副本-SQL基础语句基本使用 https://docs.qq.com/doc/DZXlIRkZRUlJadVN5

三、 sqlile3编程

官方文档:List Of SQLite Functions
中本版:SQLite Insert 语句 - SQLite 中文版 - UDN开源文档

注意:

头文件:#include <sqlite3.h>

编译:gcc xxx.c -lsqlite3

1、函数接口:

(1)打开数据库 sqlite3_open()

cpp 复制代码
int sqlite3_open(char  *path, sqlite3 **db);
功能:打开sqlite数据库,如果数据库不存在则创建它
参数:path: 数据库文件路径
     db: 指向sqlite句柄的指针
返回值:成功返回SQLITE_OK(0),失败返回错误码(非零值)

(2)返回错误信息sqlite3_errmsg()

cpp 复制代码
char  *sqlite3_errmsg(sqlite3 *db);
功能:  获取错误信息
返回值:返回错误信息

使用: fprintf(stderr,"sqlite3_open failed %s\n",sqlite3_errmsg(db));

(3)关闭数据库sqlite3_close()

cpp 复制代码
int sqlite3_close(sqlite3 *db);
功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码

(4)执行sql操作 sqlite3_exec()

cpp 复制代码
int sqlite3_exec(
  sqlite3 *db,                   /* An open database */
  const char *sql,               /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *arg,                      /* 1st argument to callback */
  char **errmsg                /* Error msg written here */
);

功能:执行SQL操作
参数:db:数据库句柄
    sql:要执行SQL语句
    callback:回调函数(满足一次条件,调用一次函数,用于查询)
        再调用查询sql语句的时候使用回调函数打印查询到的数据
    arg:传递给回调函数的参数
    errmsg:错误信息指针的地址
返回值:成功返回SQLITE_OK,失败返回错误码

(5)专用于查询sqlite3_get_table()

cpp 复制代码
不使用回调函数执行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:满足条件的记录的数目(但是不包含字段名(表头 id name score))
    ncolumn:每条记录包含的字段数目
    errmsg:错误信息指针的地址
返回值:成功返回SQLITE_OK,失败返回错误码

2、示例

cpp 复制代码
#include <sqlite3.h>
#include <stdio.h>

//每次查询到一条符合条件的数据,就使用一次回调函数
int callback(void*buf,int num,char** value,char** name)
{
    static int a=1;
    printf("-----\n");
    printf("%d :%s\n",a++,(char *)buf);
    for (int i = 0; i < num; i++)
    {
  
        printf("%s ",name[i]);

    }
    putchar(10);
    for (int i = 0; i < num; i++)
    {
        printf("%s ",value[i]);
    }
     putchar(10);
    return 0;//必须返回0,否则报错
}


int main(int argc, char const *argv[])
{
    // 创建和打开数据库
    sqlite3 *db;
    if (sqlite3_open("stu.db", &db) != SQLITE_OK)
    {
        fprintf(stderr, "open err:%s\n", sqlite3_errmsg(db));
        return -1;
    }
    else
    {
        printf("打开数据库成功\n");
    }
    // 创建表
    char *errmsg;

    if (sqlite3_exec(db, "create table if not exists stu (id int,name string,score float)", NULL, NULL, &errmsg)!=SQLITE_OK)
    {
        fprintf(stderr, "create table err:%s\n", errmsg);
        return -1;
    }
    else
    {
        printf("打开表成功\n");
    }
    // 操作表

    // 插入
    int num = 0;
    printf("学生人数\n");
    scanf("%d", &num);
    char sql[64] = "";
    int id;
    char name[10];
    float score;
    printf("id    name    score\n");
    for (int i = 0; i < num; i++)
    {
        scanf("%d %s %f",&id,name,&score);
        sprintf(sql, "insert into stu values(%d,'%s',%f)", id, name, score);

        if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)!=SQLITE_OK)
        {
            fprintf(stderr, "insert err:%s\n", errmsg);
            return -1;
        }
        else
        {
            printf("插入成功\n");
        }
    }

    //查找数据

    if (sqlite3_exec(db, "select * from stu", callback, "hi", &errmsg)!=SQLITE_OK)
        {
            fprintf(stderr, "insert err:%s\n", errmsg);
            return -1;
        }
        else
        {
            printf("插入成功\n");
        }



    //专门用于查询的函数
    char **result=NULL; //用于存储查询到的结果
    int row,column;//记录行数和列数
    sqlite3_get_table(db,"select * from stu",&result,&row,&column,&errmsg);
    printf("row:%d column:%d\n",row,column);
    int k=0;
    //当能查询到结果时,表头也会算一行(真正要打印的行数要比row值大1)
    //当查询不到结果时连表头都不会打印
    for (int i = 0; i <= row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            printf("%s ",result[k++]);//遍历时result看做二维数组,但访问时result看做一维数组
        }
        putchar(10);
    }


    // 关闭数据库
    sqlite3_close(db);

    return 0;
}
相关推荐
陈丹阳(滁州学院)11 分钟前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle
远方16091 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
GUIQU.2 小时前
【Oracle】数据仓库
数据库·oracle
恰薯条的屑海鸥3 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖3 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
曼汐 .3 小时前
数据库管理与高可用-MySQL高可用
数据库·mysql
2301_793102493 小时前
Linux——MySql数据库
linux·数据库
喵叔哟3 小时前
第4章:Cypher查询语言基础
数据库
刘 大 望3 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql
从零开始学习人工智能4 小时前
Doris 数据库深度解析:架构、原理与实战应用
数据库·架构