嵌入式学习——数据库(SQL语句和sqlite编程)——day35

  1. 数据库

数据库是一个按数据结构来存储、管理和检索数据的计算机软件系统。它是存储数据的电子仓库,旨在以高效、有组织的方式处理大量信息。

  1. SQLite

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。

  1. SQLite命令

3.1 .databases

列出附加数据库的名称和文件

3.2 .dump

以SQL文本格式转储数据库

3.3 exit

退出SQLite提示符

3.4 .header(s) on|off

开启或关闭头部显示

3.5 .help

显示帮助信息

3.6 .mode column

左对齐的列

3.7 .width num num

为"column"模式设置列宽度

3.8 .quit

退出SQLite提示符

  1. SQL语句

4.1 create table语句------给数据库创建新表

用法:create table 表名(表字段1,表字段2,...);

示例:CREATE TABLE 魏 (id integer primary key asc, 姓名 char(32), 武力 integer, 智力 integer);

1.2 drop table语句------删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范

示例:drop table 魏;

1.3 insert into 语句------向数据库的某个表中添加新的数据行

示例:insert into 魏 values (NULL, "司马懿", 85, 90);

1.4 select语句------从 SQLite 数据库表中获取数据,以结果表的形式返回数据

示例:select * from 魏;

select * from dict where word like 'abandon';

1.5 where子句------按要求查看表格内容

示例:select * from 魏 where 武力 > 90;

select * from dict where word like 'abandon';

1.6 order by 子句------对表格内容进行排序

示例:select * from 魏 order by 智力 desc;(降序)

示例:select * from 魏 order by 智力 asc;(升序)

1.7 delete from------删除表格内容

示例:delete from 魏 where 姓名="曹操";

1.8 update------修改表格内容

示例:update 魏 set 武力 = 71,智力 = 81 where 姓名="曹丕";

1.9 sqlite3 数据库名.db------新建数据库

1.10 .table 查看数据库中插入的所有表

1.11 .headers on 给数据库加表头

1.12 .schema xxx 列出当前指定的xxx表结构

1.13 .dump user ===>导出数据库

1.14 sqlite3 xxx.db .dump > xxx.sql 数据的导出

//将数据库名称为xxx的数据库整体导出到脚本中

1.15 sqlite3 xxx.db < xxx.sql 数据的导入

1.16 可视化数据库工具的安装 sudo apt-get install sqlitebrowser

1.17 打开可视化工具 sqlitebrowser

1.18 自动增长列

sqlite> CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime); 主键

sqlite> insert into user3 (NULL,'李四',23,datetime('now')); (void*)0

1.19 插入时间列

CREATE TABLE user1(id int,name char,age int,dt datetime);'2022-07-01 19:00:00'

insert into user1 values (2,'张三',23,datetime('now','+8 hours'));

  1. 多表联合查询

2.1 交叉连接

select * from 学生信息 cross join 课程信息;

select 学生信息.姓名,课程信息.课程名 from 学生信息 cross join 课程信息;

sqlite> select

...> 学生信息.姓名 as 学生,

...> 课程信息.课程名 as 课程

...> from 学生信息 cross join 课程信息

...> where 学生 like "赵%"

...> order by 学生信息.学号;

2.2 内连接

select 学生信息.姓名 as 学生, 学生成绩.课程成绩 as 成绩

...> from 学生信息 inner join 学生成绩 on 学生信息.学号 = 学生成绩.学号;

2.3 外连接

sqlite> select 学生信息.姓名 as 学生, 学生成绩.课程编号 as 课程, 学生成绩.课程成绩 as 成绩

...> from 学生信息 left outer join 学生成绩 on 学生信息.学号 = 学生成绩.学号;

2.4 三表联合查询

sqlite> select 学生信息.姓名 as 学生, 课程信息.课程名 as 课程, 学生成绩.课程成绩 as 成绩

...> from 学生信息 left outer join 学生成绩 on 学生信息.学号 = 学生成绩.学号

...> inner join 课程信息 on 学生成绩.课程编号 = 课程信息.课程编号;

  1. sqlite相关函数接口

3.1 sqlite3_open

  1. 定义

int sqlite3_open(

const char *filename, /* Database filename (UTF-8) */

sqlite3 **ppDb /* OUT: SQLite db handle */

);

  1. 功能

打开数据库文件获得操作数据库文件句柄

  1. 参数

filename:文件描述符

ppDb:存放句柄指针空间首地址

  1. 返回值

成功返回SQLITE_OK

失败返回错误码

  1. 示例程序

3.2 sqlite3_exec

  1. 定义

int sqlite3_exec(

sqlite3*, /* 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 */

);

  1. 功能

加载一条SQL语句

  1. 参数

sqlite3*:打开数据库时获得的句柄

sql:执行的SQL语句字符串首地址

callback:回调函数(select语句时才会使用)

void *:给回调函数的传参

errmsg:出错时存放出错字符串空间首地址

  1. 返回值

成功返回SQLITE_OK

失败返回错误码

  1. 示例程序

(1)简单程序

