玩转SQLite数据库

96
LuisX 595a1b60 08f6 4beb 998f 2bf55e230555
2018.04.18 10:33* 字数 881

Mac OS 与 iOS 已经内置了 SQLite 数据库引擎,想要 App 具备访问数据库的能力,只需要在项目中的 Framework 加入 libsqlite3.dylib 函数库。

下面来介绍一下,数据库的相关概念


一、表(Table)

所有在数据库中存储的数据都是放在表中的。

  • 每一行 (row) 称为一条数据。
  • 每一条数据,可由一列 (field) 以上的数据组成。
  • 数据库中,每个表的名字唯一。
  • 数据库中,可以拥有多个表。

注意:
表名、字段名,尽量以英文命名。

personal表

id cname city tel
A01 小明 北京市 11111
A02 小强 上海市 22222
A03 小刚 北京市 33333

数据库中,有很多表的原因:

  • 1.将数据分门别类。
  • 2.为了数据不重复。

1.1 遵守正规化

因数据重复性的问题,将表由一个拆成好几个的操作称为“正规化”。

数据库的设计,务必要让每个表遵守第一正规化,防止数据库在未来,维护、扩充、查询、修改操作上出现问题,导致数据库发展陷入瓶颈

第一正规化: 某条数据的某个字段,只能存放一份数据。

因此,新增一个 city_info 表,每个城市取唯一识别编号。

  • city 只需填上适当的城市编号。
  • city 字段类型由字符串转换成数字类型。
  • 大幅减少,对数据存储空间的需求。
  • 大幅减少,人工输入数据产生的错误。

拆分后

personal表

id cname city tel
A01 小明 1 11111
A02 小强 5 22222
A03 小刚 1 33333

city_info表

city_id name
1 北京市
2 南京市
3 天津市
4 重庆市
5 上海市

1.2 不要遵守所有的正规化

A01 和 小明 变得重复,为了解决新产生的重复性问题,需要将personal拆成两个表。

personal表

id cname city tel
A01 小明 1 11111
A01 小明 3 66666
A02 小强 5 22222
A03 小刚 1 33333

拆分后

personal表

id cname
A01 小明
A02 小强
A03 小刚

residence表

id city_id tel
A01 1 11111
A01 3 66666
A02 5 22222
A03 1 33333

city_info表

city_id name
1 北京市
2 南京市
3 天津市
4 重庆市
5 上海市

注意:
在实际应用中,不要让数据分散得太细,数据分得太细,在操作上会变得很麻烦。


二、主键(Primary Key 或 PK)

指定某些字段的值,不可以重复,这些字段被称为“主键”。
给每条数据一个唯一识别值,让数据输出、查询时不会出错。
主键也称之为“主索引”。

三个表的主键

personal表 residence表 city_info表
id idcity_id(复合主键) city_id

注意:
residence表中的主键,包含了 id 和 city_id 两个字段,它是复合字段主键。
任何一个字段的数据都有可能重复,但是合起来数据是不重复的。


三、关联

表与表之间因某些字段,彼此相互关联着,让分散的数据可以串在一起,互相找到。

personal表、residence表,id字段的值 代表意义相同。
residence表、city_info表,city_id字段的值 代表意义相同。


SQL语法

四、常用SQL语法

SQL语法,是用来操作数据库的标准命令,现今的数据库几乎都支持SQL语法。
(不同数据库,某些命令会有一些差异)

SQL语法的两部分:

  • 数据库管理相关
  • 数据库操作相关

注意:
SQL语句无大小写之分,字符串后使用单引号。

4.1 查询

// 1.查询,表内所有数据

SELECT * FROM personal
// 2.查询,表内指定数据

SELECT * FROM personal WHERE cname = '小明'
// 3.查询,表内搜索列数据,并排序( ASC | DESC )

SELECT * FROM personal WHERE cname LIKE '小%' ORDER BY id
// 4.查询,多个表内指定数据

SELECT personal.id, city_info.name, residence.tel 
FROM personal, residence, city_info 
WHERE personal.id = residence.id AND residence.city_id = city_info.city_id AND cname = '小明'
// 5.查询,表内数据记录数

SELECT COUNT(*) AS n FROM city_info

两个表之间,连接方式:

连接方式 描述 说明
内连接 指定两个表之间的连接关系 “WHERE * = *” 常用
左侧外链接 “=” 左边数据多 非常重要
右侧外链接 “=” 右边数据多 非常重要
交叉链接 不指定两个表之间的连接关系 几乎不用

注意:
很多错误,是由于忘记使用外链接,造成查询结果数据不见了。

/*
错误示例:
当personal表的id,在residence表中找不到时,查询结果会有丢失。

SELECT personal.id, cname, tel
FROM personal, residence
WHERE personal.id = residence.id
*/

// 6.外连接(左侧外链接)

SELECT personal.id, cname, tel
FROM personal LEFT JOIN residence ON personal.id = residence.id
// 7.交叉链接(几乎不会用到)

SELECT personal.id, cname, tel
FROM personal, residence

4.2 插入

// 1.非指定字段,插入 (VALUES中按字段顺序,空字段填NULL)

INSERT INTO personal VALUES ('A05', '小花')
// 2.指定字段,插入

INSERT INTO personal (id, cname) VALUES ('A05', '小花')

4.3 修改

// 1.修改,表内指定数据

UPDATE personal SET cname = '小毛' WHERE id = 'A03'
// 2.修改,表内相关数据

UPDATE personal SET id = 'A06', cname = '小胖' WHERE id = 'A05'

4.4 删除

// 1.删除,表内指定数据

DELETE FROM personal WHERE cname = '小虎'
// 2.删除,表内所有数据

DELETE FROM residence
iOS 开源
Web note ad 1