前言
做數據庫sql練習,遇到的此問題,自己第一次寫有些複雜,想在網上搜尋下比較簡潔高效的寫法,但是幾乎都是複製粘貼,錯誤的也在複製粘貼,半天找不到比較高質量的,還是自己寫一下吧(建表語句不在此處列出),有更高效簡潔的寫法,歡迎留言評論。
實現過程
mysql實現
#1.查詢葉平的課程號
SELECT c1.cno FROM course c1 ,teacher t1 WHERE c1.tno=t1.tno and t1.tname='葉平';
#2.分別求成績表SC中葉平的課程號對應課程的平均成績
SELECT cno,AVG(score) ascore FROM SC WHERE cno in
(SELECT c1.cno FROM course c1 ,teacher t1 WHERE c1.tno=t1.tno and t1.tname='葉平')GROUP BY cno;
#3.根據第2步的平均成績(看做是一個平均成績表)和SC學生成績表,通過課程號cno 去匹配對應的學生成績並修改爲對應課程的平均成績
最終的的sql:
UPDATE SC s1 INNER JOIN (
SELECT cno,AVG(score) ascore FROM SC WHERE cno in
(SELECT c1.cno FROM course c1 ,teacher t1 WHERE c1.tno=t1.tno and t1.tname='葉平')GROUP BY cno) s2
SET s1.score = s2.ascore WHERE s1.cno=s2.cno ;
注:
在mysql中INNER JOIN 內連接可以簡寫爲JOIN,LETF JION 與RIGHT JION 則不能簡寫
在執行第三步時,可以先查詢下內連接展示的數據是否正確,查詢語句如下(如果使用左連接或者右連接,匹配不到的左連接左表或者右連接右表數據對應的值會顯示爲null)
SELECT * FROM SC s1 INNER JOIN (
SELECT cno,AVG(score) ascore FROM SC WHERE cno in
(SELECT c1.cno FROM course c1 ,teacher t1 WHERE c1.tno=t1.tno and t1.tname='葉平')GROUP BY cno) s2
WHERE s1.cno=s2.cno;