MySQL學習之路8-關聯子查詢


參考文章https://zhuanlan.zhihu.com/p/41844742

 

成績表如下Score: 

 

問題:查詢科目中成績大於平均成績的記錄?

SELECT *

FROM Score

WHERE score > 

(

SELECT AVG(score)

FROM Score

GROUP BY courseid

);

 上述SQL語句是錯誤的,因為子查詢結果分別為三個科目的平均成績,與score無法進行比較。

 

正確SQL語句如下:SELECT *

SELECT *

FROM Score as a

WHERE score > 

(

SELECT AVG(score)

FROM Score as b

WHERE a.courseid = b.courseid
GROUP BY courseid
);

 上述關聯子查詢執行過程:

#首先進行主查詢

select * 
from score as

#由於a.courseid = b.courseid為子查詢的關聯語句,從主查詢的結果courseid中取出第一個值='0001',通過關聯語句傳入子查詢,則子查詢變為:

select avg(score)
from score 
where courseid = 0001
group by courseid;

#從子查詢得到的結果avg(score) = 80.5返回主查詢,則主查詢中:

select * from score
where courseid = 0001 and score > 80.5;

#得到courseid = '0001'的整個查詢結果,然后courseid = '0002',依次類推。

 

總結:

關聯子查詢首先依靠子查詢中的關聯語句,從主查詢中選取關聯屬性的第一個值,進入子查詢中,然后將子查詢結果返回主查詢,判斷where條件,依次類推,直到主查詢中關聯屬性的值選取完畢。

 

2020-03-17 15:26

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM