SQl語言的復(fù)雜查詢與視圖
主要內(nèi)容:
- [not]IN
- some / all
- [not]exists
- 聚集函數(shù)
- group by
- having
- 視圖
子查詢:
- 出現(xiàn)在where子句中的select語句稱為子查詢(subquery),子查詢返回一個集合,可以通過這個集合的比較來確定另一個查詢集合。
- 三種類型:[not]IN ; Some / All ; [not]Exists
[not] in 子查詢 - 基本語法: 表達式 [not] in (子查詢)
- 表達式可以為列名或常數(shù)。
- 語義:判斷某表達式的值是否在子查詢結(jié)果中。
例子:求學(xué)過001又學(xué)過002號課程的學(xué)生學(xué)號?(無關(guān)子查詢)
Select S# From SC
Where C# = '001' and
S# in (Select S# From SC Where C# = '002');
例子:沒學(xué)過李明老師課程的所有同學(xué)的姓名?(無關(guān)子查詢)
Select Sname From Student
Where S# not in (Select S# From SC.Course C,Teacher T
Where T.Tname = '李明' and SC.C# = C.C#
and T.T# = C.T#);
非相關(guān)子查詢與相關(guān)子查詢
外層查詢的變量的作用域包含內(nèi)層查詢。
- 非相關(guān):
內(nèi)層查詢獨立進行,不涉及任何外層查詢相關(guān)信息的子查詢。 - 相關(guān):
內(nèi)層查詢依靠外層查詢的某些參量作為限定條件才能進行的子查詢。
例子:學(xué)過001號課程的同學(xué)名字
Select Sname
From Student Stud
Where S# in (Select S#
From SC
Where S# = Stud.S# and C# = '001');
some/all子查詢
- 基本語法:
表達式 比較運算符 some/all(子查詢) - 語義:
將表達式的值與子查詢結(jié)果相比較
例子:找出所有課程多不及格的學(xué)生名字(相關(guān)子查詢)
Select Sname From Student
Where 60 > all (Select From Score
where Score.S# = Sname.S#);
例子:找出張三同學(xué)成績最低的課程號?(相關(guān)子查詢)
Select C# From SC,Student S
Where Sname = "張三" and S.S# = SC.S# and
Score <= all (Select Score Form SC
Where S# = S.S#);
等價與不等價
- 表達式 in (子查詢) 等價 表達式 some (子查詢)
- 表達式 not in (子查詢) 等價 <>all (子查詢)
- 表達式 not in (子查詢) 不等價 表達式<> some (子查詢)
Exists子查詢