-- 内连接,显示两表匹配上的结果.-- inner join 可以简写为 joinselect*from test_a a innerjoin test_b b on a.id=b.id;
left join
-- 左外连接,左表数据全显示,右表数据匹配上的显示,未匹配上的显示NULL.--left join是left outer join的简写select a.*,b.*from test_a a leftjoin test_b b on a.id=b.id;
right join
-- 右外连接,右表数据全显示,左表数据匹配上的显示,未匹配上的显示NULL. --right join是right outer join的简写select a.*,b.*from test_a a rightjoin test_b b on a.id=b.id;
full join
全外连接,相当于leftjoinunionrightjoin,包括两个表的join结果(左边有,右边NULLunion 右边有,左边NULL)-- full join是full outer join的简写select a.*,b.*from test_a a fullouterjoin test_b b on a.id=b.id;
join的应用
求id相同的所有用户
-- 求出三表中id相同的数据select a.*,b.name,c.name
from test_a a
innerjoin
test_b b on a.id=b.id
innerjoin
test_c c on b.id=c.id;
计算新增用户
--思路:--1.使用右连接列出右表的所有数据; --2.通过左表的aid is null筛选除左表也就是以前不存在的数据; --3.通过count(1)计算出右表有而左表没有的数据总和(即新增用户数).selectcount(1)from(select aid from user_install_status where dt='20141117'groupby aid) a
rightjoin(select aid from user_install_status where dt='20141228'groupby aid) b
on b.aid=a.aid where a.aid isnull;
-- 顾名思义,就是一张表自己连接自己;--假设有表ods_self,只有一个字段a【string类型】,数据如下:234--需求:将ods_self表中a字段的值小于等于当前行的值拼接起来,最终得到的结果展示如下:
a b
32、32242、3、4--解题思路:由于给定的条件就只有ods_self这一张表,所以要想得到结果中一张表有两个字段的效果,就需要ods_self表进行自连接--第一步:自连接(也可以说是笛卡尔积,cross join 或者 join 不带 on 条件),并且对自连接之后的结果过滤(获取小于等于当前a值的数据)createtable dwd_self asselect
m.a as a,
n.a as b
from
ods_self m
crossjoin
ods_self n
where m.a>=n.a;--第二步:将数据拼接成想要的结果select
a,
concat_ws('、',collect_list(b))as nb
from dwd_self
groupby a;
网络网络层之(5)IPv6协议 Author: Once Day Date: 2024年5月12日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day…