数据库笛卡尔积
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库笛卡尔积相关的知识,希望对你有一定的参考价值。
设R关系元数为3,基数为3,S关系元数为2,基数为2,则进行R*S运算后生成的新关系元数为5,基数为6.
这里的元数,基数是什么意思?还有答案我也不懂怎么算的
所谓笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合.
举例子,假设R中有元组M个,S中有元组N个,则R和S的笛卡尔积中包含的元组数量就是M*N.这个规则可以向多个关系扩展.
上面的例子的笛卡尔积结果就是tj_angela给出的(ac,ad,bc,bd)
属于的含义就是R是d1*d2*……*dn子集,这里其实是相等的.
笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表连接即为笛卡尔积(交叉连接)
在实际应用中,笛卡尔积本身大多没有什么实际用处,只有在两个表连接时加上限制条件,才会有实际意义
mysql的多表查询(笛卡尔积原理)
先确定数据要用到哪些表。
将多个表先通过笛卡尔积变成一个表。
然后去除不符合逻辑的数据(根据两个表的关系去掉)。
最后当做是一个虚拟表一样来加上条件即可。
注意:列名最好使用表别名来区别。
笛卡尔积
Demo:
左,右连接,内,外连接
l 内连接:
要点:返回的是所有匹配的记录。
l 外连接有左连接和右连接两种。
要点:返回的是所有匹配的记录 外加 每行主表外键值为null的一条记录。辅表所有列为null值。
select * from a left join b on a.x=b.x order by a.x //左外连接或称左连接
select * from a right join b on a.x=b.x order by a.x //右外连接或称右连接
select子句顺序
子句
说明
是否必须使用
select
要返回的列或表示式
是
form
从中检索数据的表
仅在从表选择数据时使用
where
行级过滤
否
group by
分组说明
仅在按组计算聚集时使用
having
组级过滤
否
order by
输出排序顺序
否
limit
要检索的行数 参考技术B 笛卡儿积就是把两个(多个)表的结果集相乘
R表中的每一条数据与S表中的每一条数据匹配并呈现,数量级就是两表的成绩,属性为列相加追问
还是不懂,为什么R*S中会多出一个d还有2
追答两个结果集无关联相匹配,因为没有关联条件,所以R中每条数据要与S中每条数据进行匹配
R中的a,1,c这条数据要与S中的两条数据进行匹配,最后的结果就是a,1,c看似是重复的
这样R中3条数据,S中2条,最后的结果就是3*2=6条
而列方面直接合并,这个没什么懂不懂的,记住就行了
JS使用循环获得不定维度笛卡尔积
使用循环获得不定维度笛卡尔积:
参考http://blog.csdn.net/buptdavid/article/details/45918647改造
function testing() { var d = [ ["a1", "a2", "a3"], ["b1", "b2"], ["c1", "c2", "c3", "c4"], ["d1", "d2", "d3", "d4", "d5"], ["e1", "e2", "e3", "e4", "e5","e6"], ]; var total = 1; for (var i = 0; i < d.length; i++) { total *= d[i].length; } var e = []; var itemLoopNum = 1; var loopPerItem = 1; var now = 1; for (var i = 0; i < d.length; i++) { now *= d[i].length; var index = 0; var currentSize = d[i].length; itemLoopNum = total / now; loopPerItem = total / (itemLoopNum * currentSize); var myIndex = 0; for (var j = 0; j < d[i].length; j++) { for (var z = 0 ; z < loopPerItem; z++) { if (myIndex == d[i].length) { myIndex = 0; } for (var k = 0; k < itemLoopNum; k++) { e[index] = (e[index] == null ? "" :e[index] + ",") + d[i][myIndex]; index++; } myIndex++ } } } for (var l = 0; l < e.length; l++) { console.log(e[l]); } }
以上是关于数据库笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章