ORACLE SQL笛卡尔集
ORACLE SQL笛卡爾集
開發(fā)工具與關(guān)鍵技術(shù):Oracle sql*plus PLSQL Developer 作者:何任賢 撰寫時間:2019年01月01日 笛卡爾集是所有表連接中最特殊的一個,它是所有表連接無效,或者沒有連接條件時產(chǎn)生。假如有A、B兩張表,那么當A表的第一列和B表的所有列相連然后A表第二列繼續(xù)和B表的所有列相連依此類推,這時A表和B表的相連產(chǎn)生的數(shù)據(jù)集,叫做笛卡爾集。
笛卡爾集的作用和其他連接不一樣,所有連接都是笛卡爾集加上連接條件而成,然而我們可以不寫連接條件,直接篩選數(shù)據(jù)或獲得某些數(shù)據(jù),例子如下:
例一:圖1是表數(shù)據(jù) 、圖2是表結(jié)構(gòu)
其中SNO代表學號、CNO代表科目號、SCORE代表成績。
題目當我要查詢科目號為C001,比自己成績低的人數(shù)至少一人、學號、科目號、成績。
那么這個時候我們就可以利用笛卡爾集加上條件篩選數(shù)據(jù)。
代碼:
SELECT A.SNO,A.CNO,A.SCORE,COUNT(A.SNO) AS “人數(shù)”
FROM (SELECT * FROM SC WHERE CNO = ‘C001’) A ,
(SELECT * FROM SC WHERE CNO = ‘C001’) B
WHERE A.SCORE > B.SCORE
GROUP BY A.SNO,A.CNO,A.SCORE
代碼詳解:
該代碼只用了一個分組函數(shù)“COUNT”,作用是返回某分組中的記錄條數(shù),查詢的是兩張一樣的表,該表的數(shù)據(jù)是圖1進行CNO 為C001的篩選而成的,數(shù)據(jù)如圖3。只有一個WHERE條件,就是讓A表的成績大于B表的成績
結(jié)果如圖4:
圖3 圖4
例二:圖1是表數(shù)據(jù) 、圖2是表結(jié)構(gòu)
題目:當我要查詢所有科目最高分中最低分的科目的最低成績和科目號。
意思是查詢每個科目最高分中最低分的科目,該科目最低的成績和該科目號
代碼:
SELECT A.CNO,A.SIN FROM
(SELECT CNO,MAX(SCORE) SAX,MIN(SCORE) SIN FROM SC GROUP BY CNO) A,
(SELECT CNO,MAX(SCORE) SAX,MIN(SCORE) SIN FROM SC GROUP BY CNO) B
HAVING MIN(A.SAX) = MIN(B.SAX)
GROUP BY A.CNO,A.SIN
代碼詳解:
該代碼用到了兩個分組函數(shù),一個是“MAX”獲得該分組的最大值,一個是“MIN”
獲得該分組的最小值,查詢的也是兩張一樣的表,該表的數(shù)據(jù)是圖1進行CNO分組然后獲取分組后的最大值和最小值,數(shù)據(jù)如圖5,只有一個HAVING條件,該條件的意思是在圖5的A表中SAX列最小的數(shù)據(jù)并且等于B表中SAX列最小的數(shù)據(jù),這就是笛卡爾集的作用。
因為笛卡爾集會把兩張表的列以1對多的形式連接,而我們要查詢的科目最低的成績
和該科目號在圖5中就把數(shù)據(jù)查詢出來了,而我們只需要篩選所有科目最高分中最低
分的科目就行了,那么我們通過A表中SAX列最小值和B表中SAX列最小值作為條件
那么查詢出來的數(shù)據(jù)就是我們所需要的數(shù)據(jù)。
結(jié)果如圖6
通過以上例子我們可以發(fā)現(xiàn)笛卡爾集的連接方式,可以讓我們靈活的篩選一些數(shù)據(jù)或者獲得一些數(shù)據(jù),以上就是笛卡爾集的運用和理解。
總結(jié)
以上是生活随笔為你收集整理的ORACLE SQL笛卡尔集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年中国银发经济洞察报告
- 下一篇: ORACLE SQL SET运算符