MySQL:区分各种join,连接条件on和过滤条件where

哦,你在写数据库教材吗?那么我们来谈谈这个想法,但不要太正式。

上周,一位客户向我询问有关 MySQL 连接的问题,我惊出了一身冷汗。
后来我发现他分不清on和where。
我这里碰巧有一份文件。
让我帮助您评论和我自己的评论。

我们先来谈谈连接性。
最简单的一种是内连接。
这就像说“我需要瞄准裤子的腰带”一样简单。
两个表必须有一些共同点(例如提到的 ID),没有共同点的表将被忽略。
与您给出的示例类似,在 id_name 和 id_age 表中,仅查看 ID,1 匹配,但 2 和 3 不匹配,并且 2 和 3 不会出现在内连接结果中。
这与左连接/右连接不同。

左连接(左外连接)的特别之处就是折磨。
例如,假设您有一个表记录客户列表(id_name),另一个表记录客户最近的消费记录(id_age)。
使用左连接进行检查可确保列表中的所有客户都包含在结果中,即使他们从未消费过(不在 id_age 中)。
如果没有消费记录,请在id_age列中输入NULL。
id=2 和 id=3 在 id_age 中没有对应关系,这就是为什么两个左连接结果都添加了 NULL。

右连接的作用相反:即使客户的姓名不在 id_name 表中,id_age 表中的所有记录也将包含在结果中。
使用右连接进行检查。
如果 id_name 不存在,请在 id_name 列中输入 NULL。

以前,我因为分错了左和右而陷入了很多麻烦。
我记得2 02 3 年,我在上海做一个购物中心项目。
客户索要一份报告,说:“我想要所有会员最近的消费记录。
”我直接使用了内连接,但结果丢失了,因为会员没有使用它。
改用左连接后,客户很满意。
了解主表和辅助表(左侧主表的左连接,右侧主表的右连接)很重要。

让我们谈谈时间和地点。
以前,很难区分两者之间的区别。
简单来说,就是在连接之前进行过滤,以确保你连接的表有合格的数据行。
例如,两个表中都存在 id=1 的行,且 on 条件为 id_name.id = id_age.id。
仅当满足此条件时才能建立连接。
这里,从连接完成后的结果中选择。
例如,您可能希望排除年满 1 8 岁或以上的用户,即使在连接完成后也是如此。
在这种情况下,使用where。

最令人困惑的是左连接。
连接时必须正确写入on条件。
否则,连接的数据将会混乱。
但连接完成后,无论是否加where条件,效果都是一样的。
在左连接中,无论右表 (id_age) 中是否存在匹配项,都会使用左表 (id_name)。
由于所有行均已从 中提取,因此使用 where 过滤age 的结果与先使用on 过滤age 最后使用where 过滤age 的结果相同。

但是,请注意,对于内连接,虽然您可以在 on 和 where 上重复过滤条件,但将其写入 on 可能会更有效,因为它可能会被数据库优化器使用。
但大多数情况下结果是一样的,只需写出位置即可。

我有一个朋友,他非常擅长编写SQL。
他总是这么说。
“on 处理连接,where 处理过滤。
不要混淆它们。
”有点绝对,但确实说到点子上了。
与烹饪一样,先切碎蔬菜(连接面),然后煎炸(过滤面)。

您的文档非常详细并且包含足够的示例。
不要在最后使用那些礼貌用语,只需说“了解什么在哪里,清晰连接和过滤,轻松使用 MySQL”。
无论如何,你可以弄清楚。
这类似于记忆英语单词。
在你知道如何去做之前,你需要练习并遇到障碍。

mysql左连接没有数据还会查出来吗

哎呀,这个 SQL 连接问题,我以前也遇到过类似的陷阱。
我记得在一个项目中,我需要使用左连接来处理两个数据表中的信息。
当我使用左连接时,我发现右表中的某些数据不匹配并且显示为NULL值。
我当时想,如果我把这个null值留为null的话,不会影响整体情况。

结果领导后来表示这些空值是代表某些业务逻辑所必需的。
我当时就傻眼了,因为我在查询的时候添加了过滤条件来过滤掉这些空值。
就在那时我意识到左连接数据实际上可以保存 NULL 值。
结果过滤后的数据就少了。

后来,我不得不重写查询。
这次我没有添加任何过滤条件,直接使用左连接。
这样所有的空值都被保留下来,读者也不再说什么了。
这次经历让我对左连接和过滤条件的关系有了深刻的认识。

SQL查询中左连接、右连接和内连接的简要说明。
左连接是在左表的基础上,根据ON后的条件连接两个表。
结果将在左表中列出,列出所有信息,只有符合条件的信息才会在右表中列出。
右连接则相反。
根据内表连接右边的表。
内部联接仅显示两个表中的匹配数据。

我敢这么说,是因为我确实遇到过。
不过,我不会废话谈论 SQL 的其他高级用法。
毕竟我不是专家。
哈哈哈,暂时就这些,下次再详细说。

mysql中inner join的用法

INNERJOIN 直接连接两个表,并且只显示匹配的表。

ON后面写条件,一般是主键和外键。

我上周刚刚处理了一份客户订单并写道: sql SELECT c.name, o.product_name 来自客户 c Order INNER JOIN o ON c.id = o.customer_id;
没有订单的客户立即消失。

想要统计每个客户的订单数量? sql SELECT c.name, COUNT(o.id) AS order_total 来自客户 c 订单 INNER JOIN o ON c.id = o.customer_id GROUP BY c.name;
如果没有顺序,则不会自动计算顺序。

连接多个表?直接添加JOIN即可。
sql SELECT c.name, o.product_name 来自客户 c 订单 INNER JOIN o ON c.id = o.customer_id INNER JOIN 产品 p ON o.product_id = p.id WHERE p.category = 'Electronics';
仅针对购买过电器产品的客户显示。

注意:INNERJOIN 是最严格的匹配,所有不匹配的行将被删除。
当表很大时,最好给ON状态字段添加索引。

你自己看看,就用这个。