日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

利用SQL语言表达复杂查询

發(fā)布時(shí)間:2025/3/16 数据库 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用SQL语言表达复杂查询 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇博客主要介紹一些復(fù)雜的sql查詢,DDL和簡(jiǎn)單的sql部分這里不做介紹

先貼表結(jié)構(gòu):




出現(xiàn)在where子句中的select語(yǔ)句被稱為子查詢,子查詢返回了一個(gè)集合,可以通過(guò)和這個(gè)集合的比較來(lái)確定另一個(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é)過(guò)001號(hào)課程又學(xué)過(guò)002號(hào)課程的同學(xué)

select S# from SC where C#='001' AND S# in (select S# from SC where C#='002')

示例4、列出沒(méi)學(xué)過(guò)李明老師所授課程的所有同學(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)行,沒(méi)有涉及外層查詢相關(guān)信息的子查詢

以上都是非相關(guān)子查詢

相關(guān)子查詢需要外層查詢的某些參量作為限定條件才能進(jìn)行的查詢

  • 外層向內(nèi)層傳遞的參量需要外層的表名或表別名來(lái)限定

示例:求學(xué)過(guò)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é)過(guò)001號(hào)教師的所有課程的所有學(xué)生姓名

select Sname from Student S where not exists -- 不存在 (select * from Course C -- 有一門001老師主講的課 where C.T#='001' and not exists -- 他沒(méi)學(xué)過(guò) (select * from SC where SC.S#=S.S# and SC.C#=C.C#))

上述語(yǔ)句的意思是:不存在又一門001老師主講的課他沒(méi)學(xué)過(guò)

示例3、列出沒(méi)學(xué)過(guò)李明老師任何一門課的所有學(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é)過(guò)98030101號(hào)同學(xué)學(xué)過(guò)所有課程的同學(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ù)雜查詢--分組查詢與分組過(guò)濾

  • 分組查詢

示例1、求每一個(gè)學(xué)生的平均成績(jī)

select S#, AVG(Score) from SC group by S#

示例2、求每一門課的平均成績(jī)

select C#, AVG(Score) from SC group by C#

  • 分組過(guò)濾

示例1、求不及格課程超過(guò)兩門的學(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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。