利用SQL语言表达复杂查询
這篇博客主要介紹一些復(fù)雜的sql查詢,DDL和簡(jiǎn)單的sql部分這里不做介紹
先貼表結(jié)構(gòu):
出現(xiàn)在where子句中的select語(yǔ)句被稱為子查詢,子查詢返回了一個(gè)集合,可以通過和這個(gè)集合的比較來確定另一個(gè)集合
三種類型的子查詢:
- (NOT)IN子查詢
- ?Some 與 All 子查詢
- (NOT)EXISTS 子查詢
SQL語(yǔ)言表達(dá)復(fù)雜查詢--(NOT)IN 子查詢
示例1、列出張三、王三同學(xué)的所有信息
select * from student where sname in ("張三", "王三")示例2、列出選修了001號(hào)課程的學(xué)生的學(xué)號(hào)和姓名
select S#, Sname from student where S# in (select * from sc where C#='001')示例3、求既學(xué)過001號(hào)課程又學(xué)過002號(hào)課程的同學(xué)
select S# from SC where C#='001' AND S# in (select S# from SC where C#='002')示例4、列出沒學(xué)過李明老師所授課程的所有同學(xué)的姓名
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#)非相關(guān)子查詢:內(nèi)層查詢獨(dú)立進(jìn)行,沒有涉及外層查詢相關(guān)信息的子查詢
以上都是非相關(guān)子查詢
相關(guān)子查詢需要外層查詢的某些參量作為限定條件才能進(jìn)行的查詢
- 外層向內(nèi)層傳遞的參量需要外層的表名或表別名來限定
示例:求學(xué)過001號(hào)課程的同學(xué)的姓名
select Sname from Student stu where S# in(select S# from SC where S#=stu.S# and C#='001')SQL語(yǔ)言表達(dá)復(fù)雜查詢-- Some 與All 子查詢
示例1、找出工資最低的教師姓名
select Tname from Teacher where salary <= all(select salary from Teacher) 示例2、找出001號(hào)課成績(jī)不是最高的所有學(xué)生學(xué)號(hào) select S# from SC where C#='001' and score < some (select score from SC where C#='001')示例3、找出所有課程都不及格的學(xué)生的姓名(相關(guān)子查詢) select Sname from Student S where 60 > all(select score from SC where S.S#=SC.S#)示例4、找出98030101號(hào)同學(xué)成績(jī)最低的課程號(hào) select C# from SC where S#='98030101' and score <= all (select score from SC where S#='98030101' )示例5、找出張三同學(xué)成績(jī)最低的課程號(hào)(相關(guān)子查詢) 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語(yǔ)言表達(dá)復(fù)雜查詢--(NOT)EXISTS 子查詢
示例1、檢索選修了趙三老師主講課程的所有同學(xué)的姓名 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 卻可以實(shí)現(xiàn)許多新功能
示例2、檢索學(xué)過001號(hào)教師的所有課程的所有學(xué)生姓名
select Sname from Student S where not exists -- 不存在 (select * from Course C -- 有一門001老師主講的課 where C.T#='001' and not exists -- 他沒學(xué)過 (select * from SC where SC.S#=S.S# and SC.C#=C.C#))上述語(yǔ)句的意思是:不存在又一門001老師主講的課他沒學(xué)過
示例3、列出沒學(xué)過李明老師任何一門課的所有學(xué)生姓名
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、列出至少學(xué)過98030101號(hào)同學(xué)學(xué)過所有課程的同學(xué)的學(xué)號(hào)
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語(yǔ)言表達(dá)復(fù)雜查詢--分組查詢與分組過濾
- 分組查詢
示例1、求每一個(gè)學(xué)生的平均成績(jī)
select S#, AVG(Score) from SC group by S#示例2、求每一門課的平均成績(jī)
select C#, AVG(Score) from SC group by C#- 分組過濾
示例1、求不及格課程超過兩門的學(xué)生學(xué)號(hào)
select S# from SC where Score < 60 group by S# having count(*) > 2示例2、求有十人以上不及格的課程號(hào)
select C#, count(*) from SC where Score < 60 group by C# having count(*) > 10示例3、求有兩門以上不及格同學(xué)的學(xué)號(hào)及其平均成績(jī)
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#總結(jié)
以上是生活随笔為你收集整理的利用SQL语言表达复杂查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python把数据存储到CSV
- 下一篇: 蚂蚁Service Mesh大规模落地实