SQL查询优化原理分析(二)

来源:互联网 发布:迦太基 汉尼拔 知乎 编辑:程序博客网 时间:2024/04/30 14:05

理解笛卡尔集


笛卡尔集是积集合的一种,假设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的结果集了




0 0
原创粉丝点击