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 |
id 和 city_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
网友评论