Рассматривайте предложение FROM как отдельную часть обработки, а не предложение WHERE (которое каждый продукт должен притворяться, с точки зрения стандартов).
Во время левого соединения система примет каждоеСтрока из левой таблицы, и попытаться найти совпадения в правой таблице.Если есть совпадения, то он будет производить одну строку в выходных данных для каждой совпадающей строки в правой таблице. Если совпадений нет , то он выдаст одну строку со всеми столбцами правой таблицы, установленными в NULL.
В вашем первом запросе это действительно так.Но во втором запросе во время обработки предложения FROM ему удается создать строку, соответствующую условию JOIN:
3 Blue 10 3
Таким образом, он никогда не создает строку со значениями NULL для этих столбцов из правой таблицы.
Теперь, когда обрабатывается предложение WHERE, ваши условия исключают эту строку из окончательного набора результатов.
Как уже говорили другие, вы, возможно, помните синтаксис соединения до ANSI, который могдают удивительные результаты.