MySQL除法应用题_mysql学习笔记:not exists实现除法运算

除法运算诚然是难点,但是它的几种经典的题型是比较固定的,今天先去粗略的整理一下!

前言:我发现一个规律,就是SQL语言对于包含”所有“这类需要用到除法的查询语句时,小集合B就是查询语句中从开头到“所有”(有些题则是全部2333)修饰的名词,尤其是这个“所有”修饰的名词基本就是B集合了,基本上这个规律百试不爽!查询语句由左到右自然对下来,集合B,A由左到右,从小到大,自然显现,准确灵活应用之,冲鸭,龙龙!2333!

活动的表格如下:

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第1张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第2张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第3张图片

1.一道很经典的题目:查询至少选修了学号为1的学生选修的全部(所有的)课程的学生学号。(这是一个意味深长的定语修饰哦!)

相关辅助资料:

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第4张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第5张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第6张图片

秀出我的代码2333:基本上目前就是如下的形式

/*查询至少选修1号学生选修的所有课程的学生学号*/

select sno from student where not exists(select * from sc as sc1 where sc1.sno='1' and not exists(select * from sc as sc2 where sc2.sno=student.sno and sc2.cno=sc1.cno));

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第7张图片

其他的一些相关训练

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第8张图片

/*查询至少选修了学号是2号的学生所选修的全部课程的学生学号*/

select distinct sno from sc as x

where not exists

(select * from sc as y

where sno='2' and not exists

(select * from sc

where sno=x.sno and cno=y.cno));

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第9张图片

2.接下来看一下两道很相像的题目:

(1)查询选修了全部课程的学生姓名。

(2)求被所有的学生都选修了的课程名。

(1)

/*查询选修了全部课程的学生姓名。*/

select sname from student where not exists(select * from c where not exists(select * from sc where sno=student.sno and cno=c.cno));

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第10张图片

参考:

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第11张图片

(2)

/*求被所有的学生都选修了的课程名*/

select cname from c where not exists

(select * from student where not exists

(select * from sc where sc.sno=student.sno and sc.cno=c.cno));

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第12张图片

参考:

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第13张图片

3.查询全部学生都选修的课程的课程号与课程名。

/*查询全部学生都选修的课程的课程号与课程名*/

select cno,cname from c where not exists

(select * from student where not exists

(select * from sc where sc.sno=student.sno and sc.cno=c.cno));

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第14张图片

参考:

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第15张图片

5.接下来回归一下理论基础的介绍2333!

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第16张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第17张图片

048688a877b99b6af5d86861a11a39b7.png

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第18张图片

大集合包含小集合。小集合在前,大集合在后,写sql的时候.

“查询全部学生都选修的课程的课程号与课程名。”中,小集合B是:全部学生,大集合A是选修某门课程的学生集合;

“查询选修过全部课程的学生的学号和姓名”中,小集合B是:全部课程,大集合A是某个学生的选课集合。

“查询至少选修了学号为1的学生选修的全部(所有的)课程的学生学号。”中,小集合B是:学号为1的学生选修的全部课程,

大集合A是:某个学生选修的课程集合。

我发现一个规律,就是SQL语言对于包含”所有“这类需要用到除法的查询语句时,小集合B就是查询语句中从开头到“所有”(有些题则是全部2333)修饰的名词,基本上这个规律百试不爽!查询语句由左到右自然对下来,集合B,A由左到右,从小到大,自然显现,准确灵活应用之,冲鸭,龙龙!2333!

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第19张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第20张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第21张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第22张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第23张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第24张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第25张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第26张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第27张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第28张图片

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第29张图片

先总结到这儿,多多实践熟练之,冲鸭,龙龙!

-------------------------------------------------------------------------------------------------

补充资料:

in 和 exists也是很好区别的.

in 是一个集合运算符.a in {a,c,d,s,d....}

这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.

而 exists是一个存在判断,如果后面的查询中有结果,则 exists 为真,否则为假.

in 运算用在语句中,它后面带的 select 一定是选一个字段,而不是 select *.

比如说你要判断某班是否存在一个名为"小明"的学生,你可以用 in 运算:"小明" in (select sname from student)

这样(select sname from student)返回的是一个全班姓名的集合,in 用于判断"小明"是否为此集合中的一个数据;

同时,你也可以用 exists 语句:exists (select * from student where sname="小明")

这两个涵数是差不多的, 但是由于优化方案的不同, 通常 NOT EXISTS 要比

NOT IN 要快, 因为 NOT EXISTS 可以使用结合算法而 NOT IN 就不行了,而

EXISTS 则不如 IN 快, 因为这时候 IN 可能更多的使用结合算法.

select * from 表 A where exists(select * from表 B where 表 B.id=表 A.id)

这句相当于

select * from 表 A where id in (select id from 表 B)

对于表 A 的每一条数据,都执行 select * from表 B where 表 B.id=表 A.id 的存在

性判断,如果表 B 中存在表 A 当前行相同的 id,则 exists为真,该行显示,否则不显示

MySQL除法应用题_mysql学习笔记:not exists实现除法运算_第30张图片

你可能感兴趣的:(MySQL除法应用题)