Popular White Paper On This Topic

Your second query will throw the syntactical error, as every join operation
(except cross) requires ON operation.
If I understand your actual doubt; then ON condition should always be used
to bring the matching rows together from the joined tables.
Ex:
Sel a.col1,b.col2
From a , b
Where a.id=b.id
And b.date>'2013-01-31'

The above query will also try to do the same inner join operation. However,
writing your query with proper conventions will save you from ending up
with Product joins.
Here, your 1st query is the valid example of it.
In that example, WHERE condition tries to reduce down the volume of data to
be joined more than helping to show the joining conditions.

Generally speaking, when using JOIN ... ON syntax, the ON clause applies to the join condition, and the WHERE clause applies to the join result. If you think of the join as something that creates a new virtual table (it is a table in relational theory - it has rows and columns), the WHERE clause applies to that new virtual table. So it makes sense to say something like:

or something like that. In general, you get better performance by putting as many conditions as possible in the ON clause, because that restricts the number of rows that are joined.

In some cases, especially outer joins, you will get different results if a condition is in the ON clause than if it is in the WHERE clause. I believe the SQL DML manual shows some examples of this in the section on outer join.

I think, residual condition written under WHERE clause is considered while join operation itself.
Otherwise, we would have seen most of the predicates written within ON clauses, rather than WHERE clause.
However, it's true in the case of OUTER joins.