嵌入式数据库sqlite3基本命令操作基础(05)

前言

数据在实际工作中应用非常广泛,数据库的产品也比较多,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还有其他一些子句以及函数的用法,留待下一篇继续介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/94496.shtml

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

相关文章

基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度(matlab代码)

目录 1 主要内容 系统结构图 P2G-CCS 耦合模型 其他算例对比 2 部分代码 3 下载链接 1 主要内容 该程序复现《基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度》模型,以碳交易和碳封存成本、燃煤机组启停和煤耗成本、弃风成本、购气成本之和为目标…

CANoe.Diva生成测试用例

Diva目录 一、CANoe.Diva打开CDD文件二、导入CDD文件三、ECU Information四、时间参数设置五、选择是否测试功能寻址六、勾选需要测试服务项七、生成测试用例 一、CANoe.Diva打开CDD文件 CANoe.Diva可以通过导入cdd或odx文件,自动生成全面的测试用例。再在CANoe中导…

简单查找重复文本文件

声明这是最初 我的提问给个文本分类清单input查找文件夹下 .py .txt .excel .word 一模一样的文本不是找文件名 找相同格式下的文件文本是否一样 文件单独复制到文件夹下两个文件全部复制到文件夹下 print 打印相同文本文件的名字 比如查找到了3.py与4.5.是.py文件中的文本文件…

5.Vectors Transformation Rules

在上节,有个问题:向量分量的转换方式 与 新旧基底的转换方式相反 用例子来感受一下, 空间中一向量V,即该空间的一个基底:e1、e2 v e1 e2 现把基底 e1 、 e2 放大两倍。变成 基向量放大了两倍, 但对于…

Javascript 事件的动态绑定

动态绑定事件,是指在代码执行过程中,通过Javascript代码来绑定事件。这种技术可以大大增强网页的交互性和用户体验。上一期介绍的是通过事件监听器 EventListener 去实现元素颜色的变化。这一期将通过动态绑定方法去实现,对象.事件 匿名函数…

【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统

随着科技的不断发展,虚拟现实技术在各个领域的应用越来越广泛。在养殖业中,VR技术可以帮助养殖户进行家鱼授精实操演练,提高养殖效率和繁殖成功率。本文将介绍利用VR开展家鱼授精实操演练的方法和应用。 首先,我们需要了解家鱼授精…

mysql双主+双从集群连接模式

架构图: 详细内容参考: 结果展示: 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)

【C++】基础入门

万字复习C基础入门语法&#xff0c;适合学过C的朋友用来复习查阅&#xff0c;可能不太适合0基础的朋友。 一.c初识 (1) 第一个c程序 最简单的格式&#xff1a; // 导入头文件 #include<iostream> // 简化对命名空间std下函数和对象的使用 using namespace std; // …

STM32驱动步进电机

前言 &#xff08;1&#xff09;本章介绍用stm32驱动42步进电机&#xff0c;将介绍需要准备的硬件器材、所需芯片资源以及怎么编程及源代码等等。 &#xff08;2&#xff09;实验效果&#xff1a;按下按键&#xff0c;步进电机顺时针或逆时针旋转90度。 &#xff08;3&#xff…

Multisim14.0仿真(二十七)基于UC3842的反激式开关电源的设计及仿真

一、UC3842简介&#xff1a; UC3842为固定频率电流模式PWM控制器。它们是专门为OFF−线和直流到直流转换器应用与最小的外部组件。内部实现的电路包括用于精确占空比控制的修剪振荡器、温度补偿参考、高增益误差放大器、电流传感比较器和理想适合于驱动功率MOSFET的高电流温度极…

openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译

文章目录 openGauss学习笔记-89 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用查询原生编译89.1 查询编译&#xff1a;PREPARE语句89.2 运行命令89.3 轻量执行支持的查询89.4 轻量执行不支持的查询89.5 JIT存储过程89.6 MOT JIT诊断89.6.1 mot_jit_detai…

调度程序以及调度算法的评价指标

1.调度器/调度程序 调度程序决定调度算法&#xff0c;时间片大小 ②&#xff0c;③由调度程序引起&#xff0c;调度程序决定: 1.调度时机 创建新进程进程退出运行进程阻塞I/O中断发生&#xff08;可能唤醒某些阻塞进程)非抢占式调度策略&#xff0c;只有运行进程阻塞或退出…

强化学习环境 - robogym - 学习 - 1

强化学习环境 - robogym - 学习 - 1 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机械臂 table-top 级的多任务操作 robogym 基于 mujoco 搭建&#xff0c;构建了一个仿真机械臂桌面物体操作&#xff08;pick-place、stack、rearr…

视频讲解|基于DistFlow潮流的配电网故障重构代码

目录 1 主要内容 2 视频链接 1 主要内容 该视频为基于DistFlow潮流的配电网故障重构代码讲解内容&#xff0c;对应的资源下载链接为基于DistFlow潮流的配电网故障重构(输入任意线路)&#xff0c;对该程序进行了详尽的讲解&#xff0c;基本做到句句分析和讲解&#xff08;讲解…

【题解 动态规划】 Colored Rectangles

题目描述&#xff1a; 分析&#xff1a; 乍一看我还以为是贪心&#xff01; 猫 想想感觉没问题 但是局部最优并不能保证全局最优 比如这组数据 19 19 19 19 20 20 20 20如果按照贪心的做法&#xff0c;答案是20*20*2 但是其实答案是19*20*4 因此这道题用贪心是不对的 于是我…

MATLAB 函数签名器

文章目录 MATLAB 函数签名器注释规范模板参数类型 kind数据格式 type选项的支持 使用可执行程序封装为m函数程序输出 编译待办事项推荐阅读附录 MATLAB 函数签名器 MATLAB 函数签名器 (FUNCSIGN) &#xff0c;在规范注释格式的基础上为函数文件或类文件自动生成函数签名&#…

【软件设计师-中级——刷题记录6(纯干货)】

目录 管道——过滤器软件体系结构风格优点&#xff1a;计算机英语重点词汇&#xff1a;单元测试主要检查模块的以下5个特征&#xff1a;数据库之并发控制中的事务&#xff1a;并发产生的问题解决方案:封锁协议原型化开发方法&#xff1a; 每日一言&#xff1a;持续更新中... 个…

分布式锁:四种方案解决商品超卖的方案

一 分布式锁 1.1 分布式锁的作用 在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0c;jdk为我们提供了synchronized关键字和ReentrantLock可重入锁&#xff0c;但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下&#xff…

6 个最佳免费 Android 数据恢复软件

如果您是 Android 用户&#xff0c;您可能会发现没有回收站。然而&#xff0c;聪明的开发人员已经创建了各种 Android 数据恢复软件程序&#xff0c;可以解决各种与数据丢失相关的问题。 Android 数据恢复软件如何工作&#xff1f; 问题是当你删除一个文件时&#xff0c;它的数…

踩坑 | vue动态绑定img标签src属性的一系列报错

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述vue中动态设置img的src不生效问题的原因require is not defined 解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发…