数据库除关系运算符执行过程详解
生活随笔
收集整理的这篇文章主要介绍了
数据库除关系运算符执行过程详解
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
数据库除关系运算符案例详解
声明与简介
数据库里的Div(除)运算符是借鉴了数学基本元素除的理念,即整体除以个体,得到组(满足个体的特征的集合)。
所以如果“被除数”的集合R有4个元素,而“除数”的集合S有3个元素,则最终结果为R里的1个属性(S里的元素都能匹配到R的非S属性)。
除关系运算符的计算
这里除的含义是同时被S集合里的学号选择的课程号,这里不难发现结果是课程号1、2。
代码完整版
以下以SQL来演示上述的执行过程及结果。
-- 0 创建并初始化表和数据 CREATE TABLE course( cno int, sno int ); CREATE TABLE stu( sno int ); INSERT INTO course VALUES(1,2); INSERT INTO course VALUES(2,2); INSERT INTO course VALUES(3,2); INSERT INTO course VALUES(1,3); INSERT INTO course VALUES(2,3); INSERT INTO course VALUES(1,4); INSERT INTO stu VALUES(2); INSERT INTO stu VALUES(3);-- 当前演示数据库环境是mysql8.0.23,同时适用支持CTE的SQL Server、Oracle版本。 -- 1 SQL代码完整版 with T1 as (SELECT DISTINCT cno FROM(SELECT A.cno,A.sno FROM course AJOIN stu BON A.sno = B.sno)A ), T2 as (SELECT B.cno,C.sno FROM T1 B,(SELECT sno FROM stu)C )SELECT T1.* FROM T1 LEFT JOIN (select T2.* from T2 LEFT JOIN courseON T2.cno = course.cno AND T2.sno=course.snoWHERE course.cno IS NULL )T3 ON T1.cno = T3.cno WHERE T3.cno IS NULL /* 结果 cno 1 2 */拆分详解
拆解版是对完整版里的每个步骤进行详细的介绍,这里每个Step对应贴图(书)内的步骤。
-- Step1 S集合里学号选的课程(即对应R集合的课程号),这里结果集定义为T1with T1 as (SELECT DISTINCT cno FROM(SELECT A.cno,A.sno FROM course AJOIN stu BON A.sno = B.sno)A ) SELECT * FROM T1; /* 结果 cno 1 2 3 */-- Step2 T1与S集合做笛卡尔积,这里定义结果集为T2。 -- 注,因为CTE的特点,多个需要以逗号隔开,所以CTE T1、T2需一起定义 T2 as (SELECT B.cno,C.sno FROM T1 B,(SELECT sno FROM stu)C )SELECT * FROM T2 ORDER BY sno,cno; /* 结果 cno sno 1 2 2 2 3 2 1 3 2 3 3 3 */-- Step3 通过课程编号、学号关联T2、course,取仅在T2内的课程编号、学号。 -- 这里假定当前结果集为T3 select T2.* from T2 LEFT JOIN course ON T2.cno = course.cno AND T2.sno=course.snoWHERE course.cno IS NULL /* 结果 cno sno 3 3 */-- Step4 仅取课程编号 -- 此 步对应Step3里仅取cno字段。 /* 结果 cno 3 */-- Step5 通过课程编号关联T1、T3,取仅在T1的课程编号。 SELECT T1.* FROM T1 LEFT JOIN T3 ON T1.cno = T3.cno WHERE T3.cno IS NULL /* 结果 cno 1 2 */
总结
以上是生活随笔为你收集整理的数据库除关系运算符执行过程详解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 汽车跑偏的原因及解决方法?
- 下一篇: 时间序列错位还原之SQL实现案例详解