SQLite 学习笔记

1.数据库管理系统数据模型

数据库管理系统采取的数据模型主要有:层次模型、网状模型、和关系模型。

层次模型是一种典型的树状结构,早期使用

层次模型

特点:

1、有且仅有一个节点,无父节点,这个节点被称为根节点。

2、其他节点有且仅有一个父节点。

3、同一个父节点的子节点被称为兄弟节点。

4、没有子节点的节点被称为叶节点

优点
(1)数据结构简单清晰
(2)查询效率高(优于关系数据库,不低于网状数据库)
(3)良好的完整性支持
缺点
(1)对非层次性的联系不适用
(2)当一个结点具有多个双亲结点时,只能通过引入冗余数据或引入虚拟结点解 决,对插入和删除操作的限制比较多
(3)查询子女结点必须通过双亲结点
(4)层次命令不灵活

网状模型构成了比层次模型更加复杂的网状结构

SQLite 学习笔记_第1张图片

特点:

1、允许一个以上的节点无父节点

2、一个节点可以有多个的父节点

优点:

  1. 网状数据模型可以很方便的表示现实世界中的很多复杂的关系;
  2. 修改网状数据模型时,没有层次状数据模型的那么多的严格限制,可以删除一个节点的父节点而依旧保留该节点;也允许插入一个没有任何父节点的节点,这样的插入在层次状数据模型中是不被允许的,除非是首先插入的是根节点;
  3. 实体之间的关系在底层中可以借由指针指针实现,因此在这种数据库中的执行操作的效率较高;

缺点:

  1. 网状数据模型的结构复杂,使用不易,随着应用环境的扩大,数据结构越来越复杂,数据的插入、删除牵动的相关数据太多,不利于数据库的维护和重建。
  2. 网状数据模型数据之间的彼此关联比较大,该模型其实一种导航式的数据模型结构,不仅要说明要对数据做些什么,还说明操作的记录的路径;

关系模型数据的逻辑结构是一张二维表,使用表格表示实体和实体之间关系的数据模型称之为关系数据模型

一行为一个对象成员,每一列为对象的一个属性

特点:

1、每一列的分量是类型相同的数据。

2、列的顺序是任意的

3、行的顺序是任意的

4、表的分量是不可分割的最小数据项,即表中不允许有子表。

优点:

  1. 结构简单,关系数据模型是一些表格的框架,实体的属性是表格中列的条目,实体之间的关系也是通过表格的公共属性表示,结构简单明了;
  2. 关系数据模型中的存取路径对用户而言是完全隐蔽的,是程序和数据具有高度的独立性,其数据语言的非过程化程度较高;
  3. 操作方便,在关系数据模型中操作的基本对象是集合而不是某一个元祖;
  4. 有坚实的数学理论做基础,包括逻辑计算、数学计算等;

缺点:

  1. 查询效率低,关系数据模型提供了较高的数据独立性和非过程化的查询功能 (查询的时候只需指明数据存在的表和需要的数据所在的列,不用指明具体的查找路径),因此加大了系统的负担;
  2. 由于查询效率较低,因此需要数据库管理系统对查询进行优化,加大了 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;

你可能感兴趣的:(数据库,database,sqlite)