IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQLite3 -> 正文阅读

[大数据]SQLite3

1、数据库

按照数据结构来组织、存放和管理数据的建立在计算机存储设备上的数据仓库。

1.1常见的数据库

  • MySQL :(Oracle)是开源的、一个关系数据库管理系统、服务器是一个快速的、可靠的、易于使用的(1万~1000万)
  • SQL Server:(微软)web上最流行的、主要在windows上运行、比较依赖操作系统、数据访问安全、有强大的web和安全的应用管理、操作比较简单、界面友好(自动增长)
  • Oracle**:(甲骨文)兼容性好、可移植性、可联接性强、生产效率高(有很多工具)、开放性(1000万~10亿)**
  • Sybase:(Sybase)基于客户/服务器结构的数据库、真正开放的、性能高(1万~100万)
  • DB2:(IBM)大型企业应用(可以达到20亿)
  • sqlite:轻量级的开源数据库、很适合应用于嵌入式设备(本地,100~1万)

1.2数据库和数据库管理软件

数据库管理软件:为数据库而设计的电脑软件系统,一般具有存储、截取、安全保障备份等基本功能。

1.3数据库选择

  • Oracle:最贵的、功能最多(安装配置更麻烦)、跨平台性一般、不开源、速度最慢、最安全、开发难度一般
  • MySQL/SQl Server:价格中等(有免费)、功能最少(安装比较方便)、跨平台性不好、不开源、速度中等、安全中等、开发难度相对简单
  • sqlite:免费的、功能一般多(安装特方便)、嵌入式设备中最适合、开源的、速度最快、最不安全、开发简单

2、sqlite

sqlite是一个进程内的数据库,实现了自给自足、无服务器、零配置、事务性的SQL数据引擎,不是独立于进程,可以通过软件和程序去使用这个数据库和访问文件。

特性:

  • 不需要配置、不需要管理和安装
  • sqlite文件是存在一个单一的磁盘文件
  • 非常轻量级,完全配置小于400kb,如果省略某些功能大约只有250kb
  • 可以在unix(linux、mac、OS-X、Android、IOS)和windows(win32、winCE、winPT)

sqlte数据类型

参考:SQLite 简介_SQlite中文网

存储类描述
NULL值是一个 NULL 值。
INTEGER值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB值是一个 blob 数据,完全根据它的输入存储。

3、安装sqlte3

sudo apt-get install sqlite

SQLite Download Page

4、sqlite3程序操作命令

点命令:以点开头、大小写区分的、末尾不需要加分号

(1)在命令行:sqlite3 进入数据库的管理软件

sqlite3 数据库文件名(.db) 不存在就创建,存在就打开

sqlite3 test.db 

(2)在sqlite3的管理软件里面所有的命令都是 .开头

.database 查看当前打开的数据库

.table查看当前数据库的所有表格

退出

.quit .exit

(3)导出数据库

在命令行: sqlite3 数据库文件名 .dump > stu.sql

(4)导入数据库

在命令行: sqlite3 test.db < stu.sql

(5)备份数据库:

.backup xxx.db

(6)、SQLite命令

SQLite 命令_SQlite中文网

命令描述
.backup ?DB? FILE备份 DB 数据库(默认是 “main”)到 FILE 文件。
.bail ON|OFF发生错误后停止。默认为 OFF。
.databases列出数据库的名称及其所依附的文件。
.dump ?TABLE?以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。
.echo ON|OFF开启或关闭 echo 命令。
.exit退出 SQLite 提示符。
.explain ON|OFF开启或关闭适合于 EXPLAIN 的输出模式。如果没有带参数,则为 EXPLAIN on,即开启 EXPLAIN。
.header(s) ON|OFF开启或关闭头部显示。
.help显示消息。
.import FILE TABLE导入来自 FILE 文件的数据到 TABLE 表中。
.indices ?TABLE?显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。
.load FILE ?ENTRY?加载一个扩展库。
.log FILE|off开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。
.mode MODE设置输出模式,MODE 可以是下列之一:csv 逗号分隔的值column 左对齐的列html HTML 的 代码insert TABLE 表的 SQL 插入(insert)语句line 每行一个值list 由 .separator 字符串分隔的值tabs 由 Tab 分隔的值tcl TCL 列表元素
.nullvalue STRING在 NULL 值的地方输出 STRING 字符串。
.output FILENAME发送输出到 FILENAME 文件。
.output stdout发送输出到屏幕。
.print STRING…逐字地输出 STRING 字符串。
.prompt MAIN CONTINUE替换标准提示符。
.quit退出 SQLite 提示符。
.read FILENAME执行 FILENAME 文件中的 SQL。
.schema ?TABLE?显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。
.separator STRING改变输出模式和 .import 所使用的分隔符。
.show显示各种设置的当前值。
.stats ON|OFF开启或关闭统计。
.tables ?PATTERN?列出匹配 LIKE 模式的表的名称。
.timeout MS尝试打开锁定的表 MS 毫秒。
.width NUM NUM为 “column” 模式设置列宽度。
.timer ON|OFF开启或关闭 CPU 定时器。

