小数据库sqlite3

数据库(Database)
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。


文件管理和数据库管理


A.文件管理阶段
优点 : (i)数据可长期保存
(ii)能存储大量数据


缺点: (i)数据冗余度(redundancy)是指数据在存储器中的不必要的多次重复存储。
数据一致性(consistency)、完整性(integrity)难以维持
(ii)数据与程序缺乏高度独立性


B.数据库系统阶段
(i)数据组织结构化
(ii)数据冗余度比较小,易扩充
(iii)具有较高的数据与程序之间的独立性
(iv)统一的数据控制


常用的数据库介绍
A.大型数据库
Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
IBM的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包括Linux在内的一系列平台。


B.中型数据库
SQLServer是微软开发的数据库产品,主要支持windows平台。


C.小型数据库
mysql是一个小型关系型数据管理系统,开发者为瑞典mysql AB公司,2005年被sun公司收购。开放源码。


D.基于嵌入式Linux的数据库(微型数据库)
<1>.基于嵌入式linux的数据库主要有SQLite,Firbird,Berkeley DB,extremeDB
<2>.Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
<3>.SQLite关系型数据库,体积小,支持 ACID(原子性、一致性、独立性及持久性 Atomicity、Consistency、Isolation、Durability)事物。
<4>.Berkeley DB中并米有数据库服务器的概念,它的程序库直接连接到应用程序中
<5>.extremeDB是内存数据库,运行效率高 ??


sqlite数据库(开源)
是一款轻型的数据库。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用它,它占用资源非常低,在嵌入式设备中,
可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等主流操作系统,同时能够跟很多程序语言相结合,如c/c++,java,php,python等;
特点:
1.零配置
2.支持数据库大小至2TB
3.足够小,大致13万行C代码。4.43M
4.源码完全开源
5.简单轻松的API
……


git clone https://github.com/torvalds/linux.git
1.下载安装sqlite3数据库
sudo apt-get update //更新软件源
sudo apt-get install sqlite3 //下载并安装sqlite3,数据库


下载源码后执行
./configure --prefix=/home/fs/Downloads/bin 指定安装目录
make install


2.sqlite中的数据类型
sqlite数据库中的数据一般由以下几种常用的数据类型组成
NULL :标识一个NULL值
INTERGER:整数类型 int
REAL:浮点数 float,double
TEXT:字符串
BLOB:二进制数 010101


sql语句 所有数据库通用语句
sqlite 提供的编程接口


3.创建数据库
$ sqlite3 test.db 
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>


(1)进入到此界面可以输入
sqlite> .help 寻求帮助


(2)一旦数据库创建好之后
可以使用.database命令检查它是否在数据库列表中
sqlite> .database
seq  name             file                          
0    main             /home/fs/sql/man.db


(3)可以使用.quit退出sqite提示符
sqlite> .quit


(4)修改mode和header
.mode column
.header on
 
补充:
可以在命令提示符中使用 .dump命令来导出完整的数据库在一个文本文件中,如下所示:
$sqlite3 test.db .dump > testDB.sql  //备份;----------------------------------
上面的命令将转换整个 testDB.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 testDB.sql 中。您可以通过简单的方式从生成的 testDB.sql 恢复
$sqlite3 test.db < testDB.sql     //恢复备份


4.sqlite创建表
create table table_name(column1 type1, column2 type2, column3 type3……);
table_name:表名
columnx:数据表内字段名
type:字段类型名(省略type语法上是可以通过的)         字段   字段的类型
eg:create table if not exists student(student_name txt, id txt, sex char);


当然数据类型也是可以省略!
eg:create table if not exists student(student_name , id, sex);
num integer primary key autoincrement :自增      //primary key 主鉴:不能重复,正常情况下也不为空;


创建好表后可以使用.schema命令查看表的结构
sqlite> .schema <tablename>
创建好表后可以使用.tables命令查看数据库内所有的表
sqlite> .tables


5.sqlite删除表
drop table table_name;
sqlite> drop table student;


6.向表中添加纪录
insert into table_name(column1, column2, column3) values(val1, val2, val3);
insert into student(student_name, id, sex) values ('z3', '123', 'm');//在这字符串可以用单引号,和双引号一样的作用;
或者
insert into student values('z3', '123', 'm');


7.查询数据记录
select columns from table_name [where experssion];
如果您想获取所有可用的字段,那么可以使用下面的语法:
select * from table_name;
如果只想获取 student 表中指定的字段,则使用下面的查询:
select name,id from student;
a.查询输出所有数据记录
select * from table_name;
b.限制输出数据记录数量
select * from table_name limit val;
c.升序输出数据记录
select * from table_name order by column asc;
d.降序输出数据记录
select * from table_name order by column desc;
e.条件查询
select * from table_name where expression;
select * from table_name where column in ('val1', 'val2', 'val3');
select * from table_name where column between val1 and val2;
select * from people where age>=10 and age <=15;
select name, age from people where age>= 10 and age<=15;


