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进行验证:

相关推荐
Alan3161 小时前
Qt 中,设置事件过滤器(Event Filter)的方式
java·开发语言·数据库
TDengine (老段)2 小时前
TDengine 集群容错与灾备
大数据·运维·数据库·oracle·时序数据库·tdengine·涛思数据
Lao A(zhou liang)的菜园2 小时前
高效DBA的日常运维主题沙龙
运维·数据库·dba
迪迦不喝可乐3 小时前
mysql知识点
数据库·mysql
不太可爱的大白3 小时前
MySQL 事务的 ACID 四大特性及其实现原理
数据库·mysql
观测云4 小时前
HikariCP 可观测性最佳实践
数据库
文牧之5 小时前
PostgreSQL的扩展 dblink
运维·数据库·postgresql
趁你还年轻_5 小时前
Redis-旁路缓存策略详解
数据库·redis·缓存
在云上(oncloudai)6 小时前
AWS DocumentDB vs MongoDB:数据库的技术抉择
数据库·mongodb·aws
夕泠爱吃糖6 小时前
MySQL范式和反范式
数据库·mysql