【2019-2020春學期】數據庫作業4:SELECT(連接查詢、嵌套查詢)

連接查詢:
連接查詢的WHERE子句中來連接兩個表的條件稱爲連接條件或連接謂詞,其一般格式:
[<表名 1>.]<列名 1><比較運算符>[<表名 2>.]<列名 2>
其中比較運算符主要爲=、>、<、>=、<=、!=(或者是<>)等。
此外連接謂詞還可以使用以下形式:
[<表名 1>.]<列名 1> BETWEEN [<表名2>.]<列名 2> AND [<表名 2>.]<列名 3>
當連接運算符爲=時,稱爲等值連接。使用其他運算符稱爲非等值連接。

等值連接:連接運算符爲=
(對比關係代數中的等值連接)

[例 3.49] 查詢每個學生及其選修課程的情況

       SELECT  Student.*, SC.*
       FROM     Student, SC
       WHERE  Student.Sno = SC.Sno;

自然連接
(對比關係代數中的自然連接)

[例 3.50] 對[例 3.49]用自然連接完成。

 SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM     Student,SC
 WHERE  Student.Sno = SC.Sno;

[例 3.51 ]查詢選修2號課程且成績在90分以上的所有學生的學號和姓名。

SELECT Student.Sno, Sname
FROM     Student, SC
WHERE  Student.Sno=SC.Sno  AND                     
               SC.Cno=' 2 ' AND SC.Grade>90;

自身連接:一個表與其自己進行連接

需要給表起別名以示區別
所有屬性名都是同名屬性,因此必須使用“別名”

[例 3.52]查詢每一門課的間接先修課(即先修課的先修課)

SELECT  FIRST.Cno, SECOND.Cpno
 FROM  Course  FIRST, Course  SECOND
 WHERE FIRST.Cpno = SECOND.Cno;

[例 3. 53]

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM  Student  LEFT OUT JOIN SC ON  (Student.Sno=SC.Sno); 

[例3.54]查詢每個學生的學號、姓名、選修的課程名及成績

 SELECT Student.Sno, Sname, Cname, Grade
FROM    Student, SC, Course    /*多表連接*/
WHERE Student.Sno = SC.Sno 
              AND SC.Cno = Course.Cno;

[例 3.55] 查詢與“劉晨”在同一個系學習的學生。
第一種方法:分步完成
① 確定“劉晨”所在系名

                    SELECT  Sdept  
                    FROM     Student                            
                    WHERE  Sname= ' 劉晨 ';

結果爲: CS
② 查找所有在CS系學習的學生。

                   SELECT   Sno, Sname, Sdept     
                    FROM      Student                 
                   WHERE   Sdept= ' CS '; 

第二種方法:將第一步查詢嵌入到第二步查詢的條件中

SELECT Sno, Sname, Sdept
 FROM Student
WHERE Sdept  IN
              (SELECT Sdept
               FROM Student
               WHERE Sname= ' 劉晨 ');

第三種方法:用自身連接完成

SELECT  S1.Sno, S1.Sname,S1.Sdept
  FROM     Student S1,Student S2
  WHERE  S1.Sdept = S2.Sdept  AND
                  S2.Sname = '劉晨';

[例 3.56]查詢選修了課程名爲“信息系統”的學生學號和姓名

  SELECT Sno,Sname                
  FROM    Student                          
  WHERE Sno  IN
         (SELECT Sno                     
          FROM    SC                        
          WHERE  Cno IN
                 (SELECT Cno             
                   FROM Course           
                   WHERE Cname= '信息系統'                      
                )
          );

用連接查詢實現[例 3.56] :

 SELECT Sno,Sname
  FROM    Student,SC,Course
  WHERE Student.Sno = SC.Sno  AND
                 SC.Cno = Course.Cno AND
                 Course.Cname='信息系統';

[例 3.57 ]找出每個學生超過他選修課程平均成績的課程號。

SELECT Sno, Cno
FROM    SC  x
WHERE Grade >=(SELECT AVG(Grade) 
                             FROM  SC y
                               WHERE y.Sno=x.Sno);

[例 3.58] 查詢非計算機科學系中比計算機科學系任意一個學生年齡小的學生姓名和年齡

SELECT Sname,Sage
FROM    Student
WHERE Sage < ANY (SELECT  Sage
                                     FROM    Student
                                     WHERE Sdept= ' CS ')
 AND Sdept <> ‘CS ' ; 

[例 3.59] 查詢非計算機科學系中比計算機科學系所有學生年齡都小的學生姓名及年齡。
方法一:用ALL謂詞

SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
                       (SELECT Sage
                        FROM Student
                        WHERE Sdept= ' CS ')
  AND Sdept <> ' CS ’;

方法二:用聚集函數

    SELECT Sname,Sage
    FROM Student
    WHERE Sage < 
                           (SELECT MIN(Sage)
                            FROM Student
                            WHERE Sdept= ' CS ')
      AND Sdept <>' CS ';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章