开发者学堂课程【嵌入式之 RFID 开发与应用2020版:SQLite 联接表操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11232
SQLite 联接表操作
连接表(多表操作)
1.概念:
保存数据时往往不会将所有数据保存在一个表中,而是在多个表中存储,联结表就是从多个表中查询数据。
在一个表中不利于分解数据,也容易使相同数据出现多次,浪费存储空间;使用联结表查看各个数据更直观,这使得在处理数据时更简单。
例如:学生每年的考试成绩,学生个人信息基本固定(包括学号、姓名、地址等);把所有信息放在同一个表中必然会造成学生的学号等基本信息重复。
对比:学生信息和成绩放在一个表中
Id |
Name |
Addr |
Score |
Year |
1 |
Lucy |
Beijing |
70 |
2013 |
2 |
Peter |
Tianjin |
95 |
2013 |
3 |
Bob |
Heibei |
80 |
2013 |
1 |
Lucy |
Beijing |
88 |
2014 |
当学生信息和成绩放在一个表中,各科老师会重复收到学生的 id、name、addr,我们认为这些列没有必要出现在成绩表中,要单独放置在一个表中,以 score 和year 为内容的表会有多个,学生信息表一个。表之间通过 id 进行关联,之后就可以通过 id 查看 name 和 score。
连接表操作的意义:表与表之间独立,但通过连接表操作又可以合并。
单表缺点:
①每年记录的成绩都需要添加重复的学生信息,如: name,addr
②lucy 的地址 (addr)修改,整个表所有的关于 lucy 的 addr 都需更改,处理复杂。
学生信息和成绩在不同的表中
学生信息:
Id |
Name |
Addr |
1 |
Lucy |
Beijing |
2 |
Peter |
Tianjin |
3 |
Bob |
Hebei |
学生成绩:
Id |
Score |
Year |
1 |
70 |
2013 |
2 |
95 |
2013 |
3 |
80 |
2013 |
①每个人的信息只需保存一份,没有重复,成绩 id 与学生信息 id 相同,作为关联,用于查找相应学生的成绩。
②lucy 的地址( addr )修改,只需修改 persons 表中的 addr
分表优点:
①将学生信息和成绩分开存储,节省空间,处理简单,效率更高,在处理大量数据时尤为明显。
②使用关系型数据库存储数据,各个表的设计是非常重要的,良好的表设计,能够简化数据的处理, 提高效率,提高数据库的稳定性。
2.使用联结:
通过select语句将要联结的所有表以及它们如何关联
常用语句: select 列名 1,列名 2,.. from 表 1,表 2,. where 判断语句;
注意:在联结两个表时,实际上是将第一个表中的每来行与第二个表中每一行配对,where 子句作为过滤条件,只有满足条件的才显示出来。
下面创建两个新表:
sqlite> create table info(id INT,name text, addr text);
sqlite> create table class(id INT, score INT, year text);
sqlite> insert into info(id ,name , addr) select id ,name , addr from tbl;
sqlite> select * from info;
id name addr
---- -------- -------
101 zs bj
102 ls tj
103 ww sh
104 zs cd
105 sw cq
106 xh hb
107
sqlite> insert into class(id,score) select id,score from tbl;
sqlite> select * from class;
id score year
---- -------- -------
101 40
102 40
103 60
104 60
105 90
106 90
107
以上两张表通过 id 进行关联。
进行查看操作:
sqlite> select * from info,class where info.id=class.id;
id name addr id score year
---- -------- ------- ------- -------- -------
101 zs bj 101 40
102 ls tj 102 40
103 ww sh 103 60
104 zs cd 104 60
105 sw cq 105 90
106 xh hb 106 90
107 107
要求:id 列不重复显示
sqlite> select info.id,info.name, info.addr , score from info,class where info.id=class.id;
id name addr score
---- -------- ------- ------
101 zs bj 40
102 ls tj 40
103 ww sh 60
104 zs cd 60
105 sw cq 90
106 xh hb 90
107
看起来是一张表,其实是两张表组合而成的,od、name、addr 属于一张表,id、score 属于另一张表。
还有一些联结表的配合操作,可以做一些虚拟表、触发器。
匹配语句: persons.id = grade.id
完全限定列名,用一个点(.)分隔表名和列名