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 参数所给的每个命令,直到字符串结束或者遇到错误为止。 | 3 | sqlite3_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, "Can't open database: %s\n", 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;
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");
}
sql = "CREATE TABLE if not exists ipa( \
id INTEGER PRIMARY KEY AUTOINCREMENT , \
name varchar(30) , \
phone_code int not NULL,\
last_call varchar(30) );";
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";
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;
}
|