在数据库中,我们有时候提取信息不得不要从多张表中抓取数据。
我先用两张表举个例子。
科目表: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),以后的查找操作就可以直接针对这张虚拟表格来进行。在开放权限的时候,可以只开放这张视图的权限,这样就可以有效地保护我们别的数据不被看到。