Estou tendo problemas para entender álgebra relacional quando se trata de junções theta, equijoins e junções naturais. Alguém poderia me ajudar a entender melhor? Se eu usar o sinal = em uma junção theta, é exatamente o mesmo que usar uma junção natural?
sql
database
relational-database
relational-algebra
macluniano
fonte
fonte
Respostas:
Uma junção theta permite relacionamentos de comparação arbitrários (como ≥).
Um equijoin é uma junção theta usando o operador de igualdade.
Uma junção natural é uma junção equivalente em atributos que têm o mesmo nome em cada relacionamento.
Além disso, uma junção natural remove as colunas duplicadas envolvidas na comparação de igualdade, de forma que apenas 1 de cada coluna comparada permanece; em termos algébricos relacionais aproximados:
⋈ = πR,S-as ○ ⋈aR=aS
fonte
theta
junção in theta refere-se a uma condição arbitrária usada como critério para a junção. (ver Database Systems: The Complete Book by Garcia-Molina, Ullman, Widom, capítulo 2, Theta Join)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.
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.
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:
A consulta SQL associada seria assim (você pode brincar com todos os exemplos aqui )
e o resultado:
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.
fonte
CROSS JOIN
operação em SQL resulta em uma expressão de tabela (linhas de colunas). O produto cartesiano da operação de conjunto resulta em um conjunto de pares.SELECT * FROM...
(e talvez você faça). Mas está na linguagem, está em cada implementação SQL e eu o uso com frequência (e aposto que você também!) Dica nem todo código é código de produção.A resposta de @outis é boa: concisa e correta nas relações.
No entanto, a situação é um pouco mais complicada no que diz respeito ao SQL.
Considere os fornecedores usuais e banco de dados de peças, mas implementado em SQL:
retornaria um conjunto de resultados ** com colunas
SNO, SNAME, STATUS, CITY, PNO, QTY
A junção é realizada na coluna com o mesmo nome em ambas as tabelas
SNO
,. Observe que o conjunto de resultados possui seis colunas e contém apenas uma coluna paraSNO
.Agora, considere um theta eqijoin, em que os nomes das colunas para a junção devem ser especificados explicitamente (além de variáveis de intervalo
S
eSP
são obrigatórios):O conjunto de resultados terá sete colunas, incluindo duas colunas para
SNO
. Os nomes do conjunto de resultados são o que o padrão SQL chama de "dependente da implementação", mas podem ter a seguinte aparência:SNO, SNAME, STATUS, CITY, SNO, PNO, QTY
ou talvez isso
S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY
Em outras palavras,
NATURAL JOIN
em SQL pode ser considerado a remoção de colunas com nomes duplicados do conjunto de resultados (mas infelizmente não removerá linhas duplicadas - você deve se lembrar de mudarSELECT
paraSELECT DISTINCT
você mesmo).** Não sei bem qual é o resultado
SELECT * FROM table_expression;
. Sei que não é uma relação porque, entre outros motivos, pode ter colunas com nomes duplicados ou uma coluna sem nome. Sei que não é um conjunto porque, entre outros motivos, a ordem das colunas é significativa. Não é nem mesmo uma tabela SQL ou expressão de tabela SQL. Eu chamo isso de conjunto de resultados.fonte
JOIN ... USING(...)
.SELECT * FROM table_expression;
" ?Natural é um subconjunto de Equi, que é um subconjunto de Theta.
Não necessariamente, mas seria um Equi. Natural significa que você está combinando em todas as colunas com nomes semelhantes, Equi apenas significa que você está usando '=' exclusivamente (e não 'menos que', como, etc)
No entanto, isso é puro meio acadêmico. Você poderia trabalhar com bancos de dados relacionais por anos e nunca ouvir ninguém usar esses termos.
fonte
Junção Theta: Quando você faz uma consulta para junção usando qualquer operador, (por exemplo, =, <,>,> = etc.), então essa consulta de junção vem sob junção Theta.
Equi Join: Quando você faz uma consulta por junção usando apenas o operador de igualdade, essa consulta de junção vem sob a junção Equi.
Exemplo:
Nota: Equi join também é theta join!
Junção natural: um tipo de junção Equi que ocorre implicitamente ao comparar todas as mesmas colunas de nomes em ambas as tabelas.
Nota: aqui, o resultado da junção tem apenas uma coluna para cada par de colunas com o mesmo nome.
Exemplo
fonte
O produto cartesiano de duas tabelas fornece todas as combinações possíveis de tuplas, como o exemplo da matemática, o produto vetorial de dois conjuntos. já que muitas vezes existem alguns valores inúteis que ocupam espaço desnecessário na memória também, então aqui vem o resgate de junções que fornecem a combinação apenas daqueles valores de atributo que são necessários e são significativos.
a junção interna fornece o campo repetido na tabela duas vezes, enquanto a junção natural aqui resolve o problema apenas filtrando as colunas repetidas e exibindo-as apenas uma vez. Do contrário, ambos funcionam da mesma forma. a junção natural é mais eficiente, pois preserva a memória. Além disso, as redundâncias são removidas na junção natural.
A junção equi de duas tabelas é tal que exibem apenas as tuplas que correspondem ao valor da outra tabela. por exemplo: sejam new1 e new2 duas tabelas. if sql query select * from new1 join new2 on new1.id = new.id (id é a mesma coluna em duas tabelas) então comece a partir da tabela new2 e join que corresponde ao id na segunda tabela. além disso, non equi join não tem operador de igualdade, eles têm <,> e operador entre.
theta join consiste em todos os operadores de comparação, incluindo igualdade e outros <,> operadores de comparação. quando usa o operador de igualdade (=), é conhecido como junção de equi.
fonte
Junção natural: a junção natural pode ser possível quando há pelo menos um atributo comum em duas relações.
União Theta: A união Theta pode ser possível quando dois agem em uma condição específica.
Equi Join: Equi pode ser possível quando dois atuam na condição de igualdade. É um tipo de junção theta.
fonte