cpp 复制代码
#include "sqlite3.h"
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int show(void *arg, int col, char **result, char **title)//arg传参  col列数  result内容(每次执行函数++)  title表头
{
    int i = 0;
    static int flag = 0;

    if (0 == flag)
    {
        for (i = 0; i < col; i++)
        {
            printf("%s\t", title[i]);
        }
        putchar('\n');
        flag = 1;
    }

    for (i = 0; i < col; i++)
    {
        printf("%s\t", result[i]);
    }
    printf("\n");

    return 0;
}

int main(int argc, const char *argv[])
{
    int ret = 0;
    sqlite3 *pdb = NULL;
    char tmpbuff[1024] = "select * from 西游记";
    char *perrmsg;

    ret = sqlite3_open("dict.db", &pdb);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_open failed:%s\n", sqlite3_errmsg(pdb));
        sqlite3_close(pdb);
        return -1;
    }

        ret = sqlite3_exec(pdb, tmpbuff, show, NULL, &perrmsg);
        if (ret != SQLITE_OK)
        {
            fprintf(stderr, "sqlite3_exec1 failed:%s\n", perrmsg);
            printf("%s\n", tmpbuff);
            sqlite3_free(perrmsg);
            return -1;
        }

    sqlite3_close(pdb);

    return 0;
}

(2)将英文字典文本文件中的数据存入数据库,并利用数据库实现英文单词的查询

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

int show(void *arg, int col, char **result, char **title)
{
    *(int *)arg = 1;

    printf("%s %s\n", result[1], result[2]);
    
    return 0;
}

int main(void)
{
    sqlite3 *db;
    int ret = 0;
    char sql_cmd[1024] = {0};
    char *errmsg = NULL;
    time_t start_tm;
    time_t end_tm;

    ret = sqlite3_open("./first.db", &db);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_open error: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return -1;
    }

    strcpy(sql_cmd,"drop table dict");
    sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);

    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd, "create table if not exists dict(id integer primary key asc, word char(32), mean char(1024))");

    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec1 error: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return -1;
    }
    
    FILE *fp = fopen("./dict.txt", "r");
    if (NULL == fp)
    {
        perror("fopen error!\n");
        return -1;
    }

    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd, "BEGIN TRANSACTION");
    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec2 error: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return -1;
    }

    time(&start_tm);

    while (1)
    {
        char buf[1024] = {0};
        char *word = NULL;
        char *mean = NULL;

        if (NULL == fgets(buf, sizeof(buf), fp))
        {
            break;
        }

        word = strtok(buf, " ");
        mean = strtok(NULL, "\r");
        bzero(sql_cmd, sizeof(sql_cmd));

        sprintf(sql_cmd, "insert into dict values(NULL, \"%s\", \"%s\");", word, mean);
        ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
        if (SQLITE_OK != ret)
        {
            fprintf(stderr, "sqlite3_exec3 error: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            sqlite3_free(errmsg);

            return -1;
        }
    }

    bzero(sql_cmd, sizeof(sql_cmd));
    strcpy(sql_cmd, "COMMIT;");

    ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
    if (SQLITE_OK != ret)
    {
        fprintf(stderr, "sqlite3_exec3 error: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        sqlite3_free(errmsg);

        return -1;
    }

    time(&end_tm);
    printf("spend time %lu\n", end_tm - start_tm);

    while (1)
    {
        printf("请输入你要查询的单词:");

        int exist_flag = 0;
        char dict_word[32] = {0};
        fgets(dict_word, sizeof(dict_word), stdin);
        dict_word[strlen(dict_word) - 1] = '\0';
        if (0 == strcmp(dict_word, "#quit"))
        {
            break;
        }

        bzero(sql_cmd, sizeof(sql_cmd));
        sprintf(sql_cmd, "select * from dict where word like '%s';", dict_word);

        ret = sqlite3_exec(db, sql_cmd, show, &exist_flag, &errmsg);
        if (SQLITE_OK != ret)
        {
            fprintf(stderr, "sqlite3_exec4 error: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            sqlite3_free(errmsg);

            return -1;
        }

        if (0 == exist_flag)
        {
            printf("输入单词有误,请重新输入!\n");
        }
    }
    
    sqlite3_close(db);
    fclose(fp);

    return 0;
}

3.3 sqlite3_close

  1. 定义

int sqlite3_close(sqlite3*);

  1. 功能

关闭数据库句柄

3.4 sqlite3_errmsg

  1. 定义

const char *sqlite3_errmsg(sqlite3*);

  1. 功能

将出错原因转换成字符串

相关推荐
qq_3216653319 分钟前
mysql 数据库迁移到达梦数据库
数据库·mysql
Hello.Reader1 小时前
Redis大Key问题全解析
数据库·redis·bootstrap
靖顺3 小时前
【OceanBase 诊断调优】—— packet fly cost too much time 的根因分析
数据库·oceanbase
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
B1nna4 小时前
Redis学习(三)缓存
redis·学习·缓存
_im.m.z4 小时前
【设计模式学习笔记】1. 设计模式概述
笔记·学习·设计模式
就爱学编程5 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
yuanbenshidiaos6 小时前
C++--------------树
java·数据库·c++
落羽的落羽6 小时前
【落羽的落羽 C语言篇】动态内存管理·下
c语言
左漫在成长7 小时前
王佩丰24节Excel学习笔记——第十九讲:Indirect函数
笔记·学习·excel