数据库:sqlite3

一、sqlite使用

1、安装sqlite3数据库

sudo apt-get install sqlite3 libsqlite3-dev

//在终端输入sqlite3,开始使用数据库

2、sqlite3 常用命令:(以 ‘.’ 开头)

.help   					打开帮助手册
.open <数据库文件名>   		打开数据库文件
.quit 						退出数据库程序 也可以是.q
.exit 						退出数据库程序
.tables 					查看当前数据库文件中有哪些数据表
.schema 					查看建表语句-也就是表结构
.headers on	 				查询时是否显示表头信息

3、SQL语句:(SQL语句必须以 ; 结束)

3.1、 创建数据表语句

CREATE TABLE 表名(字段1 字段1的类型, 字段2 字段2的类型,....., 字段n 字段n的类型);
字段类型:
    整型    INT 或者 INTEGER
    字符串  CHAR 或者 TEXT
例:
CREATE TABLE student(id INT, name TEXT, score INTEGER);

3.2、主键:(不可重复)(创建时设置主键)

CREATE TABLE stu(id INT PRIMARY KEY, name CHAR, score INT);

3.3、 向数据表中插入数据:插入一行

INSERT INTO student VALUES(1001, "张三", 80);
//sql语句中出现的字符串要用   双引号  或  单引号 引起来
//这种插入方式要求必须从左到右给表的每个字段都对应赋值

INSERT INTO student(id, name) VALUES(1002, "李四");

3.4、 修改表数据:修改行内数据

UPDATE student SET score=60 WHERE id=1003;
//将id号为1003的成员的成绩score设置为、更新为60分
UPDATE student SET score=100,name="zhang" WHERE id=1001;
//将id为1001的成员的成绩设置为100,名字更新为zhang

3.5、 删除表数据:删除一行

DELETE FROM student WHERE name=AAA;//删除表中name为AAA的数据
//如果表中没有这个数据,也不会报错,只会执行,只不过没有任何现象
DELETE FROM student WHERE name="DDD" OR score=100;
//删除表中name为DDD 和 score为100的数据

3.6、 查询表数据

SELECT * FROM student;  //*表示所有数据,查询student表中所有数据
SELECT id,score FROM student;//查询结果只显示id, score字段
SELECT score FROM student WHERE id=1001;//查询成绩-查询id号为1001的成绩
SELECT * FROM student WHERE score=80;//查询成绩为80的所有字段
SELECT * FROM student WHERE name="张三";//查询name字段为张三的所有信息
SELECT * FROM student WHERE name="李四" AND socre=90;
SELECT * FROM student WHERE score=80 OR score=90;//查询成绩为80或90的所有字段
SELECT * FROM student ORDER BY score DESC;//按照成绩降序排序
//DESC 降序    ASC升序

3.7、 添加一列

ALTER TABLE student ADD COLUMN sex CHAR;
//添加命令,在表student中添加一列(COLUMN)为sex,类型为char

3.8、 删除表

DROP TABLE 表名;

4、函数

4.1、打开数据库文件 .db

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

功能:打开一个数据库文件(存在直接打开 不存在就新建并打开)
参数:
    filename    数据库名字
    ppdb        操作数据库的指针,数据库句柄。
    
返回值:
    成功 SQLITE_OK
    失败 error_code

4.2、获取错误信息的函数

const char *sqlite3_errmsg(sqlite3* db);
功能:获取最后一次错误信息描述

4.3、执行sql语句的函数

int sqlite3_exec(sqlite3* db, const char *sql, 
            int (*callback)(void*,int,char**,char**),
            void * arg,  char **errmsg);
功能:
    执行一条sql语句
参数:
    db        数据库的句柄指针
    sql        将要被执行sql语句
    callback 回调函数, 只有在查询语句时使用 其他情况可以传NULL
    arg        为callback 传参的,如果不是查询语句 也可以传NULL
    errmsg    错误信息的地址
            (如果使用了这个参数,要记得使用 sqlite3_free 去释放空间)
    
