首页 > 代码库 > 《sqlite权威指南》读书笔记 (一)

《sqlite权威指南》读书笔记 (一)

 

一 常量

字符串常量   (使用单引号括住。如果常量中有单引号,使用两个单引号来表示。大小写敏感)

数字常量

二进制常量

 

二 关键字

关键字大小写不敏感

 

三 注释

单行注释使用 --XXXXXXX

多行注释使用/*XXXXXX*/

 

四 创建表

CREATE [TEMP | TEMPORARY] TABLE table_name (column_definitions [constraints,]);

 

五 修改表

ALTER TABLE table_name {RENAME TO new_table_name | ADD COLUMN column_definitions};

 

六 关系操作

基本操作

Restriction (限制)

Projection (投影)

Cartesian Product (笛卡尔积)

Union (联合)

Difference (差)

Rename (重命名)

附加操作

Intersection (交叉)

Natural Join (自然连接)

Assign (赋值)

扩展操作

Generalized Projection (广义投影)

Left Outer Join (左外连接)

Right Outer Join (右外连接)

Full Outer Join (全外连接)

 

七 LIKE 和 GLOB

SELECT  column_name FROM table_name WHERE column_name LIKE ‘xxx‘;

 

LIKE 后跟的模式可以进行字符串匹配。

%可以与任意0个或多个字符匹配。为贪婪匹配。大小写不敏感。

‘%x‘ 表示以x结尾

‘x%‘ 表示以x开头

‘%x%‘ 表示包含x

_可以与任意一个字符匹配。

 

可以使用 NOT LIKE ‘xxx‘表示不包含某模式。

PS:‘xx‘表示一个模式,并不是只能与text类型的列进行匹配,同样可以与integer类型的列进行匹配。

 

可以将LIKE改为GLOB,两者用法十分类似,不过 GLOB大小写敏感,且*和_来表示。

 

八 限定和排序

SELECT column_name FROM table_name  ORDER BY column_name [ASC|DESC] LIMIT 1...9 OFFSET 1....9;

 

ORDER BY 表示排序。默认为升序,加入desc表示降序。可以有多列,用逗号分开。第一字段重复,则根据第二字段排序,以此类推。

 

LIMIT 后的数字表示,在排序结果中返回的行数。

OFFSET后的数字表示跳过的行数。例如:OFFSET 1 表示跳过一行,重第二行开始。

可以简略的写作LIMIT 2,3 和LIMIT 3 OFFSET 2意思一样。

 

九 函数和聚合

函数:可以把 upper(column_name) 作为一列,执行SELECT upper(name)......可以将name列的所有行换为大写。

聚合:理解做“对表中的每一行执行某种操作”。  执行SELECT count(*) From table;可以返回table表中行的数量。

 

十 分组

“聚合的主要部分就是分组,也就是说,聚合不只是能够计算整个结果集的聚合值,还可以把结果集分成多个组,然后计算每个组的聚合值。”

 

select type_id,name from foods group by type_id;

这一句,会根据type_id进行分组,name返回该组的最后一条。

select type_id,count(*) from foods group by type_id;

这一句,依然是根据type_id进行分组,count(*) 则是对改组进行聚合求职。

 

十一 去掉重复

SELECT DISTINCT column_name FROM table_name;

该句先得到所有,再进行删除操作

 

十二 多表连接

内连接例句:

SELECT * FROM foods INNER JOIN food_types ON foods.id == food_types.id;

交叉连接例句:

SELECT * FROM foods,food_types;

左连接例句:

SELECT * FROM foods LEFT OUTER JOIN food_types ON foods.id == food_types.id;

应该避免使用隐式连接,虽然可以简洁的实现。

标准形式:

select heading from left_table join_type right_table on join_condition;

 

插入纪录

INSERT INTO table_name (column_list) VALUES (value_list);

 

插入一行例句

INSERT INTO foods (name, type_id) VALUES (‘Cinnamon Bobka‘,1);

column_list 中可以包含主键字段,但要保证插入的主键字段的唯一性,否则会报“PRIMARY KEY must be unique”

last_insert_rowid();函数返回最后一个增长值。

插入一组行例句

INSERT INTO foods

SELECT NULL, type_id, name FROM foods where name = ‘Choco‘;
插入多行例句

CREATE TABLE foods2 AS SELECT * FROM FOODS;

 

更新数据

UPDATE table_name SET update_list WHERE predicate;

例如:

update foods set name = ‘apple‘,food_types = 3 where name ==‘banana‘;

 

删除数据

DELETE FROM table_name WHERE predicate;

例如:

delete from foods where id > 500;

 

数据完整性

域完整性 实体完整性 引用完整性 用户定义完整性

 

实体完整性 

主键由至少带有unique约束的一个或一组字段组成。

唯一性约束 -- unique

主键

如果未定义,则系统自动定义。为64bit的整形字段,名为rowid,也叫做_rowid,oid。sqlite为主键字段提供自增长性质。如果定义字段类型为 integer primary key,sqlite将为该字段创建默认值,并确保其唯一性。实际上,该字段就是rowid的别名。最大值为2的64次方,当达到最大值时,会搜索未使用的值。所以,新创建的rowid并不总是递增的。

autoincrement 会组织sqlite回收主键,并在达到最大值时停止。

主键即使不使用整型值,系统也会在内部维护一个rowid字段。

例如:

sqlite> create table pkey(x text, y text, primary key(x,y));
sqlite> insert into pkey values(‘x‘,‘y‘);
sqlite> insert into pkey values(‘x‘,‘x‘);
sqlite> select rowid, x, y from pkey;

rowid|x|y
1|x|y
2|x|x

 

域完整性

默认值(default)

如果用insert语句插入记录时没有为该字段制定值,关键字default将为字段提供一个默认值。

是处理非null的一种策略。

格式为 default 值

例如 name not null default NUKNOW 插入语句为指定name字段的值时,会自动用‘NUKNOW’当做name的值。

另外,default 接受三种预定义的保留字,为 current_time,current_data,curremt_timestamp

 

NOT NULL 约束

遇见null值会报错。

 

check 约束

可以定义表达式来判断值,例如: check(old > 0) 表示年龄必须大于0,插入-1岁会报错。

 

外键约束

语法如下

create table table_name

( column_definition references foreign_table (column_name)

  on {delete | update} integrity_action

  [not] deferrable [initially {deferred|immediate},]

);

 

排序规则

关键字为:collate

collate nocase 大小写不敏感 a==A

 

储存类

sqlite有5个原始的数据类型,被称作储存类。

integer 整数                   没有小数点被指派为该值。

real 实数                        有小数点。。。。

text 文本                         有引号括住。。。。

blob 二进制大对象         x‘abcd’。。。。

NULL 表示没有值          用NULL说明的值。。。

typeof()返回值的类型。

一个字段可以有不同的数据类型

排序规则如下

blob > text > integer real (通过值的大小排序) > NULL

 

视图

下面是一篇关于视图的介绍性文章

视图的介绍

定义视图语法如下:

create view name as select-stmt;

删除视图的语法如下:

drop view name;

 

索引

创建索引语法: 

create index [unique] index_name on table_name(columns);

删除索引:

drop index index_name;

索引的排序规则

创建语法:

create index foods_name_idx on foods (name collate nocase);

 

触发器

语法:

create [temp|temporary] trigger name

[before|after] [insert|delete|update|update of columns] on table

action

可以使用触发器在sqlite中实现可更新的视图

 

事务

事务由3个命令控制 :begin  commit  rollback

begin 开始一个事务,连接结束前,未发出commit,则全部命令撤销,rollback还原begin之后的所有操作。

savepoint xxx 保存一个位置,rollback to xxx,返回到某位置

 

数据库锁

sqlite有五种不同的锁状态 :未加锁 共享 预留 未决 排他

 

事务类型

sqlite有三种不同的失误类型,为了避免死锁,因为sqlite一个时刻允许多个连接读取数据,却只允许一个连接写数据。

begin[deferred | immediate | exclusive] transaction;

基本准则:如果使用的数据库没有其他连接,用begin就够了,但数据库如果有其他会对数据库执行写操作的连接,就应该使用begin immediate或 begin exclusive

 

数据库管理

附加数据库

attach [database] filename as database_name;

分离数据库

detach [database] database_name;

《sqlite权威指南》读书笔记 (一)