SQlite数据库

介绍

基本信息: 是一款轻量级的嵌入式关系型数据库管理系统。
主要特点: SQLite的源码是C语言,其源代码完全开发,SQLite第一个Alpha版本诞生于2000年5月,他是一个轻量级的嵌入式数据库。零配置,无需安装和配置服务器;单文件存储,数据库以单个文件形式存在;支持多种平台;支持事务,具备 ACID 特性;自包含,不依赖外部库;轻量级,代码量小,内存占用低。
**应用场景:**广泛应用于移动应用开发(如 iOS 和 Android 系统)、嵌入式设备、桌面应用的本地数据存储以及小型 Web 应用等场景。

安装数据库

在线安装

复制代码
sudo apt-get install sqlite3

本地安装
官网下载sqlite3,然后本地安装:sudo dpkg -i *.deb

SQlite3 基本命令

1.系统命令

|-------------------|----------------------------------------------------|
| .help | 显示所有系统命令的帮助信息。 |
| .quit.exit | 退出 SQLite 命令行。 |
| .schema [表名] | 查看表结构(显示 CREATE TABLE 语句),省略表名则显示所有表的结构。 |
| .databases | 显示当前打开的所有数据库及其文件路径。 |
| .tables [模式] | 列出所有表名(可使用通配符,如 .tables user*)。 |
| .headers on/off | 显示 / 隐藏查询结果的列名(表头)。 |
| .mode 模式 | 设置输出格式,常用模式:csvcolumninsertlinelist。 |
| .output 文件名 | 将输出重定向到文件(.output stdout 恢复到屏幕)。 |
| .read 文件名 | 执行 SQL 文件中的命令。 |
| .dump [表名] | 导出数据库(或指定表)为 SQL 脚本(用于备份)。 |
| .timer on/off | 显示 / 隐藏查询执行时间统计。 |

2.sql命令
创建一张数据库的表 stu

复制代码
create table stu(id Integer,name char,score Integer);

插入一张记录

复制代码
insert into stu values(1001,'zhangsan',80);

插入部分字段记录

复制代码
insert into stu(name,score) values(1002,'lisi');

查询所有记录

复制代码
select *from stu;

查询数据库部分内容字段

复制代码
select name,score from stu;

根据属性查询

复制代码
select * from stu where score=80;
select *from stu where score=80 and name='zhangsan';

删除一条记录

复制代码
delede from stu where id=1003;
delete from stu where socre='90';

更新一条记录

复制代码
update stu set name='wangwu' where id=1001;
update stu set name='wangwu',score=88 where id = 1001;

添加一列

复制代码
alter table stu add column address char;

删除一列:

  1. 创建一张表
    提取字段

    create table stu1 as select id,name,score from stu;

2.删除原有表

复制代码
drop table stu;

3.将新的表的名字改成原有的表名字

复制代码
alter table stu1 rename to stu;

SQlite相关API操作

1.打开sqlite数据库

复制代码
int sqlite3_open(char *filename,sqlite3 **db)

/*参数:
filename:数据库文件路径
db:指向sqlite句柄的指针
返回值:
成功返回0,失败返回错误码(非0值)*/

2.关闭sqlite数据库

复制代码
int sqlite3_close(sqlite3 *db);

/*参数:
db 操作数据库的指针
返回值:
成功返回0,失败返回错误码*/

3.通过db句柄得到数据库操作的错误信息

复制代码
const char *sqlite3_errmsg(sqlite3 *db);

/*参数:
db 操作数据库的指针
返回值:
返回错误信息的首地址*/

4.执行一条sql语句

复制代码
int sqlite3_exec(
sqlite3*db,
const char *sql,
int (*callback)(void *,int,char**,char *8)
void *,
char **errmsg);

/*参数
db:数据库操作句柄
sql:一条sql语句
callback:回调函数,只有sql为查询语句的时候,才会执行此语句
void * :给回调函数传递参数
errmsg:错误信息
返回值:
成功:SQLITE_OK*/


//回调函数原型
typedef int (*sqlite3_callback)(
    void *data,         // 由 sqlite3_exec() 的第4个参数传递的数据
    int argc,           // 结果集中的列数
    char **argv,        // 指向结果数据的指针数组(字符串)
    char **azColName    // 指向列名的指针数组
);

/*返回值
返回 0 表示继续处理后续行。
返回非零值会中断查询并使 sqlite3_exec() 返回 SQLITE_ABORT*/

5.不使用回调函数执行SQL语句

复制代码
int sqlite3_get_table(
sqlite3 *db,
const char *sql,
char ***resultp,
int *nrow,
int *ncolumu,
 char **errmsg)

/*参数:
db:数据库句柄
sql:sql语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码*/

用API实现对数据库的增删改查:

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

