SQLite 和 SQL

在移动项目开发中*(这里特指iOS开发)*,通常都会接触到各种数据。对于少量、简单的数据,我们可以用归档、偏好设置或者pilst存储。但是如果遇到了大量的、复杂的数据,前面的几种方法就不太适合了。如果偏要用也不是不可以,但是会或多或少的造成性能的问题。对于复杂数据,最好使用数据库来存储。在移动项目开发中通常使用嵌入式数据库,因为这种数据库轻量级、效率高。

在介绍SQLite之前,先总结一下iOS常用的几种数据存储方式:

  1. Plist
  2. Perference
  3. NSCoding
  4. SQLite3
  5. Core Data

SQLite

SQLite是一款轻量级的嵌入式数据库,AndroidiOS开发使用的基本都是SQLite数据库。它占用的资源少*(通常只需要几百K的内存),处理速度快(比MySQLPostgreSQL这两款著名的数据库都还快)*。SQLite3是SQLite的第三个版本,也是目前使用的比较多的一个版本。

我们该如何使用呢?
可以下载一个Navcat Premium,软件图标很精致,是我喜欢的风格。这个软件是收费的,不过在中国嘛…你们都懂的。个人提倡使用正版软件,毕竟都是开发者,互相尊重劳动成果嘛。

软件安装完成之后,新建一个SQLite连接,填写连接名称,选择类型(新建SQLite3),填写数据库文件的名称以及存放路径,最后点击确定,一个数据库连接就搞好了。然后就可以进行数据库相关的操作了。

SQL

SQL(Structured Query Language)结构化查询语言。SQL是一种对关系型数据库中的数据进行定义和操作的语言,它语法简单、好学好用。

使用SQL语言所编写的代码串就是SQL语句,在程序运行过程中,想要实现数据的增删改查,必须使用SQL语句。SQL语句不区分大小写,(在Navcat Premium中关键字会有智能提示,很方便),每条语句必须都要以分号;结尾。

SQL语句的种类

  1. DDL:Data Definition Language(数据定义语句)

    • 包括CREAT和DROP等操作。
  2. DML:Data Definition Language(数据操作语句)

    • 包括INSERT、UPDATE、DELETE等操作。
  3. DQL:Data Definition Language(数据查询语句)

    • 包括SELECT操作
    • WHERE、ORDER BY、GROUP BY和HAVING等条件。

基本操作

在介绍基本操作之前,我们先了解一下SQLite中的几种字段。

SQLite字段:

  • INTEGER 整型
  • REAL 浮点型
  • TEXT 字符串
  • BLOB 二进制数据

实际上SQLite是无类型的,即使声明了字段类型,也可以存储其他类型的数据。
为了保持良好的编程规范、方便开发人员之间的交流,建表的时候最好给每个加上字段类型。


  1. 建表

    • CREATE TABLE 表名(字段1 类型 其他条件*(E.g.主键约束、非空约束等)*,字段2 类型 …,…);
    • CREATE TABLE IF NOT EXISTS 表名(……);
  2. 删表

    • DROP TABLE 表名;
    • DROP TABLE IF EXISTS 表名;
  3. 插入数据

    • INSERT INTO 表名(字段1,字段2,…) VALUES(值1,值2,…);

    如果值是字符串,要用单引号''括住。

  4. 更新数据

    • UPDATE 表名 SET 字段1 = 值, 字段2 = 值, … ;
  5. 删除数据

    • DELETE FROM 表名;
  6. 条件语句

    • WHERE 字段 = 某值;
    • WHERE 字段 IS 某值;
    • WHERE 字段 != 某值;
    • WHERE 字段 IS NOT 某值;
    • WHERE 字段1 > 某值 AND 字段2 > 某值;
    • WHERE 字段1 = 某值 OR 字段2 = 某值;

    E.g. DELETE FROM 表名称 WHERE 字段名 = 某值 AND 字段名 = 某值;

  7. 查询语句

    • SELECT * FROM 表名;//查询所有字段
    • SELECT 字段1,字段2 FROM 表名;//查询指定字段
  8. 别名

    • SELECT 字段1 别名1,字段2 别名2 FROM 表名 别名;
    • SELECT 字段1 AS 别名1,字段2 AS 别名2 FROM 表名 AS 别名;
    • SELECT 别名.字段1,别名.字段2 FROM 表名 别名;//可以用点语法访问指定表中的字段
  9. 计算记录数量

    • SELECT COUNT(字段) FROM 表名;
    • SELECT COUNT(*) FROM 表名;
  10. 排序

    • SELECT * FROM 表名 ORDER BY 字段;
    • SELECT * FROM 表名 ORDER BY 字段 ASC;//升序,默认;
    • SELECT * FROM 表名 ORDER BY 字段 DESC;//降序
    • SELECT * FROM 表名 ORDER BY 字段 ASC, 字段2 DESC;//先按字段1排序,字段1相等再按字段2排序
  11. LIMIT

    • SELECT * FROM 表名 LIMIT 数值1,数值2;

约束

  1. 简单约束

    建表时可以给特定的字段设置一些约束条件,以满足需求,常见的约束有:

    • NOT NULL
    • UNIQUE
    • DEFAULT
    • AUTOINCREMENT
  2. 主键约束

    • 为了保证每一条记录的唯一性,便于管理,增加了主键约束。用主键来标识记录的唯一性。

    • 用PRIMARY KEY来标识主键,主键可以是一个或者多个字段。

    • 主键默认包含了NOT NULL和UNIQUE两个约束。

    • 如果想让主键自动增长,主键的字段类型必须是INTEGER类型,且应增加AUTOINCREMENT约束。

    CREATE TABLE 表名(字段 INTEGER PRIMARY KEY AUTOINCREMENT,字段2 …);

  3. 外键约束

    • 如果有两张或者多张表,且表与表之间有联系,就要用到外键约束。
    • 外键约束的一般情况是:一张表的某个字段,引用着另一张表的主键字段。

    CREAT TABLE 表名(字段1 INTEGER PRIMARY KEY AUTOINCREMENT,字段2 ,CONSTRAINT 外键名称 FOREIGN KEY (字段2) REFERENCE 另一张表(主键字段));

  4. 表连接查询

    所谓表连接查询,就是需要联合多张表才能查到想要的所有数据的查询。

    • 内连接:INNER JOIN 或 JOIN
    • 左外连接: LEFT OUTER JOIN

    E.g. SELECT 别名1.字段1 ,别名1.字段2 FROM 表1 别名1,表2 别名2 WHERE 别名1.字段 = 别名2.主键 AND 别名.字段 = 'xxx';

小结

以上就是我在学习SQLite过程中总结以及汇总的一些经验,这些只是冰山一角。数据库是一个很复杂很神奇的技术,有待我们去深入发掘。