參考文章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