1.Sqlite基本介绍
  SQLite是一个Acid的数据库管理系统,不是一般的C/S结构,而是被连接到程序中,成为应用的一部分,减少了跨进程通信的开销,采用写入数据时加锁,但同时也支持多任务操作。
  SQLite只支持部分触发器,不支持对Alter table的删除和修改列,不进行类型检查。
  主要优点:
  1.零配置,无需安装。
  2.跨平台,
  3.大支持2T
  4.足够小,3万行代码
  5.开源
  主要有两部分构成:前端解析系统,后端引擎。
  前端包括:词法分析器,将SQL分割成标识符,传递给解析器。
  语法分析器:在指定上下文赋予标识符具体含义。
  代码生成器:将标识符组装成sQL之后,生成虚拟机能够执行的代码。
  后端引擎:
  虚拟机:将前端生成的代码进行执行,
  B/B+树:将数据的元组集合排序,帮助vm进行搜索,删除等操作。
  页面调度程序:在原始程序的上层实现了面向页面的数据库文件抽象。管理缓存,文件锁定,和事务的ACID等。
  2.SQLite的SQL
  SQLite 的SQL复合SQL92标准,但是有些功能没有实现。
  1.创建数据库
  使用:sqlite3+ 数据库名,例如sqlite3 school.db
  创建表
  将实体数据拆分到各个表中,可以减小单表的体积,提升操作速度。
  SQL:create [temp | temporary] table 表名 (字段名 数据类型 约束,字段名 数据类型 约束……);
  每条sql都以分号结尾,temp 关键字表示该表是临时表,临时表会在这次连接会话结束时自动销毁。
  SQLite的内置数据类型只有5种,但是创建表时不仅仅能使用这些类型:
  数据类型 说明 Null 数值为空 INTEGER 整型 REAL 浮点型 TEXT 字符型,使用数据库编码utf-8或者utf-16.utf-16le BLOB 只是数据块,完全按照输入存放。
  SQLite除了整型主列外,其他任何列的类型都是未定的,可以存任何类型的值,引擎会在查询过程中对其进行转换。
  SQLite没有boolean类型,和日期类型。
  类型相关的内容可以参考这篇文章:
  http://www.cnblogs.com/bpasser/archive/2011/11/02/2233455.html
  类型近似
  类型近似是指,存储在该列的数据的推荐类型。任何列都可以存储任何类型,只是会优先 选择一些存储类型,优先选择的类型称为该数据的类型近似。
  当创建表时,某一列的数据类型与内置的5种数据类型近似时会自动转换为近似的类型。
  类型近似的转换规则表:
  数据类型 Affinity类型 Interger INT TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 INTEGER CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVECHAR(70) NVARCHAR(100) TEXT CLOB TEXT BLOB NO DATATYPE NONE REAL DOUBLE DOUBLE PRECISION FLOAT REAL NUMERIC DECIMAL BOOLEAN DATE DATETIME NUMERIC 约束
  约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。
  约束可以是列级或表级。
  列级约束仅适用于列,表级约束被应用到整个表。
  以下是在 SQLite 中常用的约束。
  NOT NULL 约束:确保某列不能有 NULL 值。
  DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
  UNIQUE 约束:确保某列中的所有值是不同的,或者对表约束时列的组合是的。
  PRIMARY Key 约束:标识数据库表中的各行/记录。
  CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
  以创建classes表为例
  CREATE TABLE classes (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  mayjor varchar(20)CHECK (length(name)>3),
  year integer not null ,
  );
  主键约束
  PRIMARY KEY 约束标识数据库表中的每个记录。在一个表中可以有多个 UNIQUE 列,但只能有一个主键。在设计数据库表时,主键是很重要的。主键是的 ID。
  一个表必须有一个主键,默认情况有一个默认的主键rowid,64位整形,自动增长。
  外键约束
  关系完整性概念,也称为外键,外键确保表中的关键值必须从里一个表中引用,且该数据必须在另一个表中存在,否则将操作失败或者引发其他连锁反应,用户可以定制该反应。
  外键引用的表称为父表,含有外键的表称为子表。Android 开启外键功能,执行以下语句:
  PRAGMA foreign_keys = ON;
  外键约束的格式
  FOREIGN KEY (子表的列) REFERENCES 父表(父表的列)
  [ON {DELETE | UPDATE } 对应的操作
  [NOT] DEFERRABLE INITIALLY {DEFERRED | IMMEDIATE}]
  第二行表示,删除或者更新父表时子表对应的操作,
  第三行表示,操作的时机,是立即执行还是等待事务结束执行,默认为立即执行,deferable 意为可延缓的。
  例如:CREATE TABLE students (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name varchar(20)CHECK (length(name)>3),
  tel_no varchar(11) not null unique,
  cls_id integer not null,
  FORENIGN KEY (cls_id) PREFERENCES classes(id),
  UNIQUE(name,tel_no)
  );
  在students中插入数据时,cls_id必须要在classes表中存在,可以指定父表删除和更新对应id行时子表students的操作
  操作可以有以下几种:
  NO ACTION :不做操作
  RESTRICT:禁止删除或更新父键
  SET NULL:子键设为null
  SET DEFAULT:设为默认值
  CASCADE::父表操作时,同时更新或删除子表,有点类似触发器
  插入数据
  语法:insert into 表名 (字段列表)values (字段对应的值)
  如:insert into classes (id , majyor,year) values( 1, “chuanbo “,”2015”);
  当字段列表包含表中全部列时可以省略字段列表。
  批量插入
  insert into 表名(字段列表) 数据集;
  创建表stu :create table stu (id integer primary key ,name varchar(20),tel_no varchar(11) not null,cls_id integer not null);
  将students的数据复制到stu:insert into stu select * from students;也可以指定某些字段进行插入
  快速的复制表:create table stu as select * from stdents; as关键字
  此时,创建的表stu是没有约束的表,这种方式可以用来进行数据库升级,将原始表复制到临时表,使用临时表创建新表,删除原始表。
  查询数据 Select 语句
  数据库的重要功能是保存数据然后进行查询检索。
  SQLite支持除了右外连接和全外连接的所有操作。
  操作的输出又可以作为另一个操作的输入,形成嵌套关系。
  ==select 相当于一个输出结果的关键字==,select的通用格式:
  select [distinct] 字段列表 from 表列表 where 条件 group by 字段列表 order by 字段列表 limit 数量,offset 开始位置
  从from开始将数据集进行条件筛选,终得到结果。
  from 有多张表时,会将各个表的数据输出。select 后的字段列表的字段前可以加上表名,如:
  select classes.mayjor , students.name from classes ,students where classes.id =2;
  字段和表的别名
  在多表查询时,可能有相同的字段,在表明较长时可能会使SQL较复杂,使用别名来替代表名和字段名可以简化我们的SQL。