华南理工大学无线电爱好者协会软件小组

数据库--多表联查

2016-09-26  本文已影响0人  满堂风来

在数据库中,我们有时候提取信息不得不要从多张表中抓取数据。
我先用两张表举个例子。

科目表:course
字段 类型 附加属性 备注
id int 主键、自增
name varchar(50)
alias varchar(50) 索引 英文别名
题库表:question_bank
字段 类型 附加属性 备注
id int 主键、自增
course_id int 索引 course表外键
name varchar(200)
alias varchar(50) 索引 英文别名
publish bool 可空 默认为0,是否发布

直接使用WHERE连表

注意到question_bank表含有外键course_id,这就是连接两张表的关键。外键一般要加上索引以提高搜索的效率(一般数据量很大的时候提升非常明显)。
我们做一次简单的select。
SELECT * FROM course,question_bank WHERE course.id=question_bank.course_id
这样可以得到一张连起来的大表格。具体效果可以自己操作一下。

使用JOIN语句连表

执行以下sql语句:
SELECT * FROM question_bank JOIN course ON course.id=question_bank.course_id
可以得到和上面的查找一样的结果。之所以是用JOIN语句是因为join语句对于连表操作有自己的一套优化方式,可以加快查找速度。并且方便整理sql语句,当sql语句的WHERE条件非常复杂的时候,看起来更清晰一些。
当有更多的表格加入搜索的时候,可以这样写JOIN语句:
(我加一张表格先

题目表:question
字段 类型 附加属性 备注
id int 主键、自增
bank_id int 索引 题库表外键
number int 题号
title text 题干
type int 默认值:0 0:不定项,1:单选题,2:多选题
options text 选项采用序列化存储,格式:{[{option:(str),correct:(tinyint)]}
point int 可空 分值
analysis text 可空 答案解析

SELECT * FROM question_bank JOIN course ON course.id=question_bank.course_id JOIN question ON question.bank_id=question_bank.id
这样就可以得到三张表格的联查结果。

使用视图进行多表联查

当我们需要对连接后的大表格进行非常频繁的查找时,频繁地连接表格会对数据库造成很大的负担,这个时候,我们就需要建立一个视图,仅仅做一次连表就足够了。
CREATE algorithm=merge view question_list as SELECT question.* , course.id as course_id FROM question_bank ,course, question WHERE course.id=question_bank.course_id AND question.bank_id=question_bank.id
这样就可以获得一张虚拟表格,就是视图(View),以后的查找操作就可以直接针对这张虚拟表格来进行。在开放权限的时候,可以只开放这张视图的权限,这样就可以有效地保护我们别的数据不被看到。

捕获.PNG
上一篇 下一篇

猜你喜欢

热点阅读