#define DATABASE "student.db"
int do_insert(sqlite3 *db)
{
        int id;
        int score;
        char name[32]={};
        char sql[128] = {};
        char *errmsg;
        printf("please input id:\n");
        scanf("%d",&id);
        getchar();

        printf("please input name:\n");
        scanf("%s",name);
        getchar();

        printf("please input score:\n");
        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);
                exit(1);
        }
        else
        {
                printf("insert success!\n");
        }
        return 0;
}

int do_delete(sqlite3 *db)
{
        int id;
        char sql[128] = {0};
        char *errmsg;
        printf("please 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);
                exit(1);
        }
        else
        {
                printf("delete success!\n");
        }
        return 0;
}
int do_update(sqlite3 *db)
{
        int id;
        char sql[128] = {};
        int score;
        char *errmsg;
        printf("please input id:");
        scanf("%d",&id);
        getchar();

        printf("please input 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);
                exit(1);
        }
        else
        {
                printf("update success!\n");
        }
}
int callback(void *para,int f_num,char **f_value,char **f_name)
{
        int i = 0;
        for(i=0;i<f_num;i++)
        {
                printf("%s",f_value[i]);
        }
        putchar(10);
        return 0;
}
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);
                exit(1);
        }
        else
        {
                printf("query success!\n");
        }
        return 0;

}
int do_query2(sqlite3 *db)
{
        char sql[128] = {};
        char *errmsg;
        char **resultp;
        int nrow;
        int ncloumn;
        int i,j,index;
        sprintf(sql,"select * from stu");
        if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg) != SQLITE_OK)
        {
                printf("%s",errmsg);
        }
        else
        {
                printf("query success!\n");
        }
        index = ncloumn;
        for(j=0;j<ncloumn;j++)
        {
           printf("%-11s",resultp[j]);
        }
        putchar(10);
        for(i=0;i<nrow;i++)
        {
                for(j=0;j<ncloumn;j++)
                {
                   printf("%-11s",resultp[index++]);
                }
                putchar(10);
        }
        return 0;
}
int main()
{
        sqlite3 *db;
        int cmd;
        char *errmsg;
        if(sqlite3_open(DATABASE,&db) != SQLITE_OK)
        {
                printf("%s\n" ,sqlite3_errmsg(db));
                exit(1);
        }
        else
        {
                printf("open sqlite success!\n");
        }
        if( sqlite3_exec(db,"create table stu(id Integer,name char,score Integer)",NULL,NULL,&errmsg) != SQLITE_OK)
        {

                printf("%s\n",sqlite3_errmsg(db));
                exit(1);
        }
        else
        {
                printf("create or open table success!\n");
        }
        while(1)
        {
                printf("********************\n");
                printf("1:insert,2:delete3:quert,4:update,5:quit\n");
                printf("********************\n");
                printf("please input cmd!\n");
                scanf("%d",&cmd);
                getchar();
                //识别指令进行对应处理(增删改查)
                switch(cmd)
                {
                        case 1:
                                do_insert(db);
                                break;
                        case 2:
                                do_delete(db);
                                break;
                        case 3:
                                do_query2(db);
                                break;
                        case 4:
                                do_update(db);
                                break;
                        case 5:
                                sqlite3_close(db);
                                exit(1);
                                break;
                        default:
                                printf("err cmd\n");
                }
        }

        return 0;
}

实现结果:

对数据库表stu进行增删改查:

用系统指令查看数据库表stu进行验证:

相关推荐
烧瓶里的西瓜皮14 分钟前
Go语言从零构建SQL数据库(9)-数据库优化器的双剑客
数据库·sql·golang
地理探险家1 小时前
各类有关NBA数据统计数据集大合集
数据库·数据集·数据·nba·赛季
SelectDB技术团队2 小时前
顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
大数据·数据库·数据仓库·信息可视化·数据分析·doris·实时分析
wangbaowo3 小时前
MySQL数据库下篇
数据库·经验分享·笔记·学习·mysql·安全
ABdolphin3 小时前
Spring-博客系统项目
数据库·sql·spring
伤不起bb3 小时前
MySQl 数据库操作
数据库·mysql
是店小二呀3 小时前
【金仓数据库征文】金仓数据库(KingbaseES)迁移与集群部署实战:从MySQL到KES的全流程解析
数据库·mysql·金仓数据库 2025 征文·数据库平替用金仓
一只专注api接口开发的技术猿4 小时前
1688 API 自动化采集实践:商品详情实时数据接口开发与优化
大数据·运维·数据库·自动化
昔我往昔4 小时前
MySQL中为什么使用B+树结构、B+树和普通的平衡树的区别
数据库·b树·mysql
翁正存4 小时前
MySQL为什么选择B+树
数据库·b树·mysql