連接查詢:
連接查詢的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 ';