数据库除关系运算符执行过程详解
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库除关系运算符执行过程详解相关的知识,希望对你有一定的参考价值。
数据库除关系运算符案例详解
声明与简介
数据库里的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 A
JOIN stu B
ON 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 course
ON T2.cno = course.cno AND T2.sno=course.sno
WHERE course.cno IS NULL
)T3
ON T1.cno = T3.cno
WHERE T3.cno IS NULL
/*
结果
cno
1
2
*/
拆分详解
拆解版是对完整版里的每个步骤进行详细的介绍,这里每个Step对应贴图(书)内的步骤。
-- Step1 S集合里学号选的课程(即对应R集合的课程号),这里结果集定义为T1
with T1 as (
SELECT DISTINCT cno FROM
(
SELECT A.cno,A.sno FROM course A
JOIN stu B
ON 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.sno
WHERE 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
*/
以上是关于数据库除关系运算符执行过程详解的主要内容,如果未能解决你的问题,请参考以下文章