1.数据库管理系统数据模型
数据库管理系统采取的数据模型主要有:层次模型、网状模型、和关系模型。
层次模型是一种典型的树状结构,早期使用
特点:
1、有且仅有一个节点,无父节点,这个节点被称为根节点。
2、其他节点有且仅有一个父节点。
3、同一个父节点的子节点被称为兄弟节点。
4、没有子节点的节点被称为叶节点
优点
(1)数据结构简单清晰
(2)查询效率高(优于关系数据库,不低于网状数据库)
(3)良好的完整性支持
缺点
(1)对非层次性的联系不适用
(2)当一个结点具有多个双亲结点时,只能通过引入冗余数据或引入虚拟结点解 决,对插入和删除操作的限制比较多
(3)查询子女结点必须通过双亲结点
(4)层次命令不灵活
网状模型构成了比层次模型更加复杂的网状结构
特点:
1、允许一个以上的节点无父节点
2、一个节点可以有多个的父节点
优点:
- 网状数据模型可以很方便的表示现实世界中的很多复杂的关系;
- 修改网状数据模型时,没有层次状数据模型的那么多的严格限制,可以删除一个节点的父节点而依旧保留该节点;也允许插入一个没有任何父节点的节点,这样的插入在层次状数据模型中是不被允许的,除非是首先插入的是根节点;
- 实体之间的关系在底层中可以借由指针指针实现,因此在这种数据库中的执行操作的效率较高;
缺点:
- 网状数据模型的结构复杂,使用不易,随着应用环境的扩大,数据结构越来越复杂,数据的插入、删除牵动的相关数据太多,不利于数据库的维护和重建。
- 网状数据模型数据之间的彼此关联比较大,该模型其实一种导航式的数据模型结构,不仅要说明要对数据做些什么,还说明操作的记录的路径;
关系模型数据的逻辑结构是一张二维表,使用表格表示实体和实体之间关系的数据模型称之为关系数据模型
一行为一个对象成员,每一列为对象的一个属性
特点:
1、每一列的分量是类型相同的数据。
2、列的顺序是任意的
3、行的顺序是任意的
4、表的分量是不可分割的最小数据项,即表中不允许有子表。
优点:
- 结构简单,关系数据模型是一些表格的框架,实体的属性是表格中列的条目,实体之间的关系也是通过表格的公共属性表示,结构简单明了;
- 关系数据模型中的存取路径对用户而言是完全隐蔽的,是程序和数据具有高度的独立性,其数据语言的非过程化程度较高;
- 操作方便,在关系数据模型中操作的基本对象是集合而不是某一个元祖;
- 有坚实的数学理论做基础,包括逻辑计算、数学计算等;
缺点:
- 查询效率低,关系数据模型提供了较高的数据独立性和非过程化的查询功能 (查询的时候只需指明数据存在的表和需要的数据所在的列,不用指明具体的查找路径),因此加大了系统的负担;
- 由于查询效率较低,因此需要数据库管理系统对查询进行优化,加大了 DBMS 的负担;
关系数据模型的三种约束完整性:
关系数据模型定义了三种约束完整性:实体完整性、参照完整性以及用户定义完整性。
实体完整性:实体完整性是指实体的主属性不能取空值。实体完整性规则规定实体的所有主属性都不能为空。实体完整性针对基本关系而言的,一个基本关系对应着现实世界中的一个主题,例如上例中的学生表对应着学生这个实体。现实世界中的实体是可以区分的,他们具有某种唯一性标志,这种标志在关系模型中称之为主码,主码的属性也就是主属性不能为空。
参照完整性:在关系数据库中主要是值得外键参照的完整性。若 A 关系中的某个或者某些属性参照 B 或其他几个关系中的属性,那么在关系 A 中该属性要么为空,要么必须出现 B 或者其他的关系的对应属性中。如上表中的选课关系的 stu_id 和 cour_id 分别是参考学生和课程的外键,那么对于现实的系统而言,stu_id 和 cour_id 必须分别出现在学生和课程关系中,这就是外键参考的完整性,同时删除的时候根据设置的不同有不同的处理方式。
用户定义完整性:用户定义完整性是针对某一个具体关系的约束条件。它反映的某一个具体应用所对应的数据必须满足一定的约束条件。例如,某些属性必须取唯一值,某些值的范围为 0-100 等。
关系数据库采用关系模型作为数据的组织形式
2.SQLite安装
SQLite3 :sudo apt-get install sqlite3
图形界面: sudo apt-get install sqlitebrower
3.SQLite数据类型
一般数据采用固定的静态数据类型,而SQlite采取动态数据类型,会根据存入值自动判断。
五种基本类型:
1、integer:带符号的整型(最多64位)。
2、real:8字节表示的浮点类型。
3、text:字符类型,支持多种编码(如UTF-8,UTF-16),大小无限制。
4、blob:任意的数据类型,大小无限制。使用二进制保存数据。
5、null:表示空值
注:所有的SQL语句都是分号结尾,SQL语句不区分大小写。两个减号“--”则代表注释。
4.SQLite3使用方法
1、创建、打开数据库:
sqlite3 xxx.db
2、退出数据库
.quit或者.exit
3、查看表
.table
4、查看表(带数据类型)
.schema
4、列名显示
.header on
5、左对齐列
.mode column
5.SQL语句
1、创建表:create 语句[设置主键]
设计表时,每个表都可以通过primary key 手动设置主键,每个表只能有一个主键,设置为主键的列数据不可重复。
语法:create table 表名(列名1 数据类型 primary key,列名2 数据类型,列名3 数据类型);
create table persons (id integer primary key, name text, addr text) ;
2、修改表:alter语句
在已有的表中添加或删除列以及修改表名
增加列
语法:alter table 表名 add 列名 数据类型;
alter table persons add sex text;
修改表名
alter table 表名 rename to 新表名;
alter table persons rename to new_persons ;
3、 删除表
用于删除表(表的结构、属性以及表的索引都会被删除)
语法:
drop table 表名称;
drop table persons;
4、 插入新行:insert into 语句
给一行的所有列赋值。
语法: insert into 表名 values (列值1,列值2,列值3 ,列值4,...);
当列值为字符串时,要加“ ”或 ' '
insert into persons values (1,'lucy','beijing');
给一行个别列赋值。
语法: insert into 表名(列名1,列名3) values (列值1,列值3 );
insert into persons(id,name) values (1,'lucy');
5、修改数据:update 语句
使用where根据匹配条件,查找一行或者多行,根据查找的结果修改表中的相应行的列值(修改哪一列由列名指定)。
语法:update 表名 set 列 1 = 值1[,列2 = 值2,...][匹配条件];
匹配:where子句
where 列名 操作符 列值
update persons set id =2 ,addr = 'tianjing' where name = 'peter';
6、 删除数据:delete语句
使用where根据匹配条件,查找一行或者多行,根据查找的结果删除表中的查找到的行。
语法:delete from 表名 [匹配条件];
注意:当表中有多列、多行符合匹配条件时会删除相应的多行。
delete from persons where name = 'peter';
7、筛选数据:select语句
用于从表中选取数据,结果被存储在一个结果表内(称之为结果集)。
语法:
1、selcect * from 表名 [匹配条件];
2、selcect 列名1[,列名2,...] from 表名 [匹配条件];
提示:星号*是选取所有列的通配符。
select * from tbl where id = 104;
8、匹配条件语法:
数据库提供以下语法操作符配合where 子句实现多种多样的匹配方法。
如:
1、in
in允许我们在where 中规定多个值。
where 列名 in (列值1,列值2,....)
例子:1、select *from 表名 where 列名 in (值1,值2,....);
2、select 列名 1 [,列名2,...] from 表名 where 列名 in (列值1,列值2,...);
2、and
and 可以在where 子句中把多个条件结合起来(多个条件与的关系)
where 列 1 = 值1 [and 列2 = 值 2 and...]
例子:1、select *from 表名 where 列1 = 值1 [and 列2 = 值 2 and...] ;
2、select 列名 1 [,列名2,...] from 表名 where 列1 = 值1 [and 列2 = 值 2 and...];
3、or
or 可在where 子句中把两个或者多个条件结合起来 (多个条件之间是或的关系)。
匹配条件语法:
where 列 1 = 值1 [or 列2 = 值 2 or...]
例子:1、select *from 表名 where 列1 = 值1 [or 列2 = 值 2 or...] ;
2、select 列名 1 [,列名2,...] from 表名 where 列1 = 值1 [or 列2 = 值 2 or...];
4、between A and B
操作符 between A and B 会选取介于A、B之间的数据范围。这些值可以是数字、文本或者日期。
匹配条件语法:
where 列 名 between A and B
例子:1、select *from 表名 where 列 名 between A and B;
2、select 列名 1 [,列名2,...] from 表名 where 列 名 between A and B;
5、like
用于模糊查找
匹配条件语法:
where 列名 like 列值
1、若列值为数字
相当于列名等于列值。
2、若列值为字符串
可以用通配符“%”代表缺少的字符(可多个)
where address like '%jing%';
6、not 可取出原结果集的补集
匹配条件语句:where 列名 not in 列值
例:
1、where列名notin(列值1,列值2…)
2、where not(列1=值1[and列2=值2 and ..
3、where not(列1=值1[or列2=值2 or ..])
4、where 列名not between A and B
5、where 列名not like列值
9、复制表
全部复制
create table 表2 as select * from 表1;
部分复制
create table 表2 as select * from 表1 where id = 104;
修改表的结构
第一步:创建新表(这个表有我们想要的结构)
create table 表2 (id interger primary key,name text ,name text,addr text);
第二步:导入数据(有主键时不能重复):
insert into 表2 (id,name,addr) select id,name,addr from 表1;
第三步:改表名
drop table 表1;(删除表1)
alter table 表2 rename to 表1;
如果想让主键自己创建
主键属性加上 autoincrement,
insert into 表名 values(NULL,'xl','hb');(传一个NULL即可)
10、 事务
事务(Transaction)可以使用BEGIN TRANSACTION命令或简单的BEGIN命令来启动。此类事务通常会持续执行下去,直到遇到下一个COMMIT或ROLLBACK命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法:
在SQLite中,默认情况下,每条SQL语句自成事务。
begin:开始一个事务,之后的所有操作都可以取消
commit:使begin后的所有命令得到确认。
rollback:取消begin 后的所有操作。
例:
sqlite->begin; .
sqlite->delete from persons;(可以通过rollback撤销删除的操作)
11、 聚集函数
使用聚集函数,用于检索数据,以便分析和报表生成
avg(某列) 返回某列的平均值
count(*) 返回某列的行数
max( 某列) 返回某列的最大值
min(某列 ) 返回某列的最小值
sum(某列) 返回某列值之和
终端下输入(先插入一列分数score并修改内容)
例:
select avg(列名) from 表名;
Count的一个应用:判断数据库中是否有一张表
比如判断数据库中是否有persons这张表
select count(*) from sqlite_ master where type='table' and name="persons";
如果有persons这张表,结果返回非0,没有返回0
sqlite_ master 是数据库自带的一个表。当用户创建一张表时,数据库会将用户新建的表放在sqlite master 这张表中
12 、数据分组group by
分组数据,以便能汇总表内容的子集,常和聚集函数搭配使用。例如查询每个班级中的人数、平均分
使用: select 列名1[,列名2…] from 表名 group by 列名
group by 子句要在where之后
13、 过滤分组having
除了能用group by分组数据外,还可以包括哪些分组,排除哪些分组。例如:查看班级平均分大于90的班级.
通过having实现
语法:
select函数名(列名1) [,列名2… from表名groupby 列名having 函数名限制值
元素约束:
主键约束:主要区分内容相同的行,只能有一列
唯一约束:主要保证被约束的列所有元素不能重复出现,可以设置多列
检查约束:主要约束插入或修改的元素合法性,检查条件自己设定
14、 联结表(多表操作)
概念:
保存数据时往往不会将所有数据保存在一个表中,而是在多个表中存储,联结表就是从多个表中查询数据。在一个表中不利于分解数据,也容易使相同数据出现多次,浪费存储空间;使用联结表查看各个数据更直观,这使得在处理数据时更简单。
例如:学生每年的考试成绩,学生个人信息基本固定(包括学号、姓名、地址等);把所有信息放在同一个表中必然会造成学生的学号等基本信息重复。
单表缺点:
1、每次记录都需要录入重复的数据。
2、单个数据的更改会影响整个表,处理复杂。
分表优点:
1、将信息分开存储,节省空间,处理简单、效率好。
2、使用关系型数据库存储数据,各个表的设计是非常重要的,良好的表设计,能够简化数据的处理,提高效率,提高数据库的健壮性。
使用联结:
通过select 语句将要联结的所有表以及它们如何关联
常用语句:
select列名1,列名2,.. from表1,表2,.. where判断语句;
select info. id, info. name , info. addn,score from info,class where info. id=class.id;
15 、视图(虚拟的表)
视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。
视图(View)是一种虚表,允许用户实现以下几点:
- 用户或用户组查找结构数据的方式更自然或直观。
- 限制数据访问,用户只能看到有限的数据,而不是完整的表。
- 汇总各种表中的数据,用于生成报告。
SQLite 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。
16、创建视图
SQLite 的视图是使用 CREATE VIEW 语句创建的。SQLite 视图可以从一个单一的表、多个表或其他视图创建。
CREATE VIEW 的基本语法如下:
CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
例:create view result as se lect info.id,info.name,info.addr,score from info,class where info.id=class.id;W
create view dataCombination as select WeightMonitoring.id, WeightMonitoring.place, WeightMonitoring.time ,WeightMonitoring.weight, gas from WeightMonitoring ,GasMonitoring where WeightMonitoring.id = GasMonitoring.id;
create view dataCombination as select WeightMonitoring.id, WeightMonitoring.place, WeightMonitoring.time ,WeightMonitoring.weight, gas from WeightMonitoring WeightMonitoring GasMonitoring where WeightMonitoring.id = GasMonitoring.id;
17、触发器概念
SQLite的触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行调用
1、只有每当执行delete, insert 或update操作时,才会触发,并执行指定的一条或多条SQL语句。
2、触发器常用于保证数据一致,以及每当更新或删除表时,将记录写入日志表。
语法:
create trigger 触发器名 [before | after] [insert | update | delete] on 表名 begin 语句 ; end;
例如:
create trigger tg_ delete after delete on persons
begin delete from grade where id=old.id; end;
说明:
当执行:delete from persons where id= 1;语句时,事件触发,执行begin与end之间的SQL语句(即回调函数)
注意:
old.id等价于personsid,但此处不能写persons.id, old.id 代表删除行的id(id代表两个表的关联列)
18、日志操作
创建日志表
create table log(time text, data text);
创建日志触发器
create trigger tg_ ch after update on info
begin insert into ch_ Log values (time( ' now' ),date( ' now;)) ; end;