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

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.mzph.cn/pingmian/29481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[大模型]MiniCPM-2B-chat WebDemo部署

MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性评测集上&#xff0c;MiniCPM …

124M中国十大城市群规划范围数据

城市群是由若干个都市圈构成的广域城镇化形态&#xff0c;其内部应该包含若干个中心城市。 都市圈是指围绕某一个中心城市&#xff0c;即超大或特大城市的城镇化形态。 无论在体量还是在层级上&#xff0c;都市圈要低于城市群的概念。 现在&#xff0c;我们就来为你分享一下…

Ubuntu 22.04 一键安装 Oracle 11GR2 单机

前言 Oracle 一键安装脚本&#xff0c;演示华为 Ubuntu 22.04 一键安装 Oracle 11GR2 单机版过程&#xff08;全程无需人工干预&#xff09;。 ⭐️ 脚本下载地址&#xff1a;Shell脚本安装Oracle数据库 安装准备 1、安装好操作系统&#xff0c;建议安装图形化2、配置好网络3…

MTU简介

MTU 概念定义 最大传输单元MTU&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;&#xff0c;是指网络能够传输的最大数据包大小&#xff0c;以字节为单位。 是一种网络协议中规定的在一次传输中所能承载的最大数据量。是一个关键的网络参数&#xff0c;对数…

不入耳的蓝牙耳机平价推荐,五大爆款分析测评

开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势。它作为骨传导耳机&#xff0c;深受用户的喜爱&#xff0c;不仅可以随时感知周围环境&#xff0c;还提供了高质量的音效体验&#xff0c;对于热爱运动的人士而言&#xff0c;高品质的骨传导耳机无疑是首选。同时&#…

Spring是如何设计IOC容器的?BeanFactory ApplicationContext

BeanFactory是Spring框架中最底层的接口&#xff0c;用于实例化、配置和管理bean。它使用控制反转&#xff08;IOC&#xff09;模式&#xff0c;将对象的创建、管理和装配的职责从应用程序代码中转移给Spring容器。这样&#xff0c;应用程序代码就无需关心对象如何创建和装配&a…

如何配置docker通过代理服务器拉取镜像

如果 docker 所在的环境是通过代理服务器和互联网连通的&#xff0c;那么需要一番配置才能让 docker 正常从外网正常拉取镜像。然而仅仅通过配置环境变量的方法是不够的。本文结合已有文档&#xff0c;介绍如何配置代理服务器能使docker正常拉取镜像。 本文使用的docker 版本是…

【vue3】vue3中使用reactive定义的变量响应式丢失问题

这里写目录标题 1. 解构响应式对象属性2. 添加新属性到响应式对象3. 异步更新响应式状态4.总结 当你说“vue3中使用reactive定义的变量响应式丢失问题”时&#xff0c;以下是一些更具体的例子和解决方案&#xff1a; 1. 解构响应式对象属性 问题&#xff1a; import { reacti…

Django里的模板变量

变量是模板中最基本的组成单位&#xff0c;是视图传递给模板的数据&#xff1b; 当模板引擎遇到变量时&#xff0c;会将该变量计算为结果&#xff1b; 变量以{{variable}}表示&#xff0c;如&#xff1a; obj{“name”:“张三”&#xff0c;“age”:18} {{obj.name}} #输出 …

Python网络安全项目开发实战,如何看清Web攻击

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_看清Web攻击_编程案例解析实例详解课程教程.pdf 一、引言 在网络安全领域,Web攻击一直是一个严峻的问题。攻击者通过各…

卡本医疗VENUS登陆香港国际医疗展,探索全球医疗发展新机遇

由香港贸易发展局主办的第15届香港国际医疗及保健展、以及联合香港特别行政区政府举办的第四届亚洲医疗健康高峰论坛在中国香港圆满落幕。 香港国际医疗及保健展是亚太地区最具影响力的B2B医疗贸易展览会之一&#xff0c;辐射海内外市场&#xff0c;本次邀请了超过8500家买家以…

模型部署onnx入门

一、定义 1.定义 2. 环境安装 3. 案例 4. 可视化界面 5. 参考网址 6. 推理引擎 onnx Runtime 进行单张图片推理&#xff0c;本地部署 7. 推理引擎onnx Runtime 进行单张图片推理&#xff0c;调用摄像头获取画面 8. 推理引擎onnx Runtime 进行图片推理&#xff0c;调用摄像头获…

美国原装二手KEITHELY2410替代新品keithley2470数字源表

Keithley 2470 高压 SourceMeter 源测量单元 (SMU) 仪器将先进的 Touch, Test, Invent 技术带到您的指尖。它将创新的图形用户界面 (GUI) 与电容式触摸屏技术相结合&#xff0c;使测试变得直观&#xff0c;并最大限度地缩短学习曲线&#xff0c;帮助工程师和科学家更快地学习、…

【字符串解析】IP地址字段解析提取函数接口

在嵌入式业务逻辑中&#xff0c;我们有时需要从配置文件、串口或者服务端接收的消息数据中进行字符串解析&#xff0c;来提取需要的目标字符串字段。通常我们会调用字符串处理相关的函数&#xff0c;例如strstr&#xff0c;strchr&#xff0c;sscanf等&#xff0c;再结合指针偏…

数据驱动决策:工单统计工具如何赋能企业精准运营

在当今这个数字化飞速发展的时代&#xff0c;企业对于内部运营效率的追求已经达到了前所未有的高度。你是否曾为了繁杂的工单统计管理而头疼不已&#xff1f;是否曾因为无法准确进行工单统计数据而错失商机&#xff1f;今天&#xff0c;我将向你展示一款革命性的工单统计工具&a…

Web前端经验汇总:深入探索与实战心得

Web前端经验汇总&#xff1a;深入探索与实战心得 在数字化时代的浪潮中&#xff0c;Web前端技术作为连接用户与互联网世界的桥梁&#xff0c;其重要性日益凸显。作为一名长期奋战在Web前端领域的开发者&#xff0c;我积累了一些宝贵的经验&#xff0c;并愿意在此与大家分享。 …

MBR40100CT-ASEMI无人机专用MBR40100CT

编辑&#xff1a;ll MBR40100CT-ASEMI无人机专用MBR40100CT 型号&#xff1a;MBR40100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;100V…

TypeScript中的枚举

在 TypeScript&#xff08;TS&#xff09;中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的数据类型&#xff0c;它允许我们为一组命名的数值&#xff08;称为枚举成员或枚举项&#xff09;定义常量集。TypeScript 中的枚举是 TypeScript 语言扩展的一部分&#xf…

el-date-picker中popper-class的使用,自定义时间框的弹出位置

el-date-picker中popper-class的使用,自定义时间框的弹出位置 问题解决方法 问题 有时候时间选择框会根据位置自动计算出现的位置.但有时会造成被遮挡的问题使用popper-class自定义时间弹框样式不生效问题 解决方法 使用popper-class时 不要放在<style scoped></st…

【数据分析】线性及逻辑回归模型和Python实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…