1、(INNER) JOIN :内链接,常与where配合做条件筛选,这种拼接得到最少的数据量,效率较高,但没有left join使用频率高,此方式相当于没有主表,后期数据处理时常出现因需要用到的数据被排除而需要返工重新拼接数据。
2、LEFT JOIN :左(外)连接,即左为主表,最常用的拼接。
3、RIGHT JOIN :右(外)连接与LEFT JOIN 其实等价,一般习惯为左边主表,所以right join 不常用
4、FULL (OUTER) JOIN :即保留左右未匹配上的数据,一般用于多数据源的整合拼接,如table_A包含用户的a、b类信息,table_B包含用户的c、d类信息,但时两个表包含的用户量并不相同,此时这需要用到全拼接。
select nvl(a.a,''),nvl(a.b,'')
,nvl(b.c,''),nvl(b.d,'')
from table_A a full join table_B b on a.user_id = b.user_id
MySQL好像没有全拼接吧,需要用union 方式转换一下,貌似。。。
ON 拼接条件,MySQL 允许非等值(>,<...)拼接,hive 只支持等值链接 即 (=)
5、CROSS JOIN 或 ",": select * from tb_A,tb_B ,这种拼接方法为笛卡儿积,得到所有可能的连接结果,此拼接不需要on 拼接条件
select * from table_A,table_B
在一些特殊的情况下,尤其是时间纵向的数据分析有奇效,这种拼接导致数据量指数膨胀,易造成数据倾斜,运算阻塞奔溃,要慎用。。。
WHERE 筛选条件
6、union all :上下拼接(并集),不去重
union :上下拼接,去重,且按默认方式排序
7、子查询:即把其中一个select的结果作为另一个select 的where 筛选条件
select * from table_A a
where a.id in (select id from table_B where id>n)
实际应用过程中,子查询情况并不多,运行效率不高,且容易导致脚本复杂,可读性太差,尤其时在复杂的SQL脚本中,实用性不高,可以通过常规拼接代替。