【数据库内核】Join的种类和用法_join类型-程序员宅基地

技术标签: 数据库  

目录

概述

测试的表数据

Join的种类

一、Inner Join

二、Left Join

三、Right Join

四、Full Join

五、LEFT JOIN EXCLUDING INNER JOIN

六、RIGHT JOIN EXCLUDING INNER JOIN

七、FULL OUTER JOIN EXCLUDING INNER JOIN

八、CROSS JOIN

九、SEMI JOIN

十、ANTI JOIN

十一、ANTI NA JOIN

结论


概述

JOIN是我们这些整天与数据打交道的人绕不开的一个词,不管是在传统的关系型数据库,还是在大数据领域的数据仓库/数据湖中,JOIN都是常客。特别是对于OLAP业务而言,几乎每个查询都需要用JOIN来建立表之间的关系,地位非常之重要。本文就来简单讲解一些主要的join种类和含义。

 

测试的表数据

 

drop table left_tablecreate table left_table(id int, name varchar(20))insert into left_table values(1, 'Dog')insert into left_table values(2, 'Cat')insert into left_table values(3, 'Pig')insert into left_table values(null,null)drop table right_tablecreate table right_table(id int, name varchar(20))insert into right_table values(1, 'Squirrel')insert into right_table values(2, 'Rabbit')insert into right_table values(4, 'Whale')insert into right_table values(null,null)

 

左表的数据

 

右表的数据

 

 

Join的种类

 

一、Inner Join

SQL语义:

INNER JOIN 一般被译作内连接。内连接查询能将左表(表 A)和右表(表 B)中能关联起来的数据连接后返回。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  INNER JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID

 

Oracle计划示意图:

 

结果显示如下图:

 

二、Left Join

SQL语义:

LEFT JOIN 一般被译作左连接,也写作 LEFT OUTER JOIN。左连接查询会返回左表(表 A)中所有记录,不管右表(表 B)中有没有关联的数据。在右表中找到的关联数据列也会被一起返回。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  LEFT JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID

 

Oracle计划示意图:

 

结果显示如下图:

 

三、Right Join

SQL语义:

RIGHT JOIN 一般被译作右连接,也写作 RIGHT OUTER JOIN。右连接查询会返回右表(表 B)中所有记录,不管左表(表 A)中有没有关联的数据。在左表中找到的关联数据列也会被一起返回。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  RIGHT JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID

 

Oracle计划示意图:

 

结果显示如下图:

 

四、Full Join

SQL语义:

Full Join又叫FULL OUTER JOIN 一般被译作外连接、全连接,实际查询语句中可以写作 FULL OUTER JOIN 或 FULL JOIN。外连接查询能返回左右表里的所有记录,其中左右表里能关联起来的记录被连接后返回。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  FULL JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID

 

Oracle计划示意图:

 

结果显示如下图:

 

五、LEFT JOIN EXCLUDING INNER JOIN

SQL语义:

返回左表有但右表没有关联数据的记录集。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  LEFT JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID WHERE  T2.ID IS NULL

 

Oracle计划示意图:

 

结果显示如下图:

 

六、RIGHT JOIN EXCLUDING INNER JOIN

SQL语义:

返回右表有但左表没有关联数据的记录集。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  RIGHT JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID WHERE  T1.ID IS NULL

 

Oracle计划示意图:

 

结果显示如下图:

 

七、FULL OUTER JOIN EXCLUDING INNER JOIN

SQL语义:

返回左表和右表里没有相互关联的记录集。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1  FULL JOIN RIGHT_TABLE T2 ON T1.ID = T2.ID WHERE  T1.ID IS NULL OR T2.ID IS NULL

 

Oracle计划示意图:

 

结果显示如下图:

 

八、CROSS JOIN

SQL语义:

返回左表与右表之间符合条件的记录的迪卡尔集。

 

示意图:

 

SQL示意:

 

SELECT  * FROM  LEFT_TABLE T1  CROSS JOIN RIGHT_TABLE T2

 

Oracle计划示意图:

 

结果显示如下图:

 

