数学定义:
设有集合A和B,两个集合中元素若干,用A中元素为第一元素,B中元素为第二元素构成一个有序对,所有这样有序对组成的集合叫做,A与B的笛卡尔积。表示为AxB(A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;)
符号化为: A×B={(x,y)|x∈A∧y∈B}
例如:A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
出现场景:
数据库表连接数据行匹配时所遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做乘法运算。
在数据库中,两表相连,如果不加连接条件就会造成广义笛卡尔积
假如A表有10000条数据,B表有10000条数据,那么10000*10000就会出现1亿的数据量。所以在两表连接时,一定要添加连接条件,并保证逻辑性。
如何避免笛卡尔积:
1.在使用条件的时候注意格式为:表名.列名=表名.列名 因为有时候两张表会出现同样的列名,会导致MySQL没法区分,
加上表名调用列名就会不造成歧义。具体命令格式 SELECT 列名1, 列名2 FORM 表名1,表名2 WHERE 表名1.列名1=表名2.列名。
2.使用内连接;
3.使用左连接;
4.使用右连接;
两表关联的时候通过最小的粒度关联,最小粒度可以理解为表中的唯一性约束的字段值.