如何避免查询结果出现笛卡尔积

首先,先简单解释一下笛卡尔积。

现在,我们有两个集合A和B。

A = {0,1}     B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析我们可以得出以下两点结论:

1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;

 

数据库表连接数据行匹配时所遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做乘法运算。

如何避免笛卡尔积:

1.在使用条件的时候注意格式为:表名.列名=表名.列名 

因为有时候两张表会出现同样的表名,会导致MySQL没法区分

加上表名调用列名就会不造成歧义

具体命令格式 SELECT  列名1, 列名2  FORM 表名1,表名2 WHERE 表名1.列名1=表名2.列名2

2.使用内连接

语法

Select 表1.*,表2.* 。。。

   From 表1

   [Inner] Join 表2 on 表与表之间的关联

 

SELECT st.stuname 姓名, s.subjectname 科目名称,r.score

from  `subject` s

 JOIN result r  on s.id=r.s_id

  JOIN  student st  on   r.stuno=st.studentno

3.外连接

 1.左连接

  SELECT 字段…… FROM 表一 left [outer] JOIN 表2 ON 连接条件

当出现两个表中未匹配的信息,以左表为主(保证左表信息全部能够展示),右表中未匹配信息被省略

2.右连接

SELECT 字段…… FROM 表一 RIGHT [outer] JOIN 表2 ON 连接条件

当出现两个表中未匹配的信息,以右表为主(保证右表信息全部能够展示),左表中未匹配信息被省略

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值