搭建网站的价格,游戏网站怎么制作,子网站建设的好处,淘宝联盟交钱建设网站文章目录 概述和数据准备内连接交叉连接左连接右连接左反和右反连接全连接总结 概述和数据准备
多表联结是两个或多个表的列合并到一个结果集中。Databend 中支持的连接类型有 inner join 、cross join 、natural join 、left join 、right join 、left anti join 、right ant… 文章目录 概述和数据准备内连接交叉连接左连接右连接左反和右反连接全连接总结 概述和数据准备
多表联结是两个或多个表的列合并到一个结果集中。Databend 中支持的连接类型有 inner join 、cross join 、natural join 、left join 、right join 、left anti join 、right anti join 、full outer join。
在这里我们只讲最常见的几种其中 inner join 、left join 、right join 最常用。
数据准备
drop table if exists vip_info;
create table if not exists vip_info (client_id int,region varchar
);
drop table if exists purchase_records;
create table if not exists purchase_records (client_id int,item varchar,qty int
);
drop table if exists gift;
create table if not exists gift (gift varchar
);insert into vip_info values(101, Toronto),(102, Quebec),(103, Vancouver);insert into purchase_records values(100, Croissant, 2000),(102, Donut, 3000),(103, Coffee, 6000),(106, Soda, 4000);insert into gift values(Croissant),(Donut),(Coffee),(Soda); 内连接
内连接使用 inner join 语法其中 inner 可以省略返回满足结果集中连接条件的行。当列相同时可以将 on 转化成 using 来简化语法。
需求根据准备的数据返回VIP客户的购买记录。
select t2.client_id, t2.item, t2.qty
from vip_info as t1join purchase_records as t2using (client_id);交叉连接
交叉连接使用 cross join 语法也可以使用 inner join 不加连接条件实现返回一个结果集该结果集包括第一个表中的每一行与第二个表中的每一行连接。
需求将每个礼品选项分配给每个VIP客户。
-- 方法一使用 cross join
select t1.*,t2.*
from vip_info as t1cross join gift as t2;
-- 方法二使用 inner join 但是没有加匹配条件
select t1.*,t2.*
from vip_info as t1join gift as t2;左连接
左连接使用 left join 语法返回左表中的所有记录以及右表中的匹配记录。如果没有匹配结果是右侧的 NULL 记录。
需求返回所有VIP客户的购买记录如果VIP客户没有购买购买记录将为 NULL。
select t1.*,t2.*
from vip_info as t1left join purchase_records as t2using (client_id); 右连接
左连接使用 right join 语法返回右表中的所有记录以及左表中匹配的记录。如果没有匹配结果是左侧的 NULL 记录。
需求返回所有客户的购买记录如果不是VIP客户VIP客户信息将为 NULL。
select t1.*,t2.*
from vip_info as t1right join purchase_records as t2on t1.client_id t2.client_id; 左反和右反连接
左侧反连接使用 left anti join 语法从左侧表中返回右侧表中没有匹配行的行。这是 Databend 的语法建议使用 left join 配合 where 实现。
-- 方法一使用 left anti join 实现只能返回 t1 表的信息
select *
from vip_info as t1left anti join purchase_records as t2on t1.client_id t2.client_id;
-- 方法二使用 left join 配合 where 实现
select t1.*, t2.*
from vip_info as t1left join purchase_records as t2on t1.client_id t2.client_id
where t2.client_id is null;
------------------------------------------
| client_id | region | client_id | item | qty |
------------------------------------------
| 101 | Toronto | NULL | NULL | NULL|
------------------------------------------ 右反连接使用 right anti join 语法从右表返回左表中没有匹配行的行。这是 Databend 的语法建议使用 left join 配合 where 实现。
-- 方法一使用 left anti join 实现只能返回 t1 表的信息
select *
from vip_info as t1right anti join purchase_records as t2on t1.client_id t2.client_id;
-- 方法二使用 left join 配合 where 实现
select t1.*, t2.*
from vip_info as t1right join purchase_records as t2on t1.client_id t2.client_id
where t1.client_id is null;
-----------------------------------------------
| client_id | region | client_id | item | qty |
-----------------------------------------------
| NULL | NULL | 100 | Croissant | 2000|
-----------------------------------------------
| NULL | NULL | 106 | Soda | 4000|
-----------------------------------------------全连接
全连接使用 full outer join 返回两个表中的所有行在可以匹配的地方匹配行并在不存在匹配行的地方放置NULL。
-- 方法一使用 full outer join 语法
select t1.*, t2.*
from vip_info as t1full outer join purchase_records as t2on t1.client_id t2.client_id;
-- 方法二使用 left join、right join 和 union 实现
select t1.*, t2.*
from vip_info as t1left join purchase_records as t2on t1.client_id t2.client_id
union
select t1.*, t2.*
from vip_info as t1right join purchase_records as t2on t1.client_id t2.client_id;总结
多表联结语法很简单不同数据库可能语法不一样但只要掌握 inner join、left join 、right join 三种语法配合 where 或者 union 基本上可以解决所有相关的多表连接问题赶紧实践动起来。
参考资料
Databend JOIN https://docs.databend.com/guides/query/joinMysql 多表数据横向合并和纵向合并https://blog.csdn.net/weixin_50357986/article/details/134866388