When you study relational theory foreign keys are mandatory. But in practice, in every place I worked, table products and joins are always done by specifying the keys explicitly in the query, instead of relying on foreign keys in the DBMS.
This way, you could join two tables by fields that are not meant to be foreign keys, having unexpected results.
Why is that?
Shouldn't DBMSs enforce that Joins and Products be made only by foreign keys?
The main reason for FKs is reference integrity. But if you design a DB, relationships in the model (arrows in the ERD) become foreign keys. (N:M relationships become separate tables.) Whether or not you define them as such in your DBMS, they're semantically FKs.
I can't imagine the need to join tables by fields that aren't FKs; what is an example?