5、SQL基础命令

SQL语句主要可以划分为以下3个类别

**.**DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create、drop、alter等。

**.**DML(Data Manipulation Languages)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括insert、delete、update和select等。

**.**DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,主要的语句关键字包括grant、revoke等。

SQLite 创建表 | 菜鸟教程 (runoob.com)

(1)创建表

create table name(字段1 类型1,字段2 类型2,…);

create table info (num integer , name text, age integer , score real);

create table info1 (num integer primary key, name text not null, age integer null, score real null);

create table info2 (num integer primary key, name text not null default 'xxxx', age integer null , score real null);

设置字段属性:(放在字段名和类型后面的,如果有多个属性依次往后添加)

①主键 primary key:主键如果没有指定一般会帮你自动补一个,并且多条数据记录的主键不能一样

②空与非空:null , not null

③默认值:default 值

(2)添加数据

--写所有数据:
insert into info (num, name, age, score) values (1, 'wangda', 20, 100.0);
insert into info (num, name, age, score) values (2, "tianer", 21, 100.0);
--写部分数据:
insert into info (num, name, score) values (3, "zsan", 95.5);
insert into info (name, age, score) values ("lisi", 20, 80.0);

INSERT INTO "info" VALUES(1,'wangda',NULL,100.0);
INSERT INTO "info" VALUES(2,'liuer',21,88.0);

(3)查找数据

查看表格所有数据:select * from info;

查看n条数据:select * from info limit n;

升序:select * from info order by age asc;

降序:select * from info order by score desc;

查看数据记录个数:select count(*) from info;

条件查询:

①where:

select * from info where age = 20;

=等于

>大于

<小于

>=大于等于

<=小于等于

<>不等于

select * from info where score in(100, 88);

select * from info where score between 80 and 90;

②like

select * from info where name like ‘w%’;

select * from info where name like ‘tian__’;

(4)删除数据

delete from info where num=4;

delete from info where name=‘lisi’;

(5)更新数据

update info set age=19 where num=3;

update info set age=18 where between 80 and 90;

update info set age=23, score=130.0 where name=‘tianqi’;

(6)删除表格

drop table 表格名称;

(7)新增字段

alter table 表名 add 字段名 数据类型;

【注意:目前sqlite不支持删除已有字段】

(8)更新表名

alter table 原表名 rename to 新名;

(9)查看表的字段

pragma table_info(表名);

6、SQLite - C/C++ 接口

在这里插入图片描述

参考:SQLite - C/C++

序号API & 描述
1*sqlite3_open(const char *filename, sqlite3 *ppDb) 该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。如果 filename 参数是 NULL 或 ‘:memory:’,那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
2*sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char *errmsg) 该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
3sqlite3_close(sqlite3*) 该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。

头文件:#include <sqlite3.h>

(1)打开数据库

int sqlite3_open(const char *filename, //数据库文件名
sqlite3 **ppDb);//数据库句柄指针

(2)执行sql命令

int sqlite3_exec(sqlite3 *db, //已经打开的数据库句柄
const char *sql, //想要执行的sql命令
int (*callback)(void*,int,char**,char**), //回调函数
void *p, //给回调函数传入的参数
char **errmsg);// 错误信息
//回调函数的定义:这个回调函数随着查询过程每找到一个满足要求的数据记录就会调用一遍
int func(void *data, int column, char **value, char **cname) 
void *data:执行sqlite3_exec函数的时候传入的参数 
int column:查询到的每个数据记录有多少个字段的信息
char **value:每个字段的内容
char **cname:每个字段的名字 

(3)关闭数据库

int sqlite3_close(sqlite3*);

7、编译

(1)使用sqlite3的源码进行编译

下载源码:SQLite Download Page

在这里插入图片描述

①先将sqlite3.c和sqlite3.h拷贝到源码路径下

②与主函数代码一起编译

gcc xx.c sqlite3.c -o xx -lpthread -ldl

(2)使用sqlite3的库进行编译

①先安装支持库:libsqlite3

sudo apt-get install libsqlite3-dev

②直接编译:

gcc xxx.c -o xxx -lsqlite3

8、test

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_
int main(int argc, char**argv)
{
     sqlite3 *db=NULL;
     int ret;
     int i=0;
     int nrow=0;
     int ncolumn = 0;
     char *zErrMsg =NULL;
     char **azResult=NULL; //二维数组存放结果
     /* 打开数据库 */
     ret = sqlite3_open("user",&db);
     if( ret != SQLITE_OK)
     {
        /*  fprintf函数格式化输出错误信息到指定的stderr文件流中  */
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));//sqlite3_errmsg(db)用以获得数据库打开错误码的英文描述。
        sqlite3_close(db);
        exit(1);
     }
     else printf("You have opened a sqlite3 database named user successfully!\n");
 
     /* 创建表 */
     char *sql = " CREATE TABLE SensorData if not exists(\
         ID INTEDER PRIMARY KEY,\
         SensorID INTEGER,\
         siteNum INTEGER,\
         Time VARCHAR(12),\
         SensorParameter REAL\
         );" ;
 
      sqlite3_exec(db,sql,NULL,NULL,&zErrMsg);
