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

2023-11-08

前言

数据在实际工作中应用非常广泛,数据库的产品也比较多,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也接受如下的数据类型:

数据类型 定义
smallint 16位的整数。
interger 32位的整数。
decimal(p,s) 精确值p是指全部有几个十进制数,s是指小数点后可以有几位小数。如果没有特别指定,则系统会默认为p=5 s=0 。
float 32位元的实数。
double 64位元的实数。
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 list column
.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。

sno sname ssex sage sdept
95001 yikou m 21 cs
95002 peng m 21 cs

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

  • 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还有其他一些子句以及函数的用法,留待下一篇继续介绍。

获取更多关于Linux的资料,请关注公众号「一口Linux」

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在 execl 在输出中不可见之前打印

    include
  • Linux shell 根据第二列对文件进行排序?

    我有一个这样的文件 FirstName FamilyName Address PhoneNumber 如何按 FamilyName 排序 如果这是 UNIX sort k 2 file txt 您可以使用多个 k用于对多列进行排序的标志 例
  • 内核驱动程序从用户空间读取正常,但写回始终为 0

    因此 我正在努力完成内核驱动程序编程 目前我正在尝试在应用程序和内核驱动程序之间构建简单的数据传输 我使用简单的字符设备作为这两者之间的链接 并且我已成功将数据传输到驱动程序 但我无法将有意义的数据返回到用户空间 内核驱动程序如下所示 in
  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud

随机推荐

  • SpringBoot热部署 新版idea找不到Onupdate action

    改动到了这里
  • .metadata是什么项目文件_部署springboot+vue项目文档

    一 部署linux nginx 1 部署后台代码 1 1由于本人采用的是idea工具开发 所以在terminal中mvn clean package生成对应的jar包 此jar包可去对应文件所在目录的target查找 1 2将jar复制到l
  • Java中死锁问题如何排查

    问题描述 在java程序中碰到运行未停止 如何证明是死循环还是死锁问题呢 可以使用Java中自带的命令jps l 用来查看当前运行的进程号 在使用jstack 进程号命令查看当前进程的堆栈信息 死锁代码 class DeadLockRes
  • 二进制安装K8S--etcd

    大致步骤 1 准备lunix 虚拟机两台 一台用来部署etcd apiserver 管理组建 另外一台部署worker 节点 2 操作系统初始化 3 为etcd 和APIserver 准备自签名证书 4 部署etcd 集群 5 部署mast
  • 青橙项目问题Cannot access defaults field of Properties和A child container failed during start

    项目场景 在学习黑马青橙电商项目时 用到了代码生成器 生成完代码后 再往下做的时候就出现了问题 Cannot access defaults field of Properties和A child container failed duri
  • JMeter压力测试 5分钟让你学会如何并发压测接口

    文章目录 地址 下载 启动 使用 地址 JMeter官网下载 https jmeter apache org download jmeter cgi 下载 最新款的jmeter需要java8 的支持 请自行安装jdk8或以上的版本 根据系统
  • Hive sql数据倾斜及性能优化

    一 数据倾斜问题剖析 数据倾斜是分布式系统不可避免的问题 任何分布式系统都有几率发生数据倾斜 当然数据倾斜问题是在亿级数据造成机器无法应付这么多数据 这时发生数据倾斜 最后很难算出结果 hive的原理机制是MR 在MR中最容易出现数据倾斜的
  • 《拖延心理学》

    一 拖延处理技巧汇编 1 确立一个可操作性的目标 可观察 具体而实在的 而不是那种模糊而抽象的目标 不是 我要停止拖延 而是 我要在9月1日之前打扫和整理我的车库 2 设定一个务实的目标 不要异想天开 而要从小事做起 不要过于理想化 而是要
  • mysql mariadb 创建mysql mariadb用户,登录报错

    mysql mariadb 创建energy普通用户 登录mysql报错 access denied GRANT REPLICATION CLIENT PROCESS SELECT ON TO mysqld exporter identif
  • 图像超分算法

    图像超分算法旨在将低分辨率 LR 图像转换为高分辨率 HR 图像 例如将480p分辨率的视频转换为1080p分辨率的视频 常见的图像超分算法包括插值法 基于统计的算法和基于学习的算法 1 插值法 最简单的图像超分方法是插值法 它将LR图像中
  • 【mybatis】mybatis访问报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)...

    mybatis访问报错 org apache ibatis binding BindingException Invalid bound statement not found 需要检查的步骤 1 是否mapper java文件上使用了注解
  • L298N芯片驱动电机

    L298N芯片驱动电机 一 控制原理 L298N可以控制两个电机 具体原理为IN1 IN2 IN3 IN4四个输入端口接收控制器发出的电信号 两个输出端分别控制两组直流电机转动 输入端的逻辑控制表如下 GPIO GPIO 0 GPIO 1
  • dos命令之远程桌面

    echo off 开启服务 net start SessionEnv net start TermService 开机手动启动 sc config SessionEnv start demand sc config TermService
  • Qt的getOpenFileName()函数使用

    Qt的getOpenFileName 函数使用 为了说明QFileDialog getOpenFileName 函数的用法 首先要清楚函数的完整定义 QString QFileDialog getOpenFileName QWidget p
  • 2012淘宝校园招聘笔试

    川大站笔试 本人亲手经历 1个小时的笔试时间 人还是非常多 快没有位置了 选择题考察的面非常广 我记得住的只有下面几道题 1 进程死锁 2 双链表插入节点 3 插座问题 用树的知识解决 4 平衡树的概念 红黑树 B数 AVL树 5 ICMP
  • (转)快速安全的往mysql里插入千万条数据

    来源 ksfzhaohui juejin im post 5da5b568f265da5b6c4bc13d 概述 有个需求解析一个订单文件了 并且说明文件可达到千万条数据 每条数据大概在20哥字段左右 每个字段使用逗号分隔 需要尽量在半小时
  • 安装和建立Oracle18c数据库过程中的一些实践问题

    最近遇到了一个从Visual Studio 2017 中建立tabular project调取Oracle数据库的问题 一 下载并安装Oracle18c 我们可以从Oracle的官网上下载最新的Oracle Database 18c htt
  • 手把手教你hadoop集群配置(详细)

    本博客用到的虚拟机客户机已将前五步完成 从6 开始 现有三台客户机 hadoop112 hadoop113 hadoop114 其中hadoop112已完成JDK Hadoop的安装以及环境变量的配置 所以需要将112上的两者复制到113和
  • vs code因系统更新重启被关闭,找回未保存代码文件

    版权声明 转载请注明作者 独孤尚良dugushangliang 出处 https blog csdn net dugushangliang article details 123527489 win10系统 晚上没关机 点了睡眠 想着后面再
  • 嵌入式数据库sqlite3【基础篇】-基本命令操作,小白一看就懂

    前言 数据在实际工作中应用非常广泛 数据库的产品也比较多 oracle DB2 SQL2000 mySQL 基于嵌入式linux的数据库主要有SQLite Firebird Berkeley DB eXtremeDB 本文主要讲解数据库SQ