关于left semi join,full join,left join,left anti join的区别
总结一下以上几种join的区别。
left semi join
①展示的结果为左表里两个表能关联上的数据。
和inner join很像。
select t1.cn from t1 left semi join t2 on t1.cn = t2.cn;
相当于
select t1.cn from t1 where t1.cn in (select t2.cn from t2);
②且只能查询左表,不能查询右表。
例如下面的语句就是错的:
select t2.cn from t1 left semi join t2 on t1.cn = t2.cn;
是SQL中in/exists的一种高效实现
inner join( = join)
①展示的结果为两个表能关联上的数据。
select t1.cn from t1 inner join t2 on t1.cn = t2.cn;
②可以查询右表的数据
select t2.cn from t1 inner join t2 on t1.cn = t2.cn;
left join
①展示的结果为左表所有的数据,使用left join原则上并不会导致主表查询数据量缺失。
select t2.cn from t1 left join t2 on t1.cn = t2.cn;
②且可以查询右表的数据
select t2.cn from t1 left join t2 on t1.cn = t2.cn;
full join(=full outer join)
①返回两表的并集。
left anti join
①展示的结果为左表剔除掉两个表能关联上的数据。
select t2.cn from t1 left anti join t2 on t1.cn = t2.cn;
相当于
select t1.cn from t1 left join t2 on t1.cn = t2.cn where t2.cn is null;
也相当于
select t1.cn from t1 where t1.cn not in (select t2.cn from t2);
是SQL中in/exists的一种高效实现
②同样不支持查询右表