Mysql Joins

本文从四种基本类型的连接开始将讨论一个特定的功能,JOIN。我们将主要针对MySQL使用一些示例,然后继续进行更高级的连接,其中一些示例涉及三个表。

上图(维恩图)主要用于描述连接,但是有些人认为它实际上是混淆甚至误导的表示(在解释连接时对维恩图说不)。对于另一种表示方法,请考虑连接图,如下图所示:

交叉连接的名称来自于叉乘(线性代数和矩阵)——您基本上取左边的每一项,然后将它与右边的每一项组合起来。当您将一个4行表与一个5行表交叉连接时,结果将是一个4×5=20行的新表。

注意,交叉连接基本上与内部连接相同,但是没有任何条件。换句话说,内部连接必须指定子句“using (t1.key)”,但是这个子句不能与交叉连接一起使用。还要注意,所有其他类型的连接都可以从交叉连接派生。

让我们再来看看这四种JOIN类型的行表示:

我们将使用以下两个表 -  Customers和Orders  - 来说明四种基本连接类型的语法和用例:

Customers:

Orders :

内连接:

如果我们希望获得订购某些产品的所有客户的名称以及有关其订单的所有详细信息,则内部联接是完美的解决方案。

左连接(也称为左外连接):

将左连接视为从第二个表到第一个表(即左侧)的附加信息。在此示例中,我们可以看到来自客户的每个客户,以及来自订单的任何匹配记录。如果Orders中没有匹配的记录,它将只显示为Null。如果我们想要一个没有订购任何产品的客户列表,这个结果很有用。我们可以使用查询轻松完成:“where order_date is NULL”

右连接(也称为右外连接):

顾名思义,它与Left join相反,因此可以将其看作是获取所有订单的列表,并附加客户信息。这一次,我们得到了姓和名的Null值,如果我们想要获得已购买产品的列表,但是由于某种原因没有将客户名输入系统(“其中first_name为Null”),那么这将非常有用。

因为它是左连接的镜像,所以我们可以通过查询“order left join Customers”得到完全相同的结果。

全连接:


我们使用此连接来获取两个表中所有记录的完整列表,但要注意 - 它与CROSS Join不同。另请注意,这次我们得到的行的Null值出现在Left和Right连接中(而在内连接中我们没有得到任何Null。

可视化这四种基本类型另外一个很好的资源是Socratica视频,它用行表示和最小限度地使用Venn图来演示示例。

另外三种连接类型:

• Left Outer Join with Exclusion

• Right Outer Join with Exclusion

• Full Outer Join with Exclusion

基本上,Left Outer Join with Exclusion将与Left Join一样,查询“WHERE t2.key is Null”(正如我们在上面看到的Customers和Orders表)。但是,由于我们可能希望在第二个表中执行子查询,因此它可以像下面的示例中一样方便:

Left Outer Join with Exclusion的示例:

请考虑以下Library/Collections表:

我们希望显示不在用户集合中的所有书籍。此查询显示不在任何用户集合中的所有书籍:

我们怎样才能找到那些不属于特定用户集合的书籍?

让我们试试吧:

让我们分解一下:

最后,我们关联三张表:

2个内连接

2个左外连接

内连接和做外连接

2个内连接:它类似于常规连接,但有三个表,查询将只生成所有三个中存在的元素(没有字段将具有Null值)。

2个左外连接:

让我们来说明一下

表A = Customers, 表B = Orders, 和表C = Payments.

此连接将获取所有客户,如果他们尚未进行购买或尚未付款,则会显示一些Null值。因此,如果我们想要所有未购买或未付款的客户,我们将指定“WHERE t2.key is Null”和“t3.key is Null”。如果我们只想要提前付款或存款但实际上尚未订购的客户,我们会查询“WHERE t2.key is Null”和“t3.key is Null”。对于订购但尚未付款的客户,我们会反之亦然。

内连接和左外连接:

让我们来说明一下。

设表1 =数据科学组1(DS1),表2 =数据科学组2(DS2),表3 =软件工程组(SW)。这个连接将返回从DS1延期到DS2的学生,以及从DS1延期到DS2的更改了程序类型(DS到SW,反之亦然)的SW学生。如果我们只想获得那些延期的连接,我们可以从这个列表中减去两个内部连接(通过使用“t3.key=Null”查询元素)。

原文:https://medium.com/@ram.avni/mysql-joins-110bb151d689

了解新钛云服

告别前任,从薪出发。

招聘|挑战百万年薪

TiOps,支持多云环境安全远程运维,疫情期间免费对外开放,助力远程安全办公!

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

新钛云服出品的部分精品技术干货

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值