数据库除关系运算符执行过程详解
生活随笔
收集整理的這篇文章主要介紹了
数据库除关系运算符执行过程详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫除關系運算符案例詳解
聲明與簡介
數據庫里的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 */?
總結
以上是生活随笔為你收集整理的数据库除关系运算符执行过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汽车跑偏的原因及解决方法?
- 下一篇: 丰田alphard为什么贵?