嵌入式数据库sqlite3【基础篇】-基本命令操作,小白一看就懂

原创 一口Linux 2024-09-20 21:03

点击左上方蓝色“一口Linux”,选择“设为星标

第一时间看干货文章 

【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式知识点-思维导图-免费获取
【就业】一个可以写到简历的基于Linux物联网综合项目
【就业】找工作简历模版



 

前言

数据在实际工作中应用非常广泛,数据库的产品也比较多,oracle、DB2、SQL2000、mySQL;基于嵌入式linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB。

本文主要讲解数据库SQLite,通过这个开源的小型的嵌入式数据库带领大家掌握一些基本的数据库操作,这些操作在很多系统中都是通用的,可谓学一通百。

SQLite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。

作者D.RichardHipp

2000年1月,Hipp开始和一个同事讨论关于创建一个简单的嵌入式SQL数据库的想法,这个数据库将使用GNU DBM哈希库(gdbm)做后台,同时这个数据库将不需要安装和管理支持。

后来,一有空闲时间,Hipp就开始实施这项工作,2000年8月,SQLite 1.0版发布了。【在此向大神献上我的膝盖!

它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

SQLite特性

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

安装

现在运行的主要是sqlite3版本,在ubuntu下安装也非常方便。

sudo apt-get install sqlite sqlite3   安装应用程序
sudo apt-get install libsqlite3-dev   安装库+头文件,用代码操作数据库必须安装

查看版本号:输入命令 sqlite3进入操作界面,输入命令.version,即可查看详细版本号。也可以使用下面命令,安装图形化操作工具:

sudo apt-get install sqlitebrowser    图形化工具建立数据库

除此之外,还可以部署在windows下,本文只讨论ubtuntu下,采用命令行方式来操作数据库。

数据类型

操作数据库,主要就是操作表,表的每一列内容都有一定数据类型,比如整型值、字符串、布尔型等。

Sqlite3主要数据类型如下:

数据类型定义
数据类型     NULL表示该值为NULL值。
INTEGER无符号整型值。
REAL浮点值。
TEXT文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。
BLOB存储Blob数据,该类型数据和输入数据完全相同,1表示true,0表示false。

同时sqlite3也接受如下的数据类型:

数据类型定义
smallint16位的整数。
interger32位的整数。
decimal(p,s)精确值p是指全部有几个十进制数,s是指小数点后可以有几位小数。如果没有特别指定,则系统会默认为p=5 s=0 。
float32位元的实数。
double64位元的实数。
char(n)n 长度的字串,n不能超过 254。
varchar(n)长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)和 char(n) 一样,不过其单位是两个字节, n不能超过127。这个形态是为了支持两个字节长度的字体,如中文字。
vargraphic(n)可变长度且其最大长度为n的双字元字串,n不能超过2000
date包含了 年份、月份、日期。
time包含了 小时、分钟、秒。
timestamp包含了 年、月、日、时、分、秒、千分之一秒。

约束

表的每一列都有一些限制属性,比如有的列的数据不能重复,有的则限制数据范围等,约束就是用来进一步描述每一列数据属性的。

SQLite 数据库常用约束如下:

名称定义
NOT NULL- 非空
UNIQUE唯一
PRIMARY KEY主键
FOREIGN KEY外键
CHECK条件检查
DEFAULT默认

非空 NOT NULL

有一些字段我们可能一时不知到该填些什么,同时它也没设定默认值, 当添加数据时,我们把这样的字段空着不填,系统认为他是 NULL 值。

但是还有另外一类字段,必须被填上数据,如果不填,系统就会报错。这样的字段被称为 NOT NULL 非空字段,需要在定义表的时候事先声明。

唯一 UNIQUE

除了主列以为,还有一些列也不能有重复值。

主键 PRIMARY KEY

一般是整数或者字符串,只要保证唯一就行。在 SQLite 中,主键如果是整数类型,该列的值可以自动增长。

外键 FOREIGN KEY