九、SEMI JOIN

SQL语义:

左表中的一行数据,在右表中只要找到1次就直接返回输出。不继续往后对比。节省开销。通常使用IN 或 EXISTS 作为连接条件。

 

文氏图:

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1 WHERE  T1.ID IN (  SELECT    T2.ID   FROM    RIGHT_TABLE T2   WHERE  T1.ID = T2.ID)

 

Oracle计划示意图:

 

结果显示如下图:

 

十、ANTI JOIN

SQL语义:

左表中的一行数据,在右表中没有找到匹配列,则输出。

 

文氏图:

 

 

SQL示意:

SELECT  * FROM  LEFT_TABLE T1 WHERE  NOT EXISTS (  SELECT    T2.ID   FROM    RIGHT_TABLE T2   WHERE  T1.ID = T2.ID)

 

Oracle计划示意图:

 

结果显示如下图:

 

 

十一、ANTI NA JOIN

SQL语义:

倘若子查询返回一条null值,则整个not in都变为false,即不返回任何值。

 

SQL示意:

 

SELECT  * FROM  LEFT_TABLE T1 WHERE  T1.ID NOT IN ( SELECT T2.ID FROM RIGHT_TABLE T2 )

 

Oracle计划示意图:

 

结果显示如下图:

 

 

结论

 

以上用法基本上可以覆盖各种 JOIN 查询了。顺带张贴一下 C.L. Moffatt 带 SQL 语句的图片,配合学习。

 

Join是数据库非常重要的核心技术,作为数据库研发工作者或者数据库使用者,了解Join和学习Join还是有一定好处的。后续文章会提如何让优化器选择更好的Join。让数据库的计算引擎能更快的计算结果。还有Join的三种实现算法例如(Nested Loop Join, Hash Join, Sort Merge Join)。

 

分享大数据行业的一些前沿技术和手撕一些开源库的源代码
微信公众号名称:技术茶馆
微信公众号ID    :    Night_ZW
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Night_ZW/article/details/108359899

智能推荐

环形队列的思路及代码实现(java)_实现环形队列的各种基本运算的算法思路-程序员宅基地

文章浏览阅读313次。数组模拟环形队列的思路及代码实现思路如下:1、front 变量的含义做一个调整: front 就指向队列的第-个元素也就是说arrfront]就是队列的第一个元素front的初始值= 02、 rear变量的含义做- -个调整: rear 指向队列的最后- -个元素的后- -个位置。因为希望空出一-个空间做为约定.rear的初始值=03、当队列满时,条件是(rear + 1) % maxSize front [满]4、对队列为空的条件,rear== front空5、当我们这样分析,队列中有效的数据_实现环形队列的各种基本运算的算法思路

搜狗输入法中英文标点符号切换方式_搜狗输入法标点符号改中文-程序员宅基地

文章浏览阅读3.1k次。搜狗输入法中文文标点切换概述写代码时需要使用英文标点符号, 稍不注意使用中文标点就会报错,并且在写页面时又需要使用中午标点符号,总是来回切换挺费劲,可以通过全半角的方式让搜狗输入法自动完成切换配置方式第一步:第二步:..._搜狗输入法标点符号改中文

redis狂神说笔记超详细(总结不易)_狂神redis笔记-程序员宅基地

文章浏览阅读3.6k次,点赞23次,收藏81次。redis狂神说笔记/阿里云服务器连接一.安装windows安装linux安装1.官网地址:https://redis.io/download2.下载Xshell,Xftp免费版3.链接阿里云服务器4.安装Xftp,连接阿里云服务器5.![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330172112103.png)6.文件上传到服务器,利用Xftp7.解压安装包8.进入解压后文件9.基本环境安装二.测试性能三.基础知识redis是单线程的redis-key四.五_狂神redis笔记

字节面试官:一条sql执行慢的原因?如何优化?-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏19次。点击上方“程序猿技术大咖”,关注并选择“设为星标”回复“加群”获取入群讨论资格!作为二本上岸大厂的后端应届生,深知没人带一路摸索的艰辛,想把自己的心路历程与经验心得收获分享给大家。后期大厂..._sql执行慢如何优化

