数据库笛卡尔积

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子集,这里其实是相等的.

参考技术A 1.笛卡尔积定义

笛卡尔积在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条
而列方面直接合并,这个没什么懂不懂的,记住就行了

本回答被提问者采纳
参考技术C 通俗易懂点说 元数 就是有几种数据,基数就是有几条数据。R*S R中三条每条都与S中两条对应生成一条。所以就是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]);
                }
            }

 

以上是关于数据库笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章

笛卡尔积请具体解释一下.

笛卡尔积

数据库:JOIN 与笛卡尔积

什么是笛卡尔积?

工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)

工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)