本文主要是介绍[数据库与SQL] - No.2 SQL中的除法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SQL中的除法是用于解决什么场景的呢?
我们假设student 表示学生信息,sc表示学生选课记录,course表示课程信息,其结构如下:
CREATE TABLE `student` (`Sid` varchar(10) DEFAULT NULL,`Sname` varchar(10) DEFAULT NULL,`Sbirth` datetime DEFAULT NULL,`Ssex` varchar(10) DEFAULT NULL,`Sage` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `course` (`Cid` varchar(10) DEFAULT NULL,`Cname` varchar(10) DEFAULT NULL,`Tid` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sc` (`Sid` varchar(10) DEFAULT NULL,`Cid` varchar(10) DEFAULT NULL,`score` decimal(18,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当我们想要查询,所有至少选过语文课和数学课的同学的学号时:
select distinct sc1.sid from student sc1where not exists(select distinct c.cid from (select * from course t where t.cid = "01" or t.cid = "02" ) as cwhere not exists (select * from sc sc2where sc1.sid = sc2.sidand c.cid = sc2.cid))
怎么理解上面这句话呢?
我们选出这样的同学,不存在语文课和数学课,什么样的语文课和数学课呢?在选课记录中没有该同学和语文课数学课的记录。是不是有点绕?我们换一个
当我们想要查询,所有选过所有课的同学的学号时:
select distinct sc1.sid from student sc1 // 双重否定表肯定,除法where not exists (select distinct c.cid from course c // 不返回结果where not exists (select * from sc sc2 //返回了结果where sc1.sid = sc2.sidand c.cid = sc2.cid))
我们查询这样一个同学,不存在一门课,这门课不存在该同学的选课记录。这样就清楚很多了吧
所以,在我们希望表示表示至少覆盖了某个集合C的XXXX记录时?中间的那个查询变为我们的集合C就好了
我们使用双 not exists来表示SQL中的除法是常用的套路~
这篇关于[数据库与SQL] - No.2 SQL中的除法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!