access inner join 数据类型不匹配_MySQL 基本语句五 Join

9fa68a532becb33304e3122ded897be0.png

Join 就是两张表的合并:数据分散在不同的表格里,当需要合并的时候,输入数据管理语句,找到要使用的数据。

SQL中的连接(JOIN)语句用于将数据库中的两个或多个表组合起来。由"连接"生成的集合,可以被保存为表,或者当成表来使用。JOIN 语句的含义是把两张表的属性通过它们的值组合在一起。基于 ANSI 标准的 SQL 列出了五种 JOIN 方式:内连接(INNER),全外连接(FULL OUTER),左外连接(LEFT OUTER),右外连接(RIGHT OUTER)和交叉连接(CROSS)。在特定的情况下,一张表(基本表,视图,或连接表)可以和自身进行连接,成为自连接(self-join)。

合并的种类不同,集合下面的图,来说明一下

Inner join 保留两个表中相交部分的数据

Left join(Outer) 先保留左边的数据,然后根据表A 去搜索与表B相交的部分

Right join(Outer)先保留左边的数据,然后根据表B 去搜索与表A相交的部分

Full Join (Outer) 两边的数据全部保留

下面的这个韦恩图,清晰明了,还要注意下面的代码区别:

5b5b167711cef256078b03e2e263912f.png

笛卡尔乘积:这个乘积是 sql 执行Join 语句时候的基本思路。但是会对这个join的过程进行优化:Mysql用的Loop join(首先走一遍A,对A 中的每一条记录与B表进行比较链接,满足id相同,返回记录)/还有其他的join: Merge join(对AB两个表进行排序,同时验证id是否相同)/ Hash join (首先对A表中的id记录进行hash计算,生成hash表,然后join,把B表中的每条记录的进行hash运算,然后在A 的hash表中验证是否一致,最后得出结果)

是指两个集合XY的笛卡尓积(Cartesian product)

设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.

笛卡尔积的符号化为:

A×B={(x,y)|x∈A∧y∈B}

例如,A={a,b}, B={0,1,2},则

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

6d756509aaac1bf20eef1a7c0fac3ab5.png

mysql 官方文档对应的代码:

e1fb732b31ea8d25be658ea159a3a8b1.png

举个inner join 的例子:

https://www.w3schools.com/sql/sql_join.asp​www.w3schools.com

有两个表格,一个订单表格,一个顾客信息表格:

37dfa81ef95d426778a0c0fe6b606808.png
订单信息表

292c50cfd10bef404e48aa9cf1464a5a.png
顾客信息表

订单”表中的“ CustomerID”列是指“客户”表中的“ CustomerID”。 上面两个表之间的关系是“ CustomerID”列

然后,我们可以创建以下SQL语句(包含一个INNER JOIN),该语句选择两个表中具有匹配值的记录:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate

FROM Orders

INNERJOIN Customers ON Orders.CustomerID=Customers.CustomerID;

结果是这样的:

ac3e2cc10d8aa3630b80cabda99bb2f6.png

再来left join的例子:

SELECT Customers.CustomerName, Orders.OrderID

FROM Customers

LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

ORDER BY Customers.CustomerName;

注意:即使右侧表(订单)中没有匹配项,LEFT JOIN关键字也会从左侧表(客户)返回所有记录。

还是两个表格,顾客表和订单表,来看一下原来的表格:

fdbabcaf85d281ef4024ce7182879193.png

bf2bee9998323fd84e8b02a890fa8f05.png

结果是这样:

68bf177c24b8c5a17fdf8f626001ac64.png

韦恩图与代码结合~

2506cc79d55bfbc883484c49abaa73b9.png

6b9b65768621a89c44245526afcc2623.png

0b3b7e90650b4454c72491eea232f712.png

fe51f88f2ebf082a726ba9d8680460a7.png

38f873607a5433ef7f6abff490d2d179.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值