理解笛卡尔集
笛卡尔集是积集合的一种,假设A和B都是集合,A和B的笛卡尔用A X B来表示,是所有有序偶(a,b)的集合,其中a属于A,b属于B。
A X B={(a,b)|a属于A且b属于 B} ,则AXB所形成的集合就叫笛卡尔集。
SQL查询语句有很多使用到笛卡尔集概念的例子,比如
from A,B left join C on A.id=C.aid and B.id=C.bid
这样的语句
实例1:select * from t_company,t_department
从实例1可以看出笛卡尔集就是两个表中每条记录两两组合形成的集合
实例2:select * from t_company,t_department where t_company.com_id=t_department.dep_comid
从实例2可以看出where的作用是把t_company.com_id等于t_department.dep_comid的记录拿出来形成新的结果集
实例3:select * from t_company left join t_department on t_company.com_id=t_department.dep_comid
实例4:select * from t_company right join t_department on t_company.com_id=t_department.dep_comid
从实例3和实例4的结果集来看,唯一的区别是实例4最后一行数据,也就是说right join 比left join 多了一行记录
left join 关键字选择记录会分三步走:
第一步:选择左表(t_company)和右表(t_department)形成笛卡尔集
第二步:选择t_company.com_id等于t_department.dep_comid的记录形成新的笛卡尔集
第三步:在上一步的基础之上把左表(t_company)中不符合on条件的行也加入进来
通过这三步就可以得到left join的结果集了
right join 关键字选择记录也会分三步走:
第一步:选择左表(t_company)和右表(t_department)形成笛卡尔集
第二步:选择t_company.com_id等于t_department.dep_comid的记录形成新的笛卡尔集
第三步:在上一步的基础之上把右表(t_department)中不符合on条件的行也加入进来
通过这三步就可以得到right join的结果集了
因为右表(t_department)有一条记录dep_comid=3,而在左表(t_company)没有com_id=3的记录,所以right join 结果集会出现多了一条的情况
实例5:select * from t_company inner join t_department on t_company.com_id=t_department.dep_comid
实例6:select * from t_company full join t_department on t_company.com_id=t_department.dep_comid
Mysql不支持full join,所以实际使用的SQL语句是:
select * from t_company left join t_department on t_company.com_id=t_department.dep_comid
union
select * from t_company right join t_department on t_company.com_id=t_department.dep_comid
inner join 关键字选择记录会分两步走:
第一步:选择左表(t_company)和右表(t_department)形成笛卡尔集
第二步:选择t_company.com_id等于t_department.dep_comid的记录形成新的笛卡尔集
通过这两步就可以得到inner join的结果集了,可以看到 from 左表 inner join 右表 和 from 左表,右表 的结果是一致的
full join 关键字选择记录也会分三步走:
第一步:选择左表(t_company)和右表(t_department)形成笛卡尔集
第二步:选择t_company.com_id等于t_department.dep_comid的记录形成新的笛卡尔集
第三步:在上一步的基础之上把左表(t_company)和右表(t_department)中不符合on条件的行都加入进来
通过这三步就可以得到full join的结果集了