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