#ifdef _DEBUG_
      printf("%s\n",zErrMsg);
      sqlite3_free(zErrMsg);
#endif
      /*插入数据  */
      char*sql1 ="INSERT INTO 'SensorData'VALUES(NULL,1,2,201430506201,13.5);";
      sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg);
      char*sql2 ="INSERT INTO 'SensorData'VALUES(NULL,3,4,201530506302,14.5);";
      sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg);
      char*sql3 ="INSERT INTO 'SensorData'VALUES(NULL,5,6,201630506413,18.6);";
      sqlite3_exec(db,sql3,NULL,NULL,&zErrMsg);
 
      /* 查询数据 */
      sql="select *from SensorData";
      sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
      printf("nrow=%d ncolumn=%d\n",nrow,ncolumn);
      printf("the result is:\n");
      for(i=0;i<(nrow+1)*ncolumn;i++)
        {
          printf("azResult[%d]=%s\n",i,azResult[i]);
        }
 
     /* 删除某个特定的数据 */
      sql="delete from SensorData where SensorID = 1 ;";
      sqlite3_exec( db , sql , NULL , NULL , &zErrMsg );
#ifdef _DEBUG_
      printf("zErrMsg = %s \n", zErrMsg);
      sqlite3_free(zErrMsg);
#endif
 
      /* 查询删除后的数据 */
      sql = "SELECT * FROM SensorData ";
      sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
      printf( "row:%d column=%d\n " , nrow , ncolumn );
      printf( "After deleting , the result is : \n" );
      for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
      {
            printf( "azResult[%d] = %s\n", i , azResult[i] );
      }
      sqlite3_free_table(azResult);
#ifdef _DEBUG_
   printf("zErrMsg = %s \n", zErrMsg);
   sqlite3_free(zErrMsg);
#endif
 
      sqlite3_close(db);
      return 0;
 
}

test2

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "sqlite3.h"
//			传入的参数    字段数量   字段内容(二维数组)     字段名称 二维数组
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
	int i;
	for(i=0; i<argc; i++)//打印字段名 记录
	{
		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
	}
	printf("\n");
	return 0;
}

int main(int argc, char* argv[])
{
	sqlite3 *db;
	char *zErrMsg = 0;
	int ret;
	char *sql;

	/* Open database */
	//打开一个数据库文件,没有就创建
	ret = sqlite3_open("test.db",&db);
	if(ret)
	{
		fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
		exit(0);
	}
	else
	{
		fprintf(stderr, "Opened database successfully\n");
	}

	/* Create SQL statement */
	sql = "CREATE TABLE if not exists ipa( \
					id INTEGER  PRIMARY KEY  AUTOINCREMENT , \
					name 		varchar(30) , \
					phone_code 	int 	 not NULL,\
					last_call   varchar(30)  );";
	/* Execute SQL statement */
	ret = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);
    if( ret != SQLITE_OK )
    {
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_free(zErrMsg);
	}
	else
	{
		fprintf(stdout, "Table created successfully\n");
	}

	struct tm *tm;
	time_t  stamp = time(NULL);
	char nowTime[40];
	char SQL[150] = {0};
	for(int i=0;i<10;i++)
	{
		char name[10] = {0};
		char phone_code[15] = {0};
		sprintf(name,"tom%d",i);
		sprintf(phone_code,"%d1234567891",i);
		tm = localtime(&stamp);
		strftime(nowTime,40,"%Y-%m-%d %H:%M:%S",tm);
		sprintf(SQL,"insert into ipa(name,phone_code,last_call) values('%s','%s','%s');",name,phone_code,nowTime);
		ret = sqlite3_exec(db, SQL, NULL, 0, &zErrMsg);
		if( ret != SQLITE_OK )
	    {
			fprintf(stderr, "SQL error: %s\n", zErrMsg);
			sqlite3_free(zErrMsg);
		}
		else
		{
			fprintf(stdout, "insert successfully\n");
		}
	}

	sql = "select * from ipa";
	//执行SQL命令,如果数据库有返回的数据,自动调用回调函数callback
	ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
	if( ret != SQLITE_OK )
    {
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_free(zErrMsg);
	}
	else
	{
		fprintf(stdout, "insert successfully\n");
	}

	sqlite3_close(db);

	return 0;
}
//gcc addressList.c -lsqlite3
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:12:48  更:2022-08-19 19:16:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:37:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码