我们的数据库中已经有 Teachers 表了,假如我们再建立一个 Students 表, 要求 Students 表中的每一个学生都对应一个 Teachers 表中的教师。

很简单,只需要在 Students 表中建立一个 TeacherId 字段,保存对应教师的 Id 号, 这样,学生和教师之间就建立了关系。

问题是:我们有可能给学生存入一个不在 Teachers 表中的 TeacherId 值, 而且发现不了这个错误。

这种情况下,可以把 Students 表中 TeacherId 字段声明为一个外键, 让它的值对应到 Teachers 表中的 Id 字段上。

这样,一旦在 Students 表中存入一个不存在的教师 Id ,系统就会报错。

默认值 DEFAULT

有一些特别的字段列,在每一条记录中,他的值基本上都是一样的。只是在个别情况下才改为别的值,这样的字段列我们可以给他设一个默认值。

条件检查 CHECK

某些值必须符合一定的条件才允许存入,这是就需要用到这个 CHECK 约束。

常用命令

下面介绍Shell模式中的各常用命令的使用。

命令功能
.help可显示shell模式中可使用的所有命令列表
.database显示数据库信息;包含当前数据库的位置
.mode  column使得SQL语句处理的结果以列对齐的方式显示
.mode    listcolumn
.headers on/off打开关闭列标题显示开关,以使得查询结果在屏幕显示时具有列标题
.tables列出当前打开的数据库中共有多少张表
.exit退出SQLite环境
.schema foods显示表foods 创建时的SQL语句
.schema显示所有表被创建时的语句
.nullvalue STRING查询时用指定的串代替输出的NULL串 默认为.nullvalue ''
.show显示shell模式中定义的与输出相关的一些设置
.output file.csv设置输出文件格式为CSV,文件名为file.csv
.separator ,设置select语句输出的列数据间以“ ,”分隔
.output stdout恢复输出内容到标准输出设备(屏幕)

【注意】sqlite的命令都是.开头的,操作语句前面是没有.的。

使用实例

数据库的操作语句主要是增删改查,下面我们通过一些实例让大家了解数据库的这些基本操作。

表类型

假设我们要创建一个教学管理的数据库jxgl.db,数据库中要保存学生表STUDENT。

snosnamessexsagesdept
95001yikoum21cs
95002pengm21cs

根据我们的常识,可知每一列的数据有以下特性:

  • sno      学号:整型值,每个人学号是唯一的,学校一般用学号来区分所有的学生,而且一般学号是递增的,所以我们设置sno为primary key;
  • sname 姓名:一般是字符串,可以重复,但是不能为空;
  • ssex    性别:字符串,可以为空;
  • sage   年龄:整型值,假定年龄要大于14;
  • sdept  专业:字符串,可以为空,此处我们默认为'CS'。

下面我们一步步实现这个数据库的所有操作。

创建教学管理“jxgl”数据库

数据库的打开和退出,使用如下命令。

创建表:

CREATE TABLE IF NOT EXISTS STUDENT(Sno integer primary key,   Sname text not null,   Ssex text,Sage integer check(Sage>14),Sdept text default 'CS');


该表的属性就是按照上一节表属性 执行结果:

查看表:

看到STUDENT,说明该表创建好了。【注意】

  1. 操作语句不是命令,前面不要加. ;
  2. 操作语句后面一定要;结尾,如果漏掉了,一定要补上分号;
  3. 操作语句对字母的全角半角很敏感,所有的符号都要用半角。

插入数据

插入数据采用insert into语句来实现,如下所示:

INSERT INTO STUDENT VALUES('95001','李勇','M',20,'CS');
INSERT INTO STUDENT VALUES('95002','刘晨','F',19,'IS');
INSERT INTO STUDENT VALUES('95003','王敏','F',18,'MA');
INSERT INTO STUDENT VALUES('95004','张立','M',18,'IS');

执行结果如下:


插入的数据只初始化部分值

