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

ops/2024/10/17 18:16:01/

1. 数据库

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

2. SQLite

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

3. 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提示符

4. 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'));

2. 多表联合查询

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 学生成绩.课程编号 = 课程信息.课程编号;

3. sqlite相关函数接口

3.1 sqlite3_open

        1. 定义

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

        2. 功能

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

        3. 参数

                filename:文件描述符 
                ppDb:存放句柄指针空间首地址

        4. 返回值

                成功返回SQLITE_OK
                失败返回错误码

        5. 示例程序

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 */
                );

        2. 功能

                加载一条SQL语句

        3. 参数

                sqlite3*:打开数据库时获得的句柄
                sql:执行的SQL语句字符串首地址 
                callback:回调函数(select语句时才会使用)
                void *:给回调函数的传参
                errmsg:出错时存放出错字符串空间首地址

        4. 返回值

                成功返回SQLITE_OK
                失败返回错误码        

        5. 示例程序

(1)简单程序

#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)将英文字典文本文件中的数据存入数据库,并利用数据库实现英文单词的查询

#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*);

        2. 功能

                关闭数据库句柄

3.4 sqlite3_errmsg

        1. 定义

              const char *sqlite3_errmsg(sqlite3*);

        2. 功能

                将出错原因转换成字符串


http://www.ppmy.cn/ops/48074.html

相关文章

矩阵练习2

48.旋转图像 规律&#xff1a; 对于矩阵中第 i行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组&#xff0c;如果不想使用额外的内存&#xff0c;可以用一个临时变量 。 还可以通…

Python爬取城市空气质量数据

Python爬取城市空气质量数据 一、思路分析1、寻找数据接口2、发送请求3、解析数据4、保存数据二、完整代码一、思路分析 目标数据所在的网站是天气后报网站,网址为:www.tianqihoubao.com,需要采集武汉市近十年每天的空气质量数据。先看一下爬取后的数据情况: 1、寻找数据…

Go 文件压缩解压

在Go语言中&#xff0c;archive/zip包提供了创建、读取和解压缩ZIP格式文件的功能。 一、创建ZIP文件并添加内容----压缩 package mainimport ("archive/zip""bytes""fmt""io""log""os" )func main() {// 创建一…

云联HIS系统源码,二级医院信息系统源码,支持云架构部署模式

采用java语言开发B/S广域互联模式&#xff0c;支持云架构部署模式&#xff0c;支持大数据分析技术&#xff1b;支持与医保平台接口、电子票据对接。 云HIS系统相关技术&#xff1a; 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;Sprin…

深度学习 - PyTorch简介

基础知识 1. PyTorch简介 PyTorch的特点和优势&#xff1a; 动态计算图、易用性、强大的社区支持、与NumPy兼容。 安装和环境配置&#xff1a; 安装和验证PyTorch&#xff1a; pip install torch torchvision验证安装&#xff1a; import torch print(torch.__version__)运行…

UE4 RPC进行网络同步

说明 基于UE本身提供的RPC同步机制 RPC远程过程调用允许客户端或服务器通过网络连接相互发送消息&#xff1a; 使用时需要注意&#xff1a; 1、必须从 Actor 上调用 2、Actor 必须被复制&#xff0c;注意勾选BP中Replicates&#xff0c;或使变量bReplicates true 3、注意如…

VL27 不重叠序列检测

这里最大的问题是&#xff1a; always (*) 和 always (posedge clk or negedge rst_n)的区别 always (*) 在当前时钟内会变化 always (posedge clk or negedge rst_n)由时钟驱动&#xff0c;所以会在下一个时钟才发生变化 代码 module sequence_detect(input clk,input rst_…

【2024算力大会分会 | SPIE独立出版 | 往届均已完成EI检索】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)

【2024算力大会分会 | SPIE出版】 2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024) 2024 International conference on Cloud Computing, Performance Computing and Deep Learning *CCPCDL往届均已完成EI检索&#xff0c;最快会后4个半月完成&#xff01; 一、…