首先,先简单解释一下笛卡尔积。
现在,我们有两个集合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 连接条件
当出现两个表中未匹配的信息,以右表为主(保证右表信息全部能够展示),左表中未匹配信息被省略