8.修改数据记录
update table_name set column1=val1, column2=val2 where expression;
where是sql语句中用于条件判断的命令,expression为判断表达式
例,修改学生信息表学号为0001的数据记录:
update student_info set stu_no=0002, name=hencai where stu_no=0001;


9.在表中添加字段
sqlite>alter table <table_name> add column <field> <type>;


alter table stu add column age interger;


10.删除数据记录
delete from table_name [where expression];
不加判断条件则清空所有数据记录
eg:
delete from stu where id=123;


11.删除指定字段
step1:alter table info rename to temp; //备份为temp
step2:create tabel info(id, name, age); // 创建新表
step3:insert into info select id, name, age from temp;导出到新表


练习:
1.创建一个员工的数据库,
2.在里面添加新的数据表,
表中包含姓名,工号,薪水(salary)……
3.向数据表中添加几个数据
4.练习查询
5.添加表项性别字段
6.更新数据库员工的年龄信息
7.删除工号为***的员工
8.备份数据库资料


====================================================
gcc xx.c -o xx -lsqlite3
打开数据库的API如下:
int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
功能打开/创建数据库。
这里会引入一个非常复杂的sqlite3的数据结构。这个根据需要以后酌情了解些。
返回值 成功返回SQLITE_OK(0)


打开数据库除了这种形式意外,还有sqlite3_open、sqlite3_open16、sqlite3_open_v2几种形式,基本上类似。


int   sqlite3_close(sqlite3 *db);
        功能:关闭sqlite数据库
        返回值:成功返回0,失败返回错误码


const  char  *sqlite3_errmsg(sqlite3 *db);
        返回值:返回错误信息


大部分sql操作都可以通过sqlite3_exec来完成,它的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 */
);


回掉函数:
在一个函数里调用指定的另一个函数的方式(格式规定)
 


各个参数的意义为:


        sqlite3描述的是数据库句柄
        sql 要执行的SQL语句
        callback回调函数
        void *回调函数的第一个参数
        errmsg错误信息,如果没有SQL问题则值为NULL


回掉函数的本质是“你想让别人的代码执行你的代码,而别人的代码你又不能动”


回调函数式一个比较复杂的函数。它的原型是这样的:
int callback(void *params,int column_size,char **column_value,char **column_name){


 


每一个参数意义如下:


        params是sqlite3_exec传入的第四个参数
        column_size是结果字段的个数
        column_value是返回记录的一位字符数组指针
        column_name是结果字段的名称


通常情况下callback在select操作中会使用到,尤其是处理每一行记录数。返回的结果每一行记录都会调用下“回调函数”。 
如果回调函数返回了非0,那么sqlite3_exec将返回SQLITE_ABORT,并且之后的回调函数也不会执行,同时未执行的子查询也不会继续执行。


对于更新、删除、插入等不需要回调函数的操作,sqlite3_exec的第三、第四个参数可以传入0或者NULL。


通常情况下sqlite3_exec返回SQLITE_OK=0的结果,非0结果可以通过errmsg来获取对应的错误描述。


int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results written to a char *[] that points to*/
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);
void sqlite3_free_table(char **result); 跟sqlite3_get_table一起用,释放内存;


复制代码


第1个参数不再多说,看前面的例子。
第2个参数是sql 语句,跟sqlite3_exec 里的sql 是一样的。是一个很普通的以\0结尾的char*字符串。
第3个参数是查询结果,它依然一维数组(指针数组)(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:字段名称,后面是紧接着是每个字段的值。下面用例子来说事。
第4个参数是查询出多少条记录(即查出多少行,不包括字段名那行)。
第5个参数是多少个字段(多少列)。
第6个参数是错误信息,跟前面一样,这里不多说了。


pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),因为前(*pnColumn)个是字段名


gettable 获取数据内存分布
内存分布:
字段名1
字段名2
字段名3
……
-------------
字段名1 -> 值1
字段名2 -> 值1
字段名3 -> 值1
……
--------------
字段名1 -> 值2
字段名2 -> 值2
字段名3 -> 值2
……
--------------
字段名1 -> 值3
字段名2 -> 值3
字段名3 -> 值3
……
从第0索引到第ncolumn-1索引都是字段的名称
从第ncolumn索引开始,后面都是字段的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值