As chaves estrangeiras fornecem integridade referencial. Os dados em uma coluna de chave estrangeira são validados - o valor só pode ser um que já exista na tabela e coluna definida na chave estrangeira. É muito eficaz em parar "dados ruins" - alguém não pode inserir o que quiser - números, texto ASCII, etc. Isso significa que os dados são normalizados - valores repetidos foram identificados e isolados em sua própria tabela, então não há mais preocupações sobre como lidar com maiúsculas e minúsculas no texto... e os valores são consistentes. Isso leva à próxima parte - chaves estrangeiras são o que você usa para unir tabelas.
Sua consulta para os projetos de um usuário não funcionaria - você está fazendo referência a uma coluna de
USERS
table quando não há referência à tabela na consulta e não há subconsulta sendo usada para obter essa informação antes de vinculá-la ao PROJECTS
tabela. O que você realmente usaria é:SELECT p.*
FROM PROJECTS p
JOIN USERS u ON u.user_id = p.creator
WHERE u.username = 'John Smith'