![b3199c1b47967586a55f4a3fe57998ed.png](https://i-blog.csdnimg.cn/blog_migrate/b7baa87181fd4e31f115d02b14ecd0dc.jpeg)
SQLite 是一个库,实现了无服务器的、零配置的、事务性的 SQL 数据库引擎。
同时SQLite 是在世界上最广泛部署的 SQL 数据库引擎,因此我们一起来看一下sqlite数据库的搭建及入门(Linux版本)
小白请从上向下看,大佬请看最下方的简洁版本谢谢,非战斗人员请离开,嘻嘻。
一、要知道自己的系统中有没有安装
在当前的虚拟机的终端上输入sqlite3 xxx.db
如果出现以下现象就是已经安装:
![fd010b2cdf7b68291f5c4ef68c5aa0b6.png](https://i-blog.csdnimg.cn/blog_migrate/86832108bb9ff0ed70dfe99b63821fd2.jpeg)
如果出现以下现象就是未安装:
![cd0e06873dc77250c41a39a849f72e3f.png](https://i-blog.csdnimg.cn/blog_migrate/715baf4b0191f433dce22835851cdc9b.png)
二、如何安装sqlite3数据库管理系统
1.可以使用更新源中的包进行下载安装:
sudo apt-get install sqlite3
以上这种方式需要你的更新源正常
2.可以选择手动安装
2.1先下载好安装包
![cbc28d95b8174184c6b53b01aeeeab4b.png](https://i-blog.csdnimg.cn/blog_migrate/9c9f4527a8b3bd320a66b561284e9fd0.png)
2.2将安装包放在你的虚拟机中(你可以选择直接拖拽,也可以选择使用samba服务器直接复制到你的虚拟机上的samba服务器共享的文件夹中)
![9d49101711a01e227e8ed0779596c2ef.png](https://i-blog.csdnimg.cn/blog_migrate/a1a68c57846cda0b90ddd94bbac1245a.jpeg)
直接拖拽windows--linux
![2272754290935ae88022405b7db72f38.png](https://i-blog.csdnimg.cn/blog_migrate/bc72913be57fea0ff994c3372ec1624c.jpeg)
使用访问服务器的共享文件夹复制粘贴
2.3解压(使用指令的形式解压)
先ls看一下当前是否有这个压缩包
接下来进行指令解压
tar zxvf sqlite-autoconf-3080301.tar.gz
![ac02ee1cb2d2291ae80c425ccf2ccaee.png](https://i-blog.csdnimg.cn/blog_migrate/97c61063b919536639eea5ea946e3df3.png)
这个时候你ls看一下,当前就应该有一个解压好的文件夹
![510653edcbf07e27c5fbd3054d172b41.png](https://i-blog.csdnimg.cn/blog_migrate/9599c1c699b5ce1e6036b4795501427e.png)
2.4进入到解压好的文件夹中
cd sqlite-autoconf-3080301
![79a5bc2603a43ec6deb127e9f34a2300.png](https://i-blog.csdnimg.cn/blog_migrate/8422e2d433c14805a208f8e2306d94d1.png)
2.5输入./configure
![2a25880f57e30e7ab17735dc5bb2b7ff.png](https://i-blog.csdnimg.cn/blog_migrate/c707780a1e981d2ec4065bcc9d95c936.jpeg)
2.6输入sudo make install
如果需要密码:123456(记住这个密码输入的时候是没有回显的)
![18e222fcd102a894c8a01d282a54e32c.png](https://i-blog.csdnimg.cn/blog_migrate/c944453b195ba1d45a4a8860f709766f.png)
如果出现正在离开,就表示成功
![20da49f34da429a9972252e24de463bb.png](https://i-blog.csdnimg.cn/blog_migrate/1733d095ee0b4b8cf882fadf87aa2abf.png)
如果发现载sudo make install的时候卡住了不动,只需要敲ctrl+c退出,再按下上键就回车
也就是重新make
这个时候基本上你已经完成了数据库的安装,但是有可能给你安装了多个版本的包
这个时候我们可以测试以下:
在终端上敲 sqlite3 haha.db
看一下进不进入
![22f6eb29c0f2d5f105eba6a1bd22da8d.png](https://i-blog.csdnimg.cn/blog_migrate/ffbf64e01c98da50c197f0d0d1e505bc.png)
如何解决多版本问题:
sudo cp /usr/local/lib/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu
sudo cp /usr/local/lib/libsqlite3.so.0 /usr/lib/i386-linux-gnu
再去测试 sqlite3 haha.db 就发现可以了
在当前的虚拟机的终端上输入sqlite3 xxx.db
如果出现以下现象就是已经安装:
![62dde8d4f8a374e6ffdd26ae08bb2fff.png](https://i-blog.csdnimg.cn/blog_migrate/7abe3cbde7f5dea4e0b563273eb769a1.jpeg)
简洁版本:
1.将压缩包拷贝到虚拟机中
2.使用cd xxx进入到你的拥有压缩包的位置文件夹中(使用终端)
3.解压:
tar zxvf sqlite-autoconf-3080301.tar.gz
4.进入到解压好的文件夹中
cd sqlite-autoconf-3080301
5.运行脚本
./configure
6.make
sudo make install
如果让让你输入密码就是123456
7.拷贝解决多版本问题
sudo cp /usr/local/lib/libsqlite3.so.0.8.6 /usr/lib/i386-linux-gnu
sudo cp /usr/local/lib/libsqlite3.so.0 /usr/lib/i386-linux-gnu
文件下载地址:
链接:https://pan.baidu.com/s/1fYJi7crzO1EbVgxQJl7asQ
提取码:xsxp
发布于 2020-04-21
接下来我们开始sqlite3数据库的入门使用及sqlite c编程的学习
在物联网的小项目中我们经常使用到数据库,无论是物联网服务器上的存储还是硬件设备的本地存储。因此本章鑫哥带小伙伴们来搞一搞我们嵌入式+物联网中典型的一个数据库-sqlite3
sqlite3数据库
1.sqlite3的特殊指令(都是以.开头的)
1.1打开数据库
sqlite3 xx.db
使用sqlite3管理系统打开文件名叫做xx的数据库文件
.db表示数据库文件后缀
![c61c2f894bfce65fd24b0afa60899fd8.png](https://i-blog.csdnimg.cn/blog_migrate/8ed84356e3effa64445115860335d6d0.png)
1.2退出数据库
.quit或者.exit
![ee0c3228a3e0efe314b732baa6977e32.png](https://i-blog.csdnimg.cn/blog_migrate/de7b457ce21a093d2ed18ad423e2167d.png)
1.3查询信息
.database
![8a9f765b7c9593dc0f368b3dc3118145.png](https://i-blog.csdnimg.cn/blog_migrate/12af77f192bea8aaec2793a7bd385692.png)
1.4查询显示数据库中所有的表
.tables 或者 .table
![50c59e9e889970ae39f95941e34ea61b.png](https://i-blog.csdnimg.cn/blog_migrate/72765edf22ea3171fb6efefa2da29a3a.png)
1.5查询显示创建表的结构
.schema xxx xx表示表名称,这个时候就是
查看显示xxx表的结构,如果不写xxx这个时候查的是所有表
表的结构就是你创建表的那句话
![1ff0c8e720044344b4e71ad20c538411.png](https://i-blog.csdnimg.cn/blog_migrate/468887e31b8d23117fcc7dbeafdda7e9.png)
2.sql语句(sql中的语言)
增删改查:
新建修改删除表
插入修改删除行
查询
2.1新建一张数据表
语法:
create table 表的名称 (列名称 列数据类型, 列名称 数据类型);
例如:
create table persons (id int, name text);
创建一张表 表名为persons 表中两列 分别为id(int类型的)、name(文本类型的)
![0a941c9aa896a0b343503b9a1dbdc7c2.png](https://i-blog.csdnimg.cn/blog_migrate/7f167ee76d90443b3f2248343855f76d.png)
创建成功就是没有反应的
3.修改表的结构
语法:alter table 表名 rename to 新表名; (修改表的名称)
alter table 表名 add 列名 数据类型; (修改表的结构,添加新的一列)
在sqlite3中没有直接删除一列的sql语句,我们可以先新建一个表,将原表中除了你想删除的那列以外的所有列复制粘贴到新表中,删除旧表,将新表名设置为老表名。
![98f3485c8d36dc89e688ebc7a305bd68.png](https://i-blog.csdnimg.cn/blog_migrate/bc6b7efd5069c1dda3f38b17034eb68b.png)
![7678320bb671b30f3a930b1d8045f602.png](https://i-blog.csdnimg.cn/blog_migrate/56fac0c52e586af00af1fff59b1a5f72.png)
4.删除表
语法: drop table 表名 ;
![9f934167dee8ba13e302683263347bbd.png](https://i-blog.csdnimg.cn/blog_migrate/b87d7b5274985643da20ef28b4e40f12.png)
5.插入新的一行数据
语法:
insert into 表名 values (列值1,列值2.....); 全部赋值
insert into 表名 (列名称,列名称) values ( 对应的列值);部分赋值
例如:(切记插入的过程中列值为字符串需要用" ")
![5e63967a777312b63fb0904e23e6247b.png](https://i-blog.csdnimg.cn/blog_migrate/414a2bb2ac7bccde1dc95930e421b2c7.png)
6.修改行中数据
语法:
update 表名 set 列名称 = 列值 匹配条件;
例如: 修改haha表中name那一列设置为文静,当你的id为10的那一行
![cc2f7cbd8cb2d9da4d23a06e8b70c9f3.png](https://i-blog.csdnimg.cn/blog_migrate/02a2e34bd3e004f4158a2010969e0b37.png)
7.删除表中一行数据或者匹配到的多行数据
语法:
delete from 表名 where 匹配条件;
例如:删除name为张鑫的那一行
![ec9a102a400acc6d66f527ea35c0def7.png](https://i-blog.csdnimg.cn/blog_migrate/cfc315eb4542aba27c5f9ca82b228bc6.png)
8.查询
语法:
select 列名 from 表名 where 匹配条件;
例如:
select name from haha where id >10;
查看显示结果集表 只看name这一列 在haha表中 id大于10的
select * from haha;
查看显示结果集表 所有列 在haha表中的所有 条件;
*表示所有列
9.数据库的匹配条件的提高版
例如:我们要进行使用用户名、密码进行登录,如果表中有你这个用户名且对应的密码一样,就可以让你登录
select *from haha where id =lanzhou and passwd = 123456;
如果你有显示,也就是查到东西了,这个时候你就可以登录了
常见的匹配条件:
in、and、or、between and、like模糊查找、not(取其补集)
where的高级用法:
in:
允许在where子句中规定多个值
语法:
where 列名称 in( 列值1,列值2,.....);
select *from haha where id in (1,2,3,4);
and:
多个条件结合起来,且
select *from haha where id =lanzhou and passwd = 123456;
or: 或
select *from haha where id =lanzhou or passwd = 123456;
between and:
between A and B,会选取A到B之间的数据
select *from haha where id between 1 and 3;
like:
模糊查找、像,一般用于地址、姓名
select *from haha where id like 3; select *from haha where addr like "%zhou%";
%zhou%表示你的地址中带有zhou的
%表示通配
例如:姓张的人 "张%"
名字带张就行 "%张%"
not:取补集
select *from haha where id not in (1,2,3,4);
排序:
根据指针的列结果集表进行排序
默认按照升序的进行排序的,可以使用关键字desc(降序)
升序:
select*from haha order by 列名;
降序:
select *from haha order by 列名 desc;
例如:
select *from haha order by id;
如何进行添加新的数据从一个旧的表中
insert into 新表 select 列名 from 旧表;
前提条件:当前的新表中有这个列名称及对应的数据类型
![769a95a87ffd39aaa5cb37b02be63ec0.png](https://i-blog.csdnimg.cn/blog_migrate/d5e904137ec2e27ddcd273519bc8e858.png)
小练习:
1.打开一个名为haha的数据库
sqlite3 haha.db
2.新建一张数据表,表名为persons,拥有以下几列
id int , name text,addr text
create table persons (id int, name text, addr text);
3.向表内插入新的一列 sex text
alter table persons add sex text;
4.向表persons插入两行数据
id为10 name为qianfeng
id为12 name为haha addr为beijing
insert into persons (id,name) values (10,"qianfeng");
insert into persons(id,name,addr) values(12,"haha","beijing");
5.将persons表名更改为qianfeng
alter table persons rename to qianfeng;
6.将qianfeng表中id为12的行里面的addr设置为shandong
update qianfeng set addr = "shandong" where id = 12;
7.插入新的一行数据
id为15 name为xixi addr为beijing sex为man
alter table qianfeng add sex text; insert into qianfeng values(15,"xixi","beijing","man");
8.查看显示所有列,在qianfeng表中id大于10的
select * from qianfeng where id >10;
9.修改qianfeng表中,id在10到14之间的行中 addr 为zb
update qianfeng set addr = "zb" where id between 10 and 14;
10.删除qianfneg表中addr中带有字母n的所有行
delete from qianfeng where addr like "%n%";
数据库控制
我们的数据库一般都存放在我们的系统的内存上,以文件的形式
一般情况下对文件进行操作,主要有打开、读、写、关闭
我们对数据库的操作也是打开、读、写、关闭,只不过我们使用的是数据库库函数
1.对数据库打开操作:
SQLITE_API int sqlite3_open(
const char filename, / Database filename (UTF-8) */
sqlite3 ppDb / OUT: SQLite db handle /
);
参数 :
你要打开的文件名,文件名是一个字符串,需要" "
数据库句柄的地址(指针)
以上函数表示的就是打开这个数据库文件,放入到句柄的中
因为你传递的参数是句柄的地址,因此我可以改变句柄的内容
返回值:
如果当前的函数成功运行,就会返回一个SQLITE_OK
编写代码之前我们需要进行一些准备工作:
1.需要保证当前的文件夹内有一个sqlite3.c 和sqlite3.h这两个文件
![a8129133eb08b61aab54d909d120ffdb.png](https://i-blog.csdnimg.cn/blog_migrate/86a4230858cbf2c02363b99a6472a6b6.png)
这个时候你就可以敲代码了
//1.包含头文件
2.对数据库关闭操作
SQLITE_API int sqlite3_close(sqlite3*);
参数:
数据库句柄db
返回值:
如果当前的函数成功运行,就会返回一个SQLITE_OK
编写代码:
//1.包含头文件
![aa1a63e1122f47030c115248156cc9f8.png](https://i-blog.csdnimg.cn/blog_migrate/8f3f059e2794b3c294b3f16369c7b736.png)
3.对数据库写操作
SQLITE_API 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 /
);
参数:
打开的数据库句柄
sql语句字符串
同时调用的函数名称 一般写NULL
传递给函数的参数 一般写NULL
错误信息的存储位置
返回值:
如果当前的函数成功运行,就会返回一个SQLITE_OK
代码编写:
#include
4.对数据库读操作
SQLITE_API int sqlite3_get_table(
sqlite3 db, / An open database */
const char zSql, / SQL to be evaluated */
char *pazResult, / Results of the query /
int pnRow, / Number of result rows written here */
int pnColumn, / Number of result columns written here */
char pzErrmsg / Error msg written here /
);
参数:
你打开的数据库句柄 --------也就是你要对哪个数据库进行读操作;
你要进行读操作的SQL语句(查)
查询到的结果集表的地址
你查到的结果集表的行数(查询到的数据行数)
你查到的结果集表的列数(查询到的数据列数)
错误信息
返回值:
如果当前的函数成功运行,就会返回一个SQLITE_OK
#include
使用实例:
1.需求流程
首先让你输入一个表名
按照你的表名去创建一个新的表,id int ,name text 两列
让你输入id和name
然后插入到你这个刚刚建立的表中
然后查询你刚刚输入的id对应的名字
2.心理变化
我不管干嘛,只要对数据库操作就先打开数据库
获取键盘输入的表名
组一个创建表的sql语句(这个语句是一个写操作)
使用写的操作去向数据库发送--sqlite3_exec
因为后面还用数据库因此不关数据库
获取键盘输入的id和name
组一个插入新的一行的sql语句(这个语句是一个写操作)
使用写的操作去向数据库发送--sqlite3_exec
因为后面还用数据库因此不关数据库
组一个查询的sql语句查name匹配id(这个语句是一个读操作)
使用读的操作去向数据库发送--sqlite3_get_table
打印读取到的内容
关闭数据库
代码:
#include <stdio.h>
#include "sqlite3.h"
int main(int argc, char const *argv[])
{
sqlite3*db; int ret = sqlite3_open("xixi.db",&db); if (ret !=SQLITE_OK) { perror("SQLITE_OKn"); return 0; } char table_name[50] = ""; printf("请输入你要创建的表n"); scanf("%s",table_name); // 2.写一个创建表的sql语句. //再去定义一个数组用来保存我重新组的新字符串 char cmd[100] = ""; sprintf(cmd,"create table %s (id int ,name text);",table_name);//完成了一个组包的操作 // 3.看自己是读操作还是写操作 // 如果是写操作就使用sqlite3_exec // 如果是读操作就使用sqlite3_get_table // 4.调用就行了 char *errmsg = NULL; sqlite3_exec(db,cmd,NULL,NULL,&errmsg); if (errmsg != NULL)//如果我们出现错误就会打印errmsg { printf("%sn", errmsg); } int id = 0; char name[50] = ""; printf("请输入你的idn"); scanf("%d",&id); printf("请输入你的namen"); scanf("%s",name); char cmd2[100] = ""; sprintf(cmd2,"insert into %s values(%d,'%s');",table_name,id,name);// '就相当于引号 sqlite3_exec(db,cmd2,NULL,NULL,&errmsg); if (errmsg != NULL)//如果我们出现错误就会打印errmsg { printf("%sn", errmsg); } char cmd3[100] = ""; sprintf(cmd3,"select name from %s where id = %d;",table_name,id); char **table = NULL;//用来存放你数据库查到的结果 int r,c;//r行数 c列数 sqlite3_get_table(db, cmd3,&table,&r,&c,&errmsg); if (errmsg != NULL)//如果我们出现错误就会打印errmsg { printf("%sn", errmsg); } printf("%sn", table[1]); //由于你只有1列,最上方的列名是table[0],因此你的name就是tabel[1] char cmd4[100] = ""; sprintf(cmd4,"select * from %s; ",table_name); sqlite3_get_table(db, cmd4,&table,&r,&c,&errmsg); if (errmsg != NULL)//如果我们出现错误就会打印errmsg { printf("%sn", errmsg); } int i,k; for (i = 0; i < r+1; ++i)//r+1是因为多出来一个列名一行 { for (k = 0; k < c; ++k) { printf("%s", table[i*c+k]); } printf("n"); } printf("n"); sqlite3_close(db); return 0; }
你查询得到的是一张表,有行有列的
![720544788dba08abad82f0f5fa603a15.png](https://i-blog.csdnimg.cn/blog_migrate/8cbd8315dc12c0da2b05f704ebc4980a.png)
如何进行数据库代码的编写:
1.看自己需要进行什么操作;
收集一下自己需要到的变量(数据)
2.组一个操作的字符串(sql语句)
3.打开数据库
4.思考我们当前的数据库操作是读还是写(增删改都是写操作,读就是查操作)
5.对应的调用一下函数将自己的sql语句发给数据库
6.看一下自己还要进行什么操作
7.关闭数据库
如何组包:
1.收集好自己要往包中组的数据
![c845286ed672df1adbad32772d90b82c.png](https://i-blog.csdnimg.cn/blog_migrate/2c6b6804021f5b6c1f51b2135c277939.png)
2.开始组包
![7373cdff66a453ad3b1c9c8b0b871b2d.png](https://i-blog.csdnimg.cn/blog_migrate/4279a0cf0176b0de3dc24455244ae6e3.png)
为什么要传递&取地址:
传递取地址都是指针传递(参数的传递):可以更改其内容
![8f30b8467bec107b0f5cbe73afc1ef7f.png](https://i-blog.csdnimg.cn/blog_migrate/8a44e6ccf4db9cc7786c3fb265949df3.png)
我们使用代码验证一下:
![7996cc13cff60a3a324199a5763d7d72.png](https://i-blog.csdnimg.cn/blog_migrate/79c40e5ce331f01362ae59fc88a094fb.png)
![6365f94bec7135e4dfeb5b4e84ab4c81.png](https://i-blog.csdnimg.cn/blog_migrate/8c002b819ae7ab083867730fe441778a.png)
如何排错:
1.看函数的返回值,如果函数的返回值是SQLITE_OK就说明当前函数运行的没有问题
如果有问题,打印一下错误信息 perror("sqlite3_openn");
2.如果你的返回值是SQLITE_OK,如果还是有问题,这个时候我就去看errmsg
也就是,如果你的sql语句出问题,你出了什么问题就会在errmsg中进行存储
printf("%sn",errmsg);
以上就完成了对sqlite3环境安装、sqlite3数据库指令、SQL语句、sqlite c编程的学习,欢迎小伙伴留言交流谢谢~