当前位置: 首页 > 面试题库 >

左连接和内连接的差异永远存在

澹台文博
2023-03-14
问题内容

我知道在这里和互联网上已经创建了有关该主题的许多主题。但是,我真的无法就两个语句之间的区别得出最终的结论!我的意思是,尝试并尝试可以通过查询获得所需的所有结果,但是我真的无法完全控制刀具!

我正在考虑自己是一个非常优秀的程序员和一个非常出色的SQL-ista,对此我感到有些as愧…

这是一个例子:

  • 我有一个包含网站页面的表格(“ web_page”)
  • 具有类别(“类别”)的表格。
  • 一个类别可以包含一个或多个页面,但反之则不能
  • 一个类别可能根本不包含任何页面
  • 页面可以在网站中可见或看不到

因此,如果我想显示所有类别及其页面,则意味着这两个类别都包含页面,而没有页面,则必须执行以下操作:

FROM category
LEFT JOIN web_page ON ( web_page.category_id = category.category_id AND web_page.active = "Y" )

因此,如果一个类别没有页面,那么我将在该类别的记录中看到web_page_id为NULL。

但是,如果我这样做:

FROM category
LEFT JOIN web_page ON ( web_page.category_id = category.category_id )
...
WHERE web_page.active = "Y"...

我只会选择至少具有一个web_page的类别…但是为什么?

这只是一个例子……我想永远了解一次这种差异!

谢谢你。


问题答案:

为了使查询能够按预期工作,请将条件放入ON子句中:

FROM category
LEFT JOIN web_page ON web_page.category_id = category 
   and web_page.active = "Y"

起作用的原因是(对于大多数数据库,但不是全部)WHERE子句在连接行 之后
过滤行。如果该联接未导致网页行联接(因为该类别没有网页),则该网页的所有列均为null,并且任何值(如"Y")与a的比较null均为假,因此这些非-
合并的行将被过滤掉。

但是,通过将条件移到ON子句中,将在进行 连接时 执行条件,以便您仅 连接的active = "Y",但是如果没有这样的行,则只会得到左侧的连接null网页。

此版本的查询实际上是在说:“给我所有类别及其 活动的 网页(如果有)”

请注意,我说的是“大多数数据库” …例如mysql足够聪明,可以理解您要执行的操作,并且如果在mysql上运行,查询将按预期工作。



 类似资料:
  • 我对CloseableHttpClient管理的连接有问题。Spring服务管理纽约连接: 当执行不成功时,我的setPayment方法最多调用3次。有时在第一次执行后,我的方法挂起而没有响应。欢迎任何建议。

  • 当我添加一个左连接来获取外部表的计数时,它将我其他左连接表的总和值与计数相乘,我也不能在这里使用不同的总和,因为两个值可以是相同的:

  • 本文向大家介绍说下左连接和右连接相关面试题,主要包含被问及说下左连接和右连接时的应答技巧和注意事项,需要的朋友参考一下 比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。 右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替

  • 有什么让我怀念的吗?如果我必须手动关闭连接,是不是至少可以从Javers那里收到一个不再需要连接的通知?

  • 我想返回每个行,并为和提供空值,如果它们没有。当我执行此查询时,我得到空结果。如果我使用而不是,我得到不正确的结果。如何过滤左连接,以便如果没有匹配,我仍然得到返回的p行与和的空值? 注:我在末尾添加了,仅用于测试目的。

  • 内连接,显示两个表中有联系的所有数据; 左链接,以左表为参照,显示所有数据,右表中没有则以null显示 右链接,以右表为参照显示数据,,左表中没有则以null显示