用JNI进行Java编程---高级主题及附录_通过jni循环运行java-程序员宅基地

文章浏览阅读1.4k次。概述从 Java 程序内调用本机代码破坏了 Java 程序的可移植性和安全性。尽管已编译的 Java 字节码保持了很好的可移植性,但必须为您打算用来运行该应用程序的每个平台重新编译本机代码。另外,由于本机代码在 JVM 之外执行,所以约束它的安全性协议不必和 Java 代码的相同。从本机程序调用 Java 代码也很复杂。因为 Java 语言是面向对象的,所以从本机应用程序调用 Ja_通过jni循环运行java

K-means聚类 —— matlab_matlabkmeans聚类算法-程序员宅基地

文章浏览阅读3.7w次,点赞72次,收藏802次。1.简介2.算法原理3.实例分析3.1 读取数据3.2原理推导K均值过程3.3 自带kmeans函数求解过程完整代码_matlabkmeans聚类算法

随便推点

mybatis的xml中<=号被转义_<=转义-程序员宅基地

文章浏览阅读646次。解决方案:<![CDATA[<=]]>解析:术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。在 XML 元素中,"<" 和 “&” 是非法的。“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。“&” 也会产生错误,因为解析器会把该字符解释为字符实体的开始。某些..._<=转义

Java关于scan,break scan_java scan: {}-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏2次。看源码的时候,看到了新的语法,scan,break scan。下面源码摘抄于String.class的toUpperCase(Locale locale)方法/* Now check if there are any characters that need to be changed. */scan: { for (firstLower = 0 ; firstLower &..._java scan: {}

Nginx 管理 SSL 流量 - 加密 NGINX 和 upstream 服务器组之间的 HTTP 流量_nginx upstream ssl-程序员宅基地

文章浏览阅读3.1k次。原文地址1. 先决条件 PrerequisitesNginx 或 Nginx Plus。一台代理服务器或一组 upstream 服务器。SSL 证书和私钥。2. 获取 SSL 的服务器证书可以从可信的证书颁发机构(certificate authority,CA)购买证书,或通过 OpenSSL 库自己创建证书。服务器证书和私钥应该被放到每一台 upstream 服..._nginx upstream ssl

开发艺术探索--理解RemoteViews_romotevie-程序员宅基地

文章浏览阅读560次。<>第五章,理解RemoteViews RemoteViews的应用 RemoteViews的内部机制 RemoteViews的意义应用RemoteViews字面意思是一个远程View,可以在其他进程中显示.使用场景是 通知栏和桌面小部件.通过应用的包名和布局文件的资源id即可创建RemoteViews对象,通知栏通过NotificationManager._romotevie

前端格式化显示json数据可折叠可展开----vue-json-viewer_jsonviewer默认展开-程序员宅基地

文章浏览阅读5.5k次,点赞4次,收藏17次。话不多说,来张效果图:实现方式是安装vue-json-viewer插件,实现步骤如下:1、安装vue-json-viewernpm install vue-json-viewer --save2、main.js引入vue-json-viewerimport JsonViewer from 'vue-json-viewer'3、利用vue-json-viewer展示Json树<template> <div class="json_box"> <!--_jsonviewer默认展开

Spring Boot : 优雅的使用 API 文档工具 Swagger2_springboot使用api-程序员宅基地

文章浏览阅读199次,点赞2次,收藏2次。引言各位在开发的过程中肯定遇到过被接口文档折磨的经历,由于 RESTful 接口的轻量化以及低耦合性,我们在修改接口后文档更新不及时,导致接口的调用方(无论是前端还是后端)经常抱怨接口与文档不一致。程序员的特点是特别不喜欢写文档,但是又同时特别不喜欢别人不写文档。快速上手既然 Swagger2 是一个 API 文档工具,我们就在代码中看一下这个文档工具在 Spring Boot 中是如何使用的吧。(了解源码可+求求: 1791743380)2.1 引入依赖代码清单:spring-boo.._springboot使用api

推荐文章

热门文章

相关标签