数据库(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索引开始,后面都是字段的值
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。
文件管理和数据库管理
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索引开始,后面都是字段的值