ORACLE SQL笛卡尔集

ORACLE SQL笛卡尔集

开发工具与关键技术:Oracle sql*plus  PLSQL Developer
作者:何任贤
撰写时间:2019年01月01日
笛卡尔集是所有表连接中最特殊的一个,它是所有表连接无效,或者没有连接条件时产生。

假如有A、B两张表,那么当A表的第一列和B表的所有列相连然后A表第二列继续和B表的所有列相连依此类推,这时A表和B表的相连产生的数据集,叫做笛卡尔集。
笛卡尔集的作用和其他连接不一样,所有连接都是笛卡尔集加上连接条件而成,然而我们可以不写连接条件,直接筛选数据或获得某些数据,例子如下:

例一:图1是表数据 、图2是表结构
图1 图2

   图1    				   图2	

其中SNO代表学号、CNO代表科目号、SCORE代表成绩。
题目当我要查询科目号为C001,比自己成绩低的人数至少一人、学号、科目号、成绩。
那么这个时候我们就可以利用笛卡尔集加上条件筛选数据。

代码:
SELECT A.SNO,A.CNO,A.SCORE,COUNT(A.SNO) AS “人数”
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

代码详解:
该代码只用了一个分组函数“COUNT”,作用是返回某分组中的记录条数,查询的是两张一样的表,该表的数据是图1进行CNO 为C001的筛选而成的,数据如图3。只有一个WHERE条件,就是让A表的成绩大于B表的成绩

结果如图4:

图3 图4

	图3                         图4

例二:图1是表数据 、图2是表结构
题目:当我要查询所有科目最高分中最低分的科目的最低成绩和科目号。
意思是查询每个科目最高分中最低分的科目,该科目最低的成绩和该科目号

代码:
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

代码详解:
该代码用到了两个分组函数,一个是“MAX”获得该分组的最大值,一个是“MIN”
获得该分组的最小值,查询的也是两张一样的表,该表的数据是图1进行CNO分组然后获取分组后的最大值和最小值,数据如图5,只有一个HAVING条件,该条件的意思是在图5的A表中SAX列最小的数据并且等于B表中SAX列最小的数据,这就是笛卡尔集的作用。
因为笛卡尔集会把两张表的列以1对多的形式连接,而我们要查询的科目最低的成绩
和该科目号在图5中就把数据查询出来了,而我们只需要筛选所有科目最高分中最低
分的科目就行了,那么我们通过A表中SAX列最小值和B表中SAX列最小值作为条件
那么查询出来的数据就是我们所需要的数据。

结果如图6
图5 图6

	图5                          图6

通过以上例子我们可以发现笛卡尔集的连接方式,可以让我们灵活的筛选一些数据或者获得一些数据,以上就是笛卡尔集的运用和理解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值