设置了not null那一列 必须要赋值,而且表名字不区分大小写。

insert into student(sname,sage) values ('一口',19);

查看表

用SELECT语句查看表中的内容:

SELECT * FROM STUDENT;

其中的 * 表示查看所有的数据信息。

有没有看到,结果看起来不舒服啊,下面我们来调整下显示格式:

sqlite> .headers on          显示列名
sqlite> .mode column         列对齐

删除一行信息

delete from student where sname='一口';

由上图可见,名字为“一口”的那条记录被删除了。

修改一条记录的某个内容

UPDATE student SET sage=29 WHERE sname='张立';

修改数据表结构。

修改表结构,需要用到语句ALTER TABLE。

下面我们向STUDENT表增加“spwd”列,其数据类型为TEXT型,用SELECT命令查看表中内容。

ALTER TABLE STUDENT ADD spwd TEXT default '123456';

修改表名字

alter table student rename to stu;

删除数据表。

DROP TABLE STUDENT;

删除列

sqlite3没有实现删除一列的命令,要实现这个操作,需要先将该表拷贝到一个新表,但是只集成需要的列,要删除的列不继承过来。

可以 用以下方式操作删除一列:

sqlite> create table test as select sno, sname,ssex,sage,sdept  from stu;
sqlite> drop table stu;
sqlite> alter table test rename to stu;

由上图可知,我们刚才增加的列spwd被删除了。

sqlite进阶

where子句

如果我不想查看所有的数据,而指向查看某一个人的信息要怎么操作呢?

我们就要借助where子句来实现。

where子句可以结合操作语句来进程增删改查,是最常用的一个子句。

根据姓名查找记录:

Select * from student where sname='一口';

根据学号查找记录:

Select * from student where sno=95001;

根据姓名和年龄同时查找记录:

select *from student where sname='一口' and sage=19;

显示某两列的数据

select sno,sname from student ; 

数据库的备份和恢复

现在我们假设要将表foods备份出为foodsdb.sql,并用命令回复该数据库。

按照以下步骤操作即可。

sqlite>.dump                --把创建表及向表中插入记录的所有SQL语句显示在屏幕上
sqlite>.output  foodsdb.sql --指定dump命令输出到文件的文件名
sqlite>.dump         --输出创建并插入数据到基本表的SQL语句到output指定的文件
sqlite>.output stdout   --恢复输出内容到标准输出设备(屏幕)
sqlite>.dump            --此时输出的SQL语句转回到屏幕 
sqlite>Drop table foods;  --删除foods表语句说明:

上述Drop为SQL语句,用于删除指定的表。

因为是SQL语句,因此以“;”结尾

sqlite>.read foodsdb.sql     --执行foodsdb.sql中的包含的所有SQL语句, 用来重建刚删除的4张表及相关数据


好了,跟着一口君一步步操作,基本上sqlite3的增删改查操作,相信各位应该没什么问题了,sqlite还有其他一些子句以及函数的用法,留待下一篇继续介绍。

end



一口Linux 


关注,回复【1024】海量Linux资料赠送


精彩文章合集

文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图


一口Linux 写点代码,写点人生!
评论
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 159浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 153浏览
  • 前言近年来,随着汽车工业的快速发展,尤其是新能源汽车与智能汽车领域的崛起,汽车安全标准和认证要求日益严格,应用范围愈加广泛。ISO 26262和ISO 21448作为两个重要的汽车安全标准,它们在“系统安全”中扮演的角色各自不同,但又有一定交集。在智能网联汽车的高级辅助驾驶系统(ADAS)应用中,理解这两个标准的区别及其相互关系,对于保障车辆的安全性至关重要。ISO 26262:汽车功能安全的基石如图2.1所示,ISO 26262对“功能安全”的定义解释为:不存在由于电子/电气系统失效引起的危害
    广电计量 2025-01-02 17:18 206浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 108浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 147浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 105浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 112浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 270浏览
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 127浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 125浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 151浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