標籤:多表查詢 內串連 主鍵 外鍵 巢狀查詢
雖然多表查詢,在電腦的必須課,資料庫,裡面已經大講特講,但是這個痛點很多老師都沒有講深講透。跟你淨扯一大堆,左串連右串連的東西,讓人一頭霧水。老師把所有多表查詢的方法告訴你,但是到頭來一種方法都沒有掌握。其實只要記住一種就夠了,學會多表查詢,除了在你考資料庫能夠拿到很高分之外,到了實際應用,很多地方都用到多表查詢。比如論壇工程中分析回帖發帖的關係,提供該使用者發了什麼文章的功能、比如資訊管理系統中,分析班級與學生、老師之間的關係,提供該班級中存在多少學生的查詢功能。就需要用到多表查詢,你總不能把每一表都弄到如同視圖一般,然後關係表不要把?說到地就是如何建立不同的視圖給不同攻城獅使用,下面使用MYSQL舉個例子說明,如何利用內串連與巢狀查詢,實現多表查詢。其實所有資料庫都一樣,SQL語句是通用的。
一、基本目標
已知,在test資料庫,可自行腦補為school資料庫,中存在如下表:
(1)學生表i_student,裡面記錄著該學校所有學生的資料,表示該學校中有3個學生a,b,c
(2)班級表i_class,裡面記錄著該學校所有班級的資料,表示該學校中有2個學生1,2
(3)班級-學生關係表i_class_student,裡面記錄著該學校所有班級與學生的對應關係,表示該學校中1班有學生1,2,2班有學生3
然後問題來了,求1班中有哪些學生?怎麼用SQL語句查詢?
二、基本思想
其實這三張表有如下簡單的關係:
班級-學生關係表i_class_student的class_id資料取自班級表i_class的主鍵id,班級-學生關係表i_class_student的student_id資料取自學生表i_student的主鍵id,存在一個所謂的“參照完整性”,上面的那個箭頭就是外鍵嘛。其餘表中的鑰匙表徵圖就是主鍵嘛,每一個表的ID列存在所謂的“實體完整性”嘛,也就是說ID列數字不能再出現第二次或許不能不填,也就所謂的唯一且非空。
三、製作過程
1、基於上面的分析,你可以先對班級-學生關係表i_class_student下手,使用如下的語句:
select student_id from i_class_student where class_id=1
查出1班轄下的所有student_id
2、再對學生表i_student下手,根據找出這些student_id對應的學生名字就行了嘛,這裡要把上面的查詢結果,與整張學生表i_student中的ID列與姓名列name連起來再查詢。首先你要有張學生表i_student的ID列與姓名列name。雖然現在整張學生表i_student中的ID列與姓名列name就是整張學生表i_student,但是實際中學生表i_student往往不止存兩列資訊。通過一句簡單得不能再簡單,凡是學過資料庫都必須知道的語句查出整張學生表i_student中的姓名列name:
select id,name from i_student
查詢結果如下:
3、設第一步的查詢結果為t1,第二步的查詢結果為t2,把t1與t2兩張表串連起來,只存在保留id與student_id對應的結果,就得到最後的結果:
所以同樣把第一步的查詢語句與第二步的查詢語句,加條件地內串連起來,便得到如下的查詢語句,但此時我們無需再查詢學生表i_student的id了,這個id只作比對作用,可以把第二步的查詢語句中的id去掉,
select name from i_student as t1 INNER JOIN (select student_id from i_class_student where class_id=1) as t2 where t1.id=t2.student_id
也自然而然地得到正確的結果:
班級1不正是有a,b兩個學生嗎?
【Mysql】利用內串連與巢狀查詢實現多表查詢,主鍵、外鍵的基本概念