关于sql外连接的运行步骤猜想,不知道对不对
sql的外连接 比如左连接 是不是第一步:先算出两表的笛卡尔集 第二步:再根据on的条件筛选出符合条件的数据 ,
第三步:再把左表被筛选掉没有显示的记录显示出来,右表的对应字段显示null
你的这个步骤从结果上看,是没问题的,但是这需要O(N^2)的复杂度
现实中,我们把左右表放入hashtable然后排序后拉链匹配,这样只要O(LogN)的复杂度
外连接是一行一行的筛选数据,同时形成连接表,并不是先算出两表的笛卡尔积,然后下一步。。。。,这是我们推荐连接查询,而不推荐笛卡尔积的原因
在不考虑数据库系统优化的情况下,在join时执行的先后顺序是
1.on条件过滤
2.join
3.where条件过滤
join的算法有很多种,通常会做优化,比如hash join,只有不能做优化的极少的SQL才会去做笛卡尔积(nested loop join)通常这种SQL的性能是无法接受的。
这个需要根据sql的执行顺序来说明
1、**from** --- 求出两表的笛卡儿积的虚拟表
2、**on** ---- 通过虚拟表进行筛选,只有满足条件才能插入到虚拟表2
3、**Join** ---- 如果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 虚拟表2,生成虚拟表3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
4、**where ** --- 表进入内存前的筛选
5、**group by** ---- 分组
6**、having** ---- 表进入内存后的筛选
。。。。。
以上是个人观点,有可能不对