如:
  select classes.major ,students.name from classes ,students where classes.id = 2 and classes.year > 2011;
  别名简化:
  select classes.major as clsmj ,students.name as stunm from classes as cls,students as stu where cls.id = 2 and cls.year >2011;
  where 子句
  where 用于确定筛选条件,可以包含算术运算操作和逻辑操作
  + ,-,*,/,=,!=,>,<,<=,>=
  逻辑操作包括:or not,and
  还有like 关键字,用于模糊匹配,如
  select * from students where name like “t%”;输出包含所有包含t开头的名字。
  group by 分组
  分组是对聚合查询结果进行操作的,按照字段进行分组输出,如:
  select count(*) ,cls_id from students group by cls_id;
  得到学生表中的class.id 相同的人数和cls_id两列
  having 过滤 groupby的结果
  group by的结果 也可以进行筛选,使用having
  如:
  select count(*),cls_id from students group by cls_id having cls_id >2;
  以cls_id分组输出cls_id 大于2 的students的人数
  排序order by
  asc 升序,desc降序
  对select 的结果进行排序,如: select * from students order by name asc,year desc;
  数量限定 limit
  通常由于数据量较大只显示一部分数据,如分页显示
  select * from students limit 10,offset 2;
  显示students的前10条,并且从rowid 为2 开始,即从第三条开始检索。
  ## distinct 去重
  distinct 放在select后将查询结果的重复行去除,如:
  select distinct cls_id from students;
  查询cls_id同时去除重复的cls_id
  聚合函数
  聚合函数可以对字段、结果集做处理。有:
  函数名 作用 count() 计算数据集的数量 Avg() 统计某个字段的平均值 Min() 数据集的小值 Max() 数据集的大值 Length() 计算字段长度 Upper() 字符串类型字段值转为大写 Lower() 转为小写 Abs() 计算数值的值
  聚合函数放在select后,
  例如统计students表中各个班级的人数
  ==select 相当于一个输出结果的关键字==
  select count(*) ,cls_id from students group by cls_id;
  students 名字的平均长度:
  select avg(length(name)) from students;输出一个整数;
  多表连接,根据where查多表
  通过students的cls_id,可以查询classes中对应id的行每个字段信息,如:
  select * from students ,classes where students.cls_id == classes.id;
  得到的结果是每个student的字段和具有相同cls_id的classes里的字段,students的每一行都要在classes所有行中查找对应的id;
  内连接,A inner join B on 条件
  根据关系代数的交叉操作,对两个表进行筛选,。两个表中都符合条件的数据才会被输出。
  同样是上面的功能:
  内连接实现:select * from students inner join classes on students.cls_id = classes.id;
  左外连接 left outer join on
  与inner join 的区别是如果条件不匹配,那么结果集会返回左表中的数据,右表中的数据由空值填充。
  select * from students left outer join classes on students.cls_id = classes.id;
  如果students有cls_id在classes中不存在则数据结果集会返回students的行,在该结果集中classes的字段用空值填充。
  右外连接和全外连接
  右外连接和左外连接相反,左表又不匹配的行在结果集中用空值填充,全外连接,左表或者右表又不匹配的都用空值填充。SQLite不支持这两种查询。
  子查询
  SQLite 子查询
  子查询或内部查询或嵌套查询是在另一个 SQLite 查询内嵌入在 WHERE 子句中的查询。
  使用子查询返回的数据将被用在主查询中作为条件,以进一步限制要检索的数据。
  子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。
  以下是子查询必须遵循的几个规则:
  1 子查询必须用括号括起来。
  2 子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
  3 ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 GROUP BY 相同。
  4 子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
  5 BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用。
  update
  update用于更新表的字段值,其实是个字段赋值语句。
  update table students set name =”houson” , tel_no = “119” where id=0;
  update 如果主键重复了可能会失败。
  delete
  delete from .. where ..
  用于删除表的数据,delete from classes ,将删除classes中所有数据
  修改表alter
  Sqlite 的修改表包括:重命名和增加字段,不包括删除字段等。
  alter table students rename to stu_table;
  alter table students add column age default >0;
  要删除字段需要创建,临时表进行数据复制。drop掉原始表。
  实现如下
  create table stu_tmp (id integer primary key autoincrement ,name varchar(20) not null,tel_no varchar(11) not null ,cls_id integer not null) ;
  insert into stu_tmp id,name,tel_no select id,name,tel_no from students;
  drop table students;
  alter table stu_tmp rename to students
  创建索引
  当表比较大,而查询频率较高时,可以使用索引表为某些字段进行查询加速,索引像书的目录存储了每条记录的地址。
  create index [unique] 索引名 on 表名 (字段列表)
  创建索引表会使数据库体积增大,减慢insert ,delete,insert 的操作,需要权衡使用。
  SQLite根据查询条件判断是否使用索引。
  当条件与索引字段判等时,使用索引,当多个字段时,从第一个不等的字段开始,后续字段不使用索引。
  如:
  create index student_table_index on students (id ,name,cls_id);
  select * from students where id = 1 and cls_id = 2;
  由于name没有出现在查询条件中,因此b开始和索引字段不判等,只有id 字段会使用索引。
  select * from students where id >1 and name =”houson” and cls_id =4;
  此时,虽然字段的名字都有但是,id是>,不是= ,所以不判等。不使用索引