当前位置: 首页 > news >正文

【Databend】多表联结,你不会还没有掌握吧!

文章目录

    • 概述和数据准备
    • 内连接
    • 交叉连接
    • 左连接
    • 右连接
    • 左反和右反连接
    • 全连接
    • 总结

概述和数据准备

多表联结是两个或多个表的列合并到一个结果集中。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/join
  • Mysql 多表数据横向合并和纵向合并:https://blog.csdn.net/weixin_50357986/article/details/134866388

相关文章:

  • 12.2内核空间基于SPI总线的OLED驱动
  • 排序算法-希尔排序
  • Oracle 基本命令
  • P1125 [NOIP2008 提高组] 笨小猴——C++
  • Redis面试题14
  • Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域并放大,Kotlin(3)
  • 8. 自定义分页
  • 46 C++ 从主线程向 子线程如何传递参数 ------ join 状态下
  • 关于java继承知识点总结
  • 大语言模型面试问题
  • 备战抖音商城好物年货节,品牌焕发新商机
  • 汽车级线性电压稳压器LM317MBSTT3G:新能源汽车的理想之选
  • Android Studio由于开启代理无法下载依赖,一直在Build model
  • element中el-cascader级联选择器只有最后一级可以多选
  • 什么是uni.request()?如何使用它?
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Android框架之Volley
  • Codepen 每日精选(2018-3-25)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • linux安装openssl、swoole等扩展的具体步骤
  • mongo索引构建
  • ReactNativeweexDeviceOne对比
  • vue-router的history模式发布配置
  • webpack4 一点通
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 深度学习入门:10门免费线上课程推荐
  • 数据可视化之 Sankey 桑基图的实现
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​插件化DPI在商用WIFI中的价值
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #stm32整理(一)flash读写
  • (1) caustics\
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理出现中文乱码的情况
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core使用ef 6
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 依赖注入和配置系统
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • @WebService和@WebMethod注解的用法
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Android Studio 权威教程]断点调试和高级调试
  • [ASP]青辰网络考试管理系统NES X3.5
  • [BUUCTF]-Reverse:reverse3解析
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)