SQLite笔记-基本命令-c语言的使用

一、数据库介绍

1、数据库的基本概念

数据

能够输入计算机并能被计算机程序识别和处理的信息集合

数据库

数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

2、常用的数据库

1)大型数据库

1)oracle公司是最早开发数据库的厂商之一,目前oracle关系数据卡产品的市场占有率名列前茅。
2)IBM的DB2是第一个具备上网功能的多媒体关系数据库管理系统,支持linux在内的一系列平台

2)中型数据库

server是微软开发的数据库,主要支持windows

3)小型数据库

mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun收购,开放源码。后面Sun被oracle收购

3、基于嵌入式的数据库

1)基于嵌入式linux的数据库有SQLite,Firebird,BerkeleyDB,eXtremeDB
2)Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容
3)SQLite关系型数据库,体积小,支持ACID事务。(不支持严格的数据类型检测)
4)BerkeleyDB没有数据库服务器概念,它的程序直接连接到应用程序中
5)eXtremeDB是内存数据库,运行效率高

4、SQLite基础

SQLite的源代码是c,其源代码完全开放,SQLite第一个Alpha版本诞生于2005年5月,他是一个轻量级的嵌入式数据库。

SQLite以下特性

-零配置-无需安装和管理配置
-储存在单一的磁盘文件中的一个完整的数据库
-数据库文件可以在不同字节顺序的机器间自由共享
-支持数据库大小至2TB
-足够小,全部源码大致3w的c代码,250kb
-比目前流行的大多数数据库的操作要快

二、SQLite的安装

1.在线安装
sudo apt-get install sqlite3

2.SQLite的基本命令

sqlite3 student.db 创建一个学生数据库

3.系统命令

以.开头的命令为系统命令
.help 帮助
.quit 退出
.exit 退出
.schema 查看表的结构图
.databases 查看打开的数据库
.table 查看表格

4.sql命令

1)基本的sql命令,不以.开头,以;结尾
2)创建一张数据库表stu
create table stu(id Integer , name char , score Integer);
3)插入一条记录
insert into stu values(1001,'zhangsan',80); //所有字段都有插入
insert into stu (name, score)values(1003,"wangwu"); //部分字段插入操作
4)查询记录
select * from stu; //查询所有字段
select name,score from stu; //查询部分字段
select * from stu where score=80 and id =1001; //按条件查询 and
select * from stu where score=80 or id =1001; //按条件查询 or
5)删除记录
delete from stu where name='lisi';
6)更新一条记录
update stu set name='wangwu' where id=1001;
update stu set name='wangwu',score=88 where id=1001;
7)更改表格插入一列
alter table stu add column address char; //添加一列地址
8)删除一列
sqlite3不支持,直接删除一列
1–创建一张新的表
create table stu1 as select id,name,score from stu;
2–删除原有的表
drop table stu;
3–将新表名字改为原来的名字
alter table stu1 rename to stu;

三、c语言操作SQLite3数据库

1.SQLite3编程接口

在这里插入图片描述

1)打开sqlite数据库

int sqlite3_open(char *path, sqlite3 **db)
-path:数据库文件路径
-db:指向sqlite句柄的指针(指针)
-返回值,成功为0,失败为错误码
-返回值:成功 SQLITE_OK

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

2)关闭sqlite数据库

int sqlite3_close(sqlite *db)
-返回值,成功为0,失败为错误码
-返回值:成功 SQLITE_OK

3)错误信息

const char *sqlite3_errmsg(sqlite3 *db)
-返回值:返回错误信息的首地址

4)执行一条sql语句

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

功能:执行一条sql语句
参数:
-db 数据库句柄
-sql 一条sql语句
-callback 回调函数,只有sql为查询语句时候,才会执行此句
-arg 表示给回调函数传参数
-errmsg 错误消息
返回值:
-成功 SQLITE_OK

回调函数的查询

int (*callback)(void*,int,char**,char**), /* Callback function */
功能:查询的结果是一个函数指针,传函数名
-功能:每找到一条记录自动执行一次回调函数
-para :传递回调函数的参数
-f_num: 记录包含的字段数目
-f_value: 包含每个字段值的指针数组
-f_name: 包含每个字段名称的指针数组
-返回值:成功为0,失败为-1

不使用回调函数的查询

int sqite3_get_table(sqlite3 *db,const char *sql, char ****resultp, int *nrow, int *ncolumn, char **errmsg)
-功能:执行SQL操作
-db:句柄
-sql:SQL语句
-resultp:用来指向sql执行结果的指针
-nrow:满足条件的记录的数目
-ncolumn:每条记录包含的字段数目
-errmsg:错误信息指针的地址
-返回值:成功返回0, 失败返回值错误码

c语言的编译

gcc student.c -lsqlite3
在这里插入图片描述
描述:找不到头文件
原因:系统没有安装函数库
解决办法:
sudo apt-get install libsqlite3-dev

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define  DATABASE "stu.db"
int do_insert(sqlite3 *db)
{
    int id;
    char name[32] = {0};
    int score;
    char sql[128] = {};
    char *errmsg;
    printf("Input id:");
    scanf("%d", &id);
    getchar();
    printf("Input name:");
    scanf("%s", &name[0]);
    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);
        return -1;
    }
    else
    {
        printf("insert success");
    }
    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);
        return -1;
    }
    else
    {
        printf("delete success");
    }
    return 0;
}
int do_update(sqlite3 *db)
{
    int id;
    char sql[128] = {};
    int score;
    char *errmsg;
    printf("Input id:");
    scanf("%d", &id);
    getchar();
    printf("Upadate 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);
        return -1;
    }
    else
    {
        printf("update success");
    }
    return 0;
}
int callback(void* para,int f_num,char** f_value,char** f_name)
{
    int i = 0;
    for (i=0; i < f_num; i++)
    {
        printf("%-11s",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);
        return -1;
    }
    else
    {
        printf("query success");
    }
    return 0;
}
int do_query1(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);
        return -1;
    }
    else
    {
        printf("query1 success");
    }
    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 = NULL;
    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 Intger, name char, score Intger);",NULL,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s.\n",errmsg);
        return -1;
    }
    else
    {
        printf("create table success.\n");      
    }
    while (1)
    {
        printf("*****************************************\n");
        printf("1:insert 2:delete 3:query 4:updata 5:query1 6:quit \n");
        printf("*****************************************\n");
        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:
            do_query1(db);
            break;
        case 6:
            sqlite3_close(db);
            exit(0);   
        default:
            break;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值