我知道在这里和互联网上已经创建了有关该主题的许多主题。但是,我真的无法就两个语句之间的区别得出最终的结论!我的意思是,尝试并尝试可以通过查询获得所需的所有结果,但是我真的无法完全控制刀具!
我正在考虑自己是一个非常优秀的程序员和一个非常出色的SQL-ista,对此我感到有些as愧…
这是一个例子:
因此,如果我想显示所有类别及其页面,则意味着这两个类别都包含页面,而没有页面,则必须执行以下操作:
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子句中:
ON
FROM category LEFT JOIN web_page ON web_page.category_id = category and web_page.active = "Y"
起作用的原因是(对于大多数数据库,但不是全部)WHERE子句在连接行 之后 过滤行。如果该联接未导致网页行联接(因为该类别没有网页),则该网页的所有列均为null,并且任何值(如"Y")与a的比较null均为假,因此这些非- 合并的行将被过滤掉。
WHERE
null
"Y"
但是,通过将条件移到ON子句中,将在进行 连接时 执行条件,以便您仅 连接的 行active = "Y",但是如果没有这样的行,则只会得到左侧的连接null网页。
active = "Y"
此版本的查询实际上是在说:“给我所有类别及其 活动的 网页(如果有)”
请注意,我说的是“大多数数据库” …例如mysql足够聪明,可以理解您要执行的操作,并且如果在mysql上运行,查询将按预期工作。