小编典典

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

sql

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

我正在考虑自己是一个非常优秀的程序员和一个非常出色的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的类别…但是为什么?

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

谢谢你。


阅读 42

收藏
2021-04-22

共1个答案

小编典典

为了使查询能够按预期工作,请将条件放入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上运行,查询将按预期工作。

2021-04-22