今天花了两个小时的时间研究了一下MySQL 5.0版本下的连接。
MySQL下的连接一般分为内连接(inner join),外连接(outer join),交叉连接(cross join),
外连接还包括左外连接,右外连接和全连接。
但其实他们都是由交叉连接通过条件限制改变而来的。
下面是a表和b表的数据
交叉连接
经过我的实验,
SELECT * FROM a JOIN b 9行数据 SELECT * FROM a JOIN b ON a.`id`=b.`parent_id` 2行数据
SELECT * FROM a ,b 9行数据 SELECT * FROM a ,b ON a.`id`=b.`parent_id` 错误
SELECT * FROM a CROSS JOIN b 9行数据
发现这三种方式得到的数据都是一模一样,这说明了什么,在不设定join模式的情况下,join默认是交叉连接,而不通过join也可以做到两表连接,但是不直观,同时还不能添加on的条件。
内连接:
内连接的过程:
先获取交叉连接 SELECT * FROM a INNER JOIN b的内容
接着从左边开始判断条件
如果On条件连接满足,则将该条记录保留,反之则删除。
这样觉得的原因是不加on也能对数据进行查询,而下面的左外连接,右外连接都不行
左外连接:SELECT * FROM a LEFT JOIN b ON a.`id`=b.`parent_id`;
左边的保留,右边的若为null,则依旧存在,只是显示为null。
右外连接:SELECT * FROM a RIGHT JOIN b ON a.`id`=b.`parent_id`;
完全连接:
可能由于版本不支持,不能添加On
SELECT * FROM a FULL JOIN b获得的是交叉集,和交叉连接一样。
若添加On,正确的应该是左外和右外的并集,同时把重复的去掉
:
通过分析四个连接得到,无论是joIn,cross join,full join得到的都是笛卡尔集。
而内连接是通过笛卡尔积进行条件连接后得到的,左外连接,右外连接和全连接可能也差不多。
/*以上连接的原理只是本人的猜测,若有错误,见谅*/