利用SQL语言表达复杂查询
生活随笔
收集整理的這篇文章主要介紹了
利用SQL语言表达复杂查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇博客主要介紹一些復雜的sql查詢,DDL和簡單的sql部分這里不做介紹
先貼表結構:
出現在where子句中的select語句被稱為子查詢,子查詢返回了一個集合,可以通過和這個集合的比較來確定另一個集合
三種類型的子查詢:
- (NOT)IN子查詢
- ?Some 與 All 子查詢
- (NOT)EXISTS 子查詢
SQL語言表達復雜查詢--(NOT)IN 子查詢
示例1、列出張三、王三同學的所有信息
select * from student where sname in ("張三", "王三")示例2、列出選修了001號課程的學生的學號和姓名
select S#, Sname from student where S# in (select * from sc where C#='001')示例3、求既學過001號課程又學過002號課程的同學
select S# from SC where C#='001' AND S# in (select S# from SC where C#='002')示例4、列出沒學過李明老師所授課程的所有同學的姓名
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 C.T#=T.T#)非相關子查詢:內層查詢獨立進行,沒有涉及外層查詢相關信息的子查詢
以上都是非相關子查詢
相關子查詢需要外層查詢的某些參量作為限定條件才能進行的查詢
- 外層向內層傳遞的參量需要外層的表名或表別名來限定
示例:求學過001號課程的同學的姓名
select Sname from Student stu where S# in(select S# from SC where S#=stu.S# and C#='001')SQL語言表達復雜查詢-- Some 與All 子查詢
示例1、找出工資最低的教師姓名
select Tname from Teacher where salary <= all(select salary from Teacher) 示例2、找出001號課成績不是最高的所有學生學號 select S# from SC where C#='001' and score < some (select score from SC where C#='001')示例3、找出所有課程都不及格的學生的姓名(相關子查詢) select Sname from Student S where 60 > all(select score from SC where S.S#=SC.S#)示例4、找出98030101號同學成績最低的課程號 select C# from SC where S#='98030101' and score <= all (select score from SC where S#='98030101' )示例5、找出張三同學成績最低的課程號(相關子查詢) select C# from SC, Student S where S.S#=SC.S# and Sname='張三' and score <= all(select score from SC where S#=S.S#)SQL語言表達復雜查詢--(NOT)EXISTS 子查詢
示例1、檢索選修了趙三老師主講課程的所有同學的姓名 select DISTINCT Sname from Student S where exists(select * from SC, Course C, Teacher T where S.S#=SC.S# and SC.C#=C.C# and C.T#=T.T# and T.Tname='趙三')不加not形式的exists可以不用,例如上面的例子還可以寫成如下形式:
select DISTINCT Sname From Student, SC, Course, Teacher Where SC.C# = Course.C# and SC.S# = Student.S# and Course.T# = Teacher.T# and Tname = '趙三';然而not exists 卻可以實現許多新功能
示例2、檢索學過001號教師的所有課程的所有學生姓名
select Sname from Student S where not exists -- 不存在 (select * from Course C -- 有一門001老師主講的課 where C.T#='001' and not exists -- 他沒學過 (select * from SC where SC.S#=S.S# and SC.C#=C.C#))上述語句的意思是:不存在又一門001老師主講的課他沒學過
示例3、列出沒學過李明老師任何一門課的所有學生姓名
select Sname from Student S where not exists(select * from Course C, SC, Teacher T where Tname='李明' and T.T#=C.T# and C.C#=SC.C# and SC.S#=S.S# )示例4、列出至少學過98030101號同學學過所有課程的同學的學號
select S# from SC SC1 where not exists(select * from SC SC SC2 where S#='98030101' and not exists(select * from SC where SC.C#=SC2.C# and SC.S#=SC1.S#))SQL語言表達復雜查詢--分組查詢與分組過濾
- 分組查詢
示例1、求每一個學生的平均成績
select S#, AVG(Score) from SC group by S#示例2、求每一門課的平均成績
select C#, AVG(Score) from SC group by C#- 分組過濾
示例1、求不及格課程超過兩門的學生學號
select S# from SC where Score < 60 group by S# having count(*) > 2示例2、求有十人以上不及格的課程號
select C#, count(*) from SC where Score < 60 group by C# having count(*) > 10示例3、求有兩門以上不及格同學的學號及其平均成績
select S#, AVG(Score) from SC where S# in(select S# from SC where Score < 60 group by S# having count(*) > 2) group by S#總結
以上是生活随笔為你收集整理的利用SQL语言表达复杂查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python把数据存储到CSV
- 下一篇: Docker - 安装并持久化Postg