Embora as respostas que explicam as diferenças exatas sejam boas, quero mostrar como a álgebra relacional é transformada em SQL e qual é o valor real dos 3 conceitos.
O conceito principal em sua pergunta é a ideia de uma junção. Para entender uma junção, você precisa entender um Produto Cartesiano (o exemplo é baseado em SQL onde o equivalente é chamado de junção cruzada como onedaywhen aponta);
Isso não é muito útil na prática. Considere este exemplo.
Product(PName, Price)
====================
Laptop, 1500
Car, 20000
Airplane, 3000000
Component(PName, CName, Cost)
=============================
Laptop, CPU, 500
Laptop, hdd, 300
Laptop, case, 700
Car, wheels, 1000
O produto cartesiano Produto x Componente será - abaixo ou sql fiddle . Você pode ver que há 12 linhas = 3 x 4. Obviamente, linhas como "Laptop" com "rodas" não têm significado, é por isso que na prática o produto cartesiano raramente é usado.
| PNAME | PRICE | CNAME | COST |
--------------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Laptop | 1500 | wheels | 1000 |
| Car | 20000 | CPU | 500 |
| Car | 20000 | hdd | 300 |
| Car | 20000 | case | 700 |
| Car | 20000 | wheels | 1000 |
| Airplane | 3000000 | CPU | 500 |
| Airplane | 3000000 | hdd | 300 |
| Airplane | 3000000 | case | 700 |
| Airplane | 3000000 | wheels | 1000 |
JOINs estão aqui para agregar mais valor a esses produtos. O que realmente queremos é "unir" o produto com seus componentes associados, pois cada componente pertence a um produto. A maneira de fazer isso é com uma junção:
Componente JOIN do produto ON Pname
A consulta SQL associada seria assim (você pode brincar com todos os exemplos aqui )
SELECT *
FROM Product
JOIN Component
ON Product.Pname = Component.Pname
e o resultado:
| PNAME | PRICE | CNAME | COST |
----------------------------------
| Laptop | 1500 | CPU | 500 |
| Laptop | 1500 | hdd | 300 |
| Laptop | 1500 | case | 700 |
| Car | 20000 | wheels | 1000 |
Observe que o resultado tem apenas 4 linhas, pois o Laptop tem 3 componentes, o Carro tem 1 e o Avião nenhum. Isso é muito mais útil.
Voltando às suas perguntas, todas as junções sobre as quais você pergunta são variações do JOIN que acabei de mostrar:
Junção natural = a junção (a cláusula ON) é feita em todas as colunas com o mesmo nome; remove colunas duplicadas do resultado, ao contrário de todas as outras junções; a maioria dos SGBDs (sistemas de banco de dados criados por vários fornecedores, como SQL Server da Microsoft, MySQL da Oracle etc.) nem mesmo se preocupam em oferecer suporte a isso, é apenas uma prática ruim (ou optou propositalmente por não implementá-lo). Imagine que um desenvolvedor venha e altere o nome da segunda coluna em Produto de Preço para Custo. Então, todas as junções naturais seriam feitas em PName E em Cost, resultando em 0 linhas, pois nenhum número corresponde.
Theta Join = esta é a junção geral que todos usam, pois permite que você especifique a condição (a cláusula ON no SQL). Você pode aderir a praticamente qualquer condição que desejar, por exemplo, em Produtos que tenham as 2 primeiras letras semelhantes ou que tenham um preço diferente. Na prática, raramente é o caso - em 95% dos casos, você ingressará em condição de igualdade, o que nos leva a:
Equi Join = o mais comum usado na prática. O exemplo acima é uma junção equi. Os bancos de dados são otimizados para este tipo de junções! O oposto de uma junção equi é uma junção não equi, ou seja, quando você junta em uma condição diferente de "=". Bancos de dados não são otimizados para isso! Ambos são subconjuntos da junção teta geral. A junção natural também é uma junção theta, mas a condição (theta) está implícita.
Fonte da informação: universidade + desenvolvedor certificado em SQL Server + completou recentemente o MOO "Introdução aos bancos de dados" de Stanford, então ouso dizer que tenho álgebra relacional fresca em mente.