返回值:
    成功 SQLITE_OK
    出错 errcode 错误码

4.4、关闭数据库的函数

int sqlite3_close(sqlite3* db);
功能:关闭一个数据库

4.5、获取查询结果的函数

int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult, 
            int *pnRow, int *pnColumn, char **pzErrmsg);
功能:
     查询数据库,它会创建一个新的内存区域来存放查询的结果信息
参数:
    db        数据库操作句柄
    zSql    数据库的sql语句
    azResult 查询的结果
    nRow     行数
    nColumn  列数
    errmsg   错误消息
返回值:
    成功 0
    出错 errcode        

4.6、释放由sqlite3_get_table产生的结果集

sqlite3_free_table(azResult);

二、示例:函数调用+SQL语句封装

代码:

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define MYDB "mysqlite3.db"

/* 函数声明 */
int mySqliteInit(sqlite3      **p);
int insert_student(sqlite3 *p);
int delete_student(sqlite3 *p);
int modify_student(sqlite3 *p);
int search_student(sqlite3 *p);

/* 主函数 */
 int main(){
    //创建一个数据库句柄-指针
    sqlite3 *p_db = NULL;
    //调用数据库初始化函数,创建数据表
    mySqliteInit(&p_db);

    //初始化创建成功之后打印菜单,进行选择
    int choose = 0;
    //循环,直到遇到5退出
    while(1){
        printf("------------------------------------\n");
        printf("|1.增加 2.删除 3.修改 4.查询 5.退出|\n");
        printf("------------------------------------\n");
        printf("请输入你的选择 > ");
        scanf("%d", &choose);
        switch(choose){
            case 1:
                insert_student(p_db);
                break;
            case 2:
                delete_student(p_db);
                break;
            case 3:
                modify_student(p_db);
                break;
            case 4:
                search_student(p_db);
                break;
            case 5:
                printf("退出\n");
                break;
        }
        //如果是因为5退出switch那么就退出while
        if( choose == 5 ){
            break;
        }        
    }
    return 0;
}

int mySqliteInit(sqlite3      **p){
    //定义变量承接sqlite3_open错误码
    int ret = 0;
    //打开数据库文件.db
    if(SQLITE_OK != (ret = sqlite3_open(MYDB, p))){
        printf("文件%s第%d行出错,错误码[%d], 错误信息[%s]\n",\
                __FILE__, __LINE__, ret, sqlite3_errmsg(*p));
        return -1;
    }

    //如果没有错误可以打印提示
    printf("打开数据库文件mysqlite3.db成功\n");
    //成功之后,尝试创建数据表
    //封装sql语句,在终端执行sql语句需要加分号;在程序中不用加
    //char sqlbuf[128] = "CREATE TABLE student(id INT, name TEXT, score INTEGER)";
    //加上IF NOT EXISTS 意为如果不存在就创建,存在就打开,不报错
    char sqlbuf[128] = "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name TEXT, score INTEGER)";
    printf("执行语句:[%s]\n", sqlbuf);
    char *errmsg = NULL;
    //执行sql语句
    if( SQLITE_OK != (ret = sqlite3_exec(*p, sqlbuf, NULL, NULL, &errmsg)) ){
        printf("文件%s第%d行出错,错误码[%d], 错误信息[%s]\n",\
                __FILE__, __LINE__, ret, errmsg);
        return -1;
    }

    //如果没错说明创建表成功,打印提示
    printf("创建数据表成功\n\n");
    //使用了sqlite3_exec中的errmsg参数就要释放
    sqlite3_free(errmsg);
    
    return 0;
}


