小数据库sqlite3

来源:互联网 发布:wind数据 编辑:程序博客网 时间:2024/06/17 16:10
数据库(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索引开始,后面都是字段的值

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿吐水和奶花怎么办 刚刚出生的宝宝拉肚子怎么办 刚出生的婴儿拉肚子怎么办 新生儿5天拉稀水怎么办 10个月孩子拉肚子怎么办 不满月的宝宝拉肚子怎么办 一周岁宝宝发烧腹泻呕吐怎么办 6个月宝宝37度怎么办 1岁宝宝发烧37.2怎么办 新生儿发烧37度3怎么办 两个月宝宝抵抗力差怎么办 6月宝宝着凉拉稀怎么办 六个月的宝宝拉肚子怎么办 衣服颜色太深了怎么办 一多半宝宝爱喝水不爱吃饭怎么办 十个月宝宝不爱吃饭怎么办 十个月宝宝突然不爱吃饭怎么办 二十个月宝宝不爱吃饭怎么办 十个月的宝宝不爱吃饭怎么办 6年级学生数学差怎么办 打印机打不出来就是一张白纸怎么办 wps表格下拉数字不递增怎么办 wps表格圈怎么打出来怎么办 手表固定圈掉了怎么办 起来觉得头晕头胀怎么办? 孩子不好好写作业怎么办 孩子考试考差了怎么办 孩子计算题马虎大意怎么办 二年级孩子不认字怎么办 发现计算上的错误怎么办 孩子不好好做作业怎么办 手破了红肿了怎么办呢 老师反应孩子在校粗心胆小怎么办 四年级的学生计算粗心怎么办 老打孩子骂孩子怎么办 站久了脚肿了怎么办 孩子初中了书写越来越潦草怎么办 给孩子自由孩子无法无天怎么办 孩子挑食幼儿园老师该怎么办 老师说孩子挑食家长怎么办 工作中老是粗心不细心怎么办