SQL-基於派生表的查詢


  子查詢不僅可以出現在FROM子句中WHERE子句中,還可以出現在FROM子句中,這是子查詢生成的臨時派生表成為主查詢的查詢對象。如果子查詢中沒有聚集函數,派生表可以不指定屬性列,子查詢SELECT子句后面的列名為其默認屬性。

  通過FROM子句生成派生表時,AS關鍵字可以省略,但必須為一個派生關系指定一個別名。

例 1:求出每個學生超過他自己選修課程平均成績的課程號

方法一

Select Sno,Cno

From SC X

Where Grade>(Select AVG(Grade)

               From SC Y

               Where Y.Sno=X.Sno); 

方法二

SELECT Sno,Cno

    FROM SC,(SELECT Sno,Avg(Grade) FROM SC GROUP BY Sno)

        AS Avg_sc(avg_sno,avg_grade)

WHERE SC.Sno=Avg_sc.avg_sno and SC.Grade>=Avg_sc.avg_grade;

這里FROM子句中的子查詢將生成一個派生表Avg_sc。該表有avg_sno和avg_grade兩個屬性組成,記錄了每個學生的學號及平均成績。主查詢將SC表與AVG_sc按學號相等進行連接,選出選修成績大於其平均成績的課程號。

 

例 2:查詢成績在90分以上的女生的姓名

    select Sname

    from Students S, (select Sid from SC where grade>90) T

    where Ssex='F' and S.sid=T.sid;

 

思考題: 求選修課程記錄中,男生里成績最好和最差的學生的姓名,性別和成績,以及女生里成績最好和最差的學生的姓名,性別和成績

select S.sname,S.ssex,SC.grade 
    
    from student S,SC,(Select student.ssex, max(grade) 

        From student, SC Where student.sno=SC.sno Group by student.ssex)

            as T(ssex,grade)

                where S.sno=SC.sno and S.ssex=T.ssex and SC.grade=T.grade

Union

select S.sname,S.ssex,SC.grade
    
    from student S,SC,(Select student.ssex, min(grade) 

        From student, SC Where student.sno=SC.sno Group by student.ssex)

        as T(ssex,grade)

            where S.sno=SC.sno and S.ssex=T.ssex and SC.grade=T.grade;                

  


免責聲明!

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



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