/* 添加学生信息 */
int insert_student(sqlite3 *p){
    //定义变量接收从终端输入的信息进行添加
    int input_id = 0;
    char input_name[20] = {0};
    int input_score = 0;
    int ret = 0;
    
    printf("请输入要添加学生的id(INT) > ");
    scanf("%d", &input_id);
    printf("请输入要添加学生的name(CHAR) > ");
    scanf("%s", input_name);
    printf("请输入要添加学生的score(INT) > ");
    scanf("%d", &input_score);
    //组装sql语句
    char sqlbuf[128] = {0};
    sprintf(sqlbuf, "INSERT INTO student VALUES(%d, '%s', %d)", \
                        input_id, input_name, input_score);
    printf("执行语句:[%s]\n", sqlbuf);
    //执行语句
    if( SQLITE_OK != (ret = sqlite3_exec(p, sqlbuf, NULL, NULL, NULL)) ){
        printf("文件%s第%d行出错,错误码[%d], 错误信息[%s]\n",\
                __FILE__, __LINE__, ret, sqlite3_errmsg(p));
        return -1;
    }
    printf("添加学员信息成功\n\n");
    return 0;
    
}
/* 删除学生信息-根据学生id号删除 */
int delete_student(sqlite3 *p){
    int delet_id = 0;
    int ret = 0;
    
    printf("请输入要删除学生的id(INT) > ");
    scanf("%d", &delet_id);
    
    //组装sql语句
    char sqlbuf[128] = {0};
    sprintf(sqlbuf, "DELETE FROM student WHERE id=%d", delet_id);
    printf("执行语句:[%s]\n", sqlbuf);
    
    //执行语句
    if( SQLITE_OK != (ret = sqlite3_exec(p, sqlbuf, NULL, NULL, NULL)) ){
        printf("文件%s第%d行出错,错误码[%d], 错误信息[%s]\n",\
                __FILE__, __LINE__, ret, sqlite3_errmsg(p));
        return -1;
    }
    printf("删除学员信息成功\n\n");
    return 0;
}

int modify_student(sqlite3 *p){
    int modify_id = 0;
    char modify_name[20] = {0};
    int modify_score = 0;
    int ret = 0;

    printf("请输入要修改学生的id(INT) > ");
    scanf("%d", &modify_id);
    printf("请输入要修改后学生的name(CHAR) > ");
    scanf("%s", modify_name);
    printf("请输入要修改后学生的score(INT) > ");
    scanf("%d", &modify_score);

    //组装sql语句
    char sqlbuf[128] = {0};
    sprintf(sqlbuf, "UPDATE student SET name='%s', score=%d WHERE id=%d", \
                    modify_name, modify_score, modify_id);
    printf("执行语句:[%s]\n", sqlbuf);
    
    //执行语句
    if( SQLITE_OK != (ret = sqlite3_exec(p, sqlbuf, NULL, NULL, NULL)) ){
        printf("文件%s第%d行出错,错误码[%d], 错误信息[%s]\n",\
                __FILE__, __LINE__, ret, sqlite3_errmsg(p));
        return -1;
    }
    printf("修改学员信息成功\n\n");
    return 0;
}

int search_student(sqlite3 *p){
    char **result;
    int nrow = 0;//行数
    int ncolumn = 0;//列数
    int ret = 0;
    //组装sql语句
    char sqlbuf[128] = {0};
    sprintf(sqlbuf, "SELECT * FROM student");
    //执行语句
    if(SQLITE_OK != (ret = sqlite3_get_table(p, sqlbuf, &result, &nrow, &ncolumn, NULL))){
        printf("文件%s第%d行出错,错误码[%d], 错误信息[%s]\n",\
                __FILE__, __LINE__, ret, sqlite3_errmsg(p));
        return -1;
    }
    
    int i = 0;
    int j = 0;

    //先打印表头
    for(i = 0;i < ncolumn;i++){
        printf("%-10s ", result[i]);
    }
    printf("\n");
    
    int index = i;
    for(i = 0; i < nrow; i++){
        for(j = 0; j < ncolumn; j++){
            printf("%-10s", result[index++]);
        }
        printf("\n");
    }

    printf("查询学生信息成功\n\n");
    return 0;

}
    

注意事项:

  • 注意函数调用时的参数指针的使用
  • 查找数据库的打印
  • 编译时注意添加链接库 (-lsqlite3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好睡觉好好吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值