Android SQLite(一.简介和常用语法)

一.SQLite简介和常用语法
二.数据库创建,升级及降级

一.简介

SQLite是一个轻量级的数据库,实现了自给自足的,无服务器的,零配置的,事务性的SQL数据库引擎。

二.基本SQL语法

SQLite 不区分大小写,但有一些命令是大小写敏感的,例如:GLOB和glob

1.数据类型

  • 每个存储在SQLite的值都属于以下存储类之一
存储类 说明
NULL 值是一个NULL值
INTEGER 值是一个带符号的整数,根据值的大小存储在1、2、3、4、6或8个字节中
REAL 值是一个浮点值,存储为8字节的IEEF浮点数
TEXT 值是一个文本字符串,使用数据库编码存储
BLOB 值是一个blob数据,完全根据它的输入存储

关于SQLite存储类型和数据类型可以参考这篇文章:SQLite剖析之数据类型

2.创建表和删除表

  • 创建表
    CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建新表,涉及到命名表,定义列及每一列的数据类型和名称
    约束: 限定数据列的规则
    • NOT NULL :确保列不能有NULL值
    • DEFAULT :当某列没有指定值时,为该列提供默认值
    • UNIQUE :确保某列中所有的值是不同的
    • PRIMARY KEY :主键:唯一标识数据库表中的每一条记录
    • CHECK :CHECK约束确保某列中的所有值满足一定条件
    • PRIMARY KEY (index_name1,index_name2...)):混合主键
      (设计表的时候,约束条件一定要设计好,不支持删除约束和修改约束)
CRATE TABLE <TABBLENAME> (
column1 datatype,
column2 datatype,
.....
columnN datatype);

实例,创建一个Student表,ID作为主键,自增

CREATE TABLE student (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    gender TEXT,
    score INTEGER
);

如下:成功在当前数据库下创建一个名为student的表
  • 删除表
DROP TABLE <TABLENAME>
  • 索引
    索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的
    语法:
  1. 单例索引:CREATE INDEX index_name ON table_name (column_name);
  2. 唯一索引 : CREATE UNIQUE INDEX index_name on table_name (column_name);
  3. 混合索引 : CREATE INDEX index_name on table_name (column1, column2); (混合唯一索引可以达到和混合主键同样的效果,表创建后无法修改如果想使用混合主键可以使用混合唯一索引)
  4. 删除索引 : DROP INDEX index_name;

3.增删改查


  • INSERT INTO语句用于向数据库某个表中添加新的数据行
    语法如下:
INSERT INTO <TABLENAME> (column1,column2,……columnN) 
VALUES (value1,value2,……valueN);
//或者为表中所有列插入数据(顺序和表保持一致)
INSERT INTO <TABLENAME> 
VALUES(value1,value2,……valueN);

实例:

INSERT INTO student (name, score, age, gender)
VALUES
    ("张三", 100, 20, "男");

结果如下:



  • DELETE 语句用于删除表中已有记录。可以使用WHRER 字句指定删除行,不然删除所有的。
DELETE 
FROM <TABLENAME>  
     WHERE  <condition>;

实例:

有student表数据如下,现在删除所有年龄大于20的数据
DELETE 
FROM 
      student 
      WHERE 
      age >20;

结果如下:删除了age大于20的数据

  • UPDATE 语句用于修改表中已有记录。可以使用WHRER 字句指定修改行,不然修改所有行
UPDATE <TABLENAME> 
               SET column1 = value1,column2 = value2,……columnN = valueN 
               WHERE <condition>;

实例:
有student表数据如下,现在将所有学生分数小于90的男人变为女人(O(∩_∩)O)


UPDATE student 
               SET gender = "女" 
               WHERE score < 90;

结果如下:所有小于90分的都变成女人

  • SELECT 语句用于从表中获取数据,以结果表的形式返回数据。
SELECT column1,column2,……columnN 
               FROM <TABLENAME> 
               WHERE <codition>;
//或者查询所有列的数据
SELECT * FROM <TABLENAME>

实例:

有student表数据如下,查询年龄在20到22之间且分数大于60的数据,并按照成绩升序排列
SELECT
    name,
    age,
    score
FROM
    student
WHERE
    age BETWEEN 20
AND 22
AND score > 60
ORDER BY
    score ASC

结果如下:


4 高级功能

高级功能很多了,篇幅有限,这里只说三个Android中经常会用到的修改表多表查询子查询

  • 修改表
    ALTER TABLE命令用来修改表。可以使用ALTER TABLE 命令来修改表名称和在已存在的表中添加额外的列,除此之外ALTER TABLE 命令不支持其他操作。
    语法如下:
//修改表名
ALTER TABLE <old_table_name> RENAME TO <new_table_name>;
//新增字段
ALTER TABLE <TABLENAME> ADD COLUMN culumanName dataType;

实列(改名很简单不举例了):

已用表student,字段如下,先新增一个classId字段
ALTER TABLE student ADD COLUMN classId INTEGER;

