雖然多表查詢,在計算機的必須課,數據庫,裡面已經大講特講,但是這個難點很多老師都沒有講深講透。跟你淨扯一大堆,左連接右連接的東西,讓人一頭霧水。老師把所有多表查詢的方法告訴你,但是到頭來一種方法都沒有掌握。其實只要記住一種就夠了,學會多表查詢,除了在你考數據庫能夠拿到很高分之外,到了實際應用,很多地方都用到多表查詢。比如論壇工程中分析回帖發帖的關系,提供該用戶發了什麼帖子的功能、比如信息管理系統中,分析班級與學生、老師之間的關系,提供該班級中存在多少學生的查詢功能。就需要用到多表查詢,你總不能把每一表都弄到如同視圖一般,然後關系表不要把?說到地就是如何創建不同的視圖給不同攻城獅使用,下面使用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語句查詢?
二、基本思想<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+xuTKtdXiyP3VxbHt09DI58/CvPK1pbXEudjPtaO6PC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20150305/2015030510004351.png" alt="\">
班級-學生關系表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兩個學生嗎?