在數(shù)據(jù)庫(kù)中,我們有時(shí)候提取信息不得不要從多張表中抓取數(shù)據(jù)。
我先用兩張表舉個(gè)例子。
科目表:course
字段 | 類(lèi)型 | 附加屬性 | 備注 |
---|---|---|---|
id | int | 主鍵、自增 | |
name | varchar(50) | ||
alias | varchar(50) | 索引 | 英文別名 |
題庫(kù)表:question_bank
字段 | 類(lèi)型 | 附加屬性 | 備注 |
---|---|---|---|
id | int | 主鍵、自增 | |
course_id | int | 索引 | course表外鍵 |
name | varchar(200) | ||
alias | varchar(50) | 索引 | 英文別名 |
publish | bool | 可空 | 默認(rèn)為0蕉世,是否發(fā)布 |
直接使用WHERE連表
注意到question_bank表含有外鍵course_id,這就是連接兩張表的關(guān)鍵婆硬。外鍵一般要加上索引以提高搜索的效率(一般數(shù)據(jù)量很大的時(shí)候提升非常明顯)狠轻。
我們做一次簡(jiǎn)單的select。
SELECT * FROM course,question_bank WHERE course.id=question_bank.course_id
這樣可以得到一張連起來(lái)的大表格彬犯。具體效果可以自己操作一下向楼。
使用JOIN語(yǔ)句連表
執(zhí)行以下sql語(yǔ)句:
SELECT * FROM question_bank JOIN course ON course.id=question_bank.course_id
可以得到和上面的查找一樣的結(jié)果查吊。之所以是用JOIN語(yǔ)句是因?yàn)閖oin語(yǔ)句對(duì)于連表操作有自己的一套優(yōu)化方式,可以加快查找速度湖蜕。并且方便整理sql語(yǔ)句逻卖,當(dāng)sql語(yǔ)句的WHERE條件非常復(fù)雜的時(shí)候,看起來(lái)更清晰一些昭抒。
當(dāng)有更多的表格加入搜索的時(shí)候评也,可以這樣寫(xiě)JOIN語(yǔ)句:
(我加一張表格先
題目表:question
字段 | 類(lèi)型 | 附加屬性 | 備注 |
---|---|---|---|
id | int | 主鍵、自增 | |
bank_id | int | 索引 | 題庫(kù)表外鍵 |
number | int | 題號(hào) | |
title | text | 題干 | |
type | int | 默認(rèn)值:0 | 0:不定項(xiàng)灭返,1:?jiǎn)芜x題盗迟,2:多選題 |
options | text | 選項(xiàng)采用序列化存儲(chǔ),格式:{[{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
這樣就可以得到三張表格的聯(lián)查結(jié)果婆殿。
使用視圖進(jìn)行多表聯(lián)查
當(dāng)我們需要對(duì)連接后的大表格進(jìn)行非常頻繁的查找時(shí)诈乒,頻繁地連接表格會(huì)對(duì)數(shù)據(jù)庫(kù)造成很大的負(fù)擔(dān),這個(gè)時(shí)候婆芦,我們就需要建立一個(gè)視圖,僅僅做一次連表就足夠了喂饥。
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
這樣就可以獲得一張?zhí)摂M表格消约,就是視圖(View),以后的查找操作就可以直接針對(duì)這張?zhí)摂M表格來(lái)進(jìn)行员帮。在開(kāi)放權(quán)限的時(shí)候或粮,可以只開(kāi)放這張視圖的權(quán)限,這樣就可以有效地保護(hù)我們別的數(shù)據(jù)不被看到捞高。