结果如下:在student表中新增了classId字段列


  • 多表查询
    JOIN子句用于结合两个或多个数据库中表的记录。

    • 交叉连接:CROSS JOIN
      SELECT ... FROM table1 CROSS JOIN table2 ...;

    • 内连接:INNER JOIN
      SELECT ... FROM table1 INNER JOIN table2 ON condition;
      如果多个表存在相同的字段,可以简化成如下语句
      SELECT ... FROM table1 JOIN table2 USING(column1, ...);
      NATURAL JOIN自动连接多表中的相同字段相等值合并成一行
      SELECT ... FROM table1 NATURAL JOIN table2 ... ;

    • 外连接:OUTER JOIN
      SELECT ... FROM table1 LEFT OUTER JOIN table2 ON condition;
      如果多个表的条件字段相同,可以简化为如下语句
      SELECT ... FROm table1 LEFT OUTER JOIN table2 USING(column1, ...);

实例:有如下两张表student和school,数据如下:
student表
school表

交叉连接:CROSS JOIN
交叉连接将所有连接的表内符合条件的行相乘,即如果是两个表,表1符合条件的右X行,表2符合条件的有Y行,最后的查询结果是X*Y行
如下:student表中classId=10001的有三行,school表没有条件返回所有3行,最后结果会是9行数据:
SELECT student.classId as class ,name,monitor FROM student CROSS JOIN school WHERE class=10001;
结果如下:

内部连接:INNER JOIN
内部连接根据匹配条件的连接词,筛选出匹配条件的行,然后将多表的内容合并为一行
如下:筛选出每个班的班长及其信息,从上面表数据可知一共只有三个班每个班只能有一共monitor,所以最终筛选出三行数据

SELECT
    name,
    age,
    gender,
    score,
    stu.classId AS class,
    schoolNum,
    avgScore AS classAvgScore
FROM
    student AS stu
INNER JOIN school AS sch ON stu.classId = sch.classId
AND stu.name = sch.monitor;

结果如下:

外部连接
外连接是内连接的扩展。SQLite只支持左外连接,可以简写成LEFT JOIN
外连接的连接的方式和内连接相同,连接合并的方式也和内一样,区别是不能符合连接条件的行的也会合并一起,之所以叫左为连接就是以左边的表行为基准,无法连接的列会展示NULL。

举个栗子:
例1:上面的内连接的查询改成左外连接,已知完全符合连接条件的有三行数据,但是左表共有10行数据都会合并,但是剩下的7条数,左表没有的数据会展示成NULL

SELECT
    name,
    age,
    gender,
    score,
    stu.classId AS class,
    schoolNum,
    avgScore AS classAvgScore
FROM
    student AS stu
LEFT JOIN school AS sch ON stu.classId = sch.classId
AND stu.name = sch.monitor;

结果如下:

例2:school表插入一行,如下



然后将例1的查询语句左表换成school表,如下:

SELECT
    name,
    age,
    gender,
    score,
    stu.classId AS class,
    schoolNum,
    avgScore AS classAvgScore
FROM
    school AS sch
LEFT JOIN student AS stu  ON stu.classId = sch.classId
AND stu.name = sch.monitor;

按照之前的结论,会根据左表产生4条数据,且第4条数据因为不匹配连接,坐标没有的字段都一个是NULL值。看下结果如下,和之前总结的结论一致:


  • 子查询
    子查询又叫嵌套查询,是将另一个SQLite查询内嵌入WHERE子句中的查询。
    子查询返回的数据将被用在主查询中作为条件,以进一步限制要检索的数据。
    规则:
  1. 子查询必须用括号括起来。
  2. 一般情况下子查询在SELECT字句中只能用有一个列,除非在主查询中有多列,与子查询所选的列进行比较。
  3. OEDER BY 不能用在子查询中,但可以使用GROUP BY。
  4. 子查询返回多余一行,只能以多值运算符一起使用,如IN运算符。
  5. BETWEEN运算符不能喝子查询一起使用,但可以在子查询中使用。

SELECT 语句中子查询所有
语法:

SELECT column1, ... columnN 
FROM tableName
WHERE column1 condition 
              (SELECT column1, ... columnN 
                  FROM  tableName
                  WHERE ...)

示例:
已存在Student表,数据如下:

student表

查询大于平均分数的学生,SQL如下
SELECT * FROM student WHERE score > (SELECT avg(score) FROM student);
结果如下:

INSERT中使用子查询
语法:

INSERT INTO <tableName> (column1, ... columnN)
                        SELECT *|column1, ... columnN FROM <tableName>
                        WHERE ...;

示例:
现在有个name表,将上面的student表中name都插入到新表中,SQL如下

INSERT INTO name SELECT
    name
FROM
    student;

结果:

UPDATE中使用子查询
语法

UPDATE <tableName> SET columnName = columnValue
               WHERE  <condition> 
               (SELECT <column> 
                FROM <tableName>
                WHERE ...);

示例:将Student表中小于平均分数学生的classId都变为10004
SQL如下:

UPDATE student
SET classId = 10004
WHERE
    score < (
        SELECT
            avg(score)
        FROM
            student
    );

结果:
原表数据
改变后表数据

DELETE中使用
语法:

DELETE FROM <tableName>
               WHERE <condition> 
               (SELECT <column> 
                FROM <tableName>
                WHERE ...);

示例:删除小于平均分数的数据
SQL

DELETE
FROM
    student
WHERE
    score < (
        SELECT
            avg(score)
        FROM
            student
    );

结果:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容