vfp outer left inner full entre ejemplo diferencias diferencia sql database relational-database relational-algebra

sql - outer - Diferencia entre una unión theta, equijoin y unión natural



union en sql (8)

Tengo problemas para entender el álgebra relacional cuando se trata de uniones theta, equijoins y uniones naturales. ¿Podría alguien ayudarme a entenderlo mejor? Si utilizo el signo = en una unión theta ¿es exactamente lo mismo que usar una combinación natural?


El producto cartesiano de dos tablas da todas las combinaciones posibles de tuplas, como el ejemplo en matemáticas, el producto cruzado de dos conjuntos. ya que muchas veces hay algunos valores basura que también ocupan espacio innecesario en la memoria, por lo que aquí viene a rescatar la unión que da la combinación de solo aquellos valores de atributo que son necesarios y significativos.

La unión interna da el campo repetido en la tabla dos veces, mientras que la unión natural aquí resuelve el problema simplemente filtrando las columnas repetidas y mostrándolas solo una vez. De lo contrario, ambas funcionan igual. la unión natural es más eficiente ya que conserva la memoria. Además, las redundancias se eliminan en la unión natural.

equi join de dos tablas es tal que solo muestran esas tuplas que coinciden con el valor en otra tabla. por ejemplo: deje que new1 y new2 sean dos tablas. si sql query selecciona * de new1 join new2 en new1.id = new.id (id es la misma columna en dos tablas) luego comienza desde la tabla new2 y únete para que coincida con el id en la segunda tabla. además, non equi join no tiene el operador de igualdad que tienen <,>, y entre el operador.

theta join consta de todos los operadores de comparación, incluidos igualdad y otros <,> operador de comparación. cuando usa el operador de igualdad (=) se conoce como equi join.


La respuesta de @outis es buena: concisa y correcta en lo que respecta a las relaciones.

Sin embargo, la situación es un poco más complicada en lo que respecta a SQL.

Considere la base de datos habitual de proveedores y partes pero implementada en SQL:

SELECT * FROM S NATURAL JOIN SP;

devolvería un conjunto de resultados ** con columnas

SNO, SNAME, STATUS, CITY, PNO, QTY

La unión se realiza en la columna con el mismo nombre en ambas tablas, SNO . Tenga en cuenta que el conjunto de resultados tiene seis columnas y solo contiene una columna para SNO .

Ahora considere un theta eqijoin, donde los nombres de columna para la unión deben especificarse explícitamente (además de que se requieren las variables de rango S y SP ):

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

El conjunto de resultados tendrá siete columnas, incluidas dos columnas para SNO . Los nombres del conjunto de resultados son a lo que el estándar SQL se refiere como "dependiente de la implementación" pero podría verse así:

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

o quizás esto

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

En otras palabras, puede considerarse NATURAL JOIN en SQL para eliminar columnas con nombres duplicados del conjunto de resultados (pero lamentablemente no eliminará las filas duplicadas; debe recordar cambiar SELECT para SELECT DISTINCT ).

** No sé muy bien cuál es el resultado de SELECT * FROM table_expression; es. Sé que no es una relación porque, entre otras razones, puede tener columnas con nombres duplicados o una columna sin nombre. Sé que no es un conjunto porque, entre otras razones, el orden de las columnas es significativo. Ni siquiera es una tabla SQL o expresión de tabla SQL. Lo llamo un conjunto de resultados.


Natural es un subconjunto de Equi que es un subconjunto de Theta.

Si utilizo el signo = en una unión theta, ¿es exactamente lo mismo que usar una unión natural?

No necesariamente, pero sería un Equi. Natural significa que está haciendo coincidir todas las columnas con nombres similares, Equi solo significa que está usando ''='' exclusivamente (y no ''menos que'', como, etc.)

Sin embargo, esto es pura academia, podrías trabajar con bases de datos relacionales durante años y nunca escuchar a nadie usar estos términos.


Si bien las respuestas que explican las diferencias exactas son buenas, quiero mostrar cómo el álgebra relacional se transforma en SQL y cuál es el valor real de los 3 conceptos.

El concepto clave en su pregunta es la idea de una unión. Para entender una unión, debe comprender un Producto cartesiano (el ejemplo se basa en SQL, donde el equivalente se llama una combinación cruzada como un día cuando señala);

Esto no es muy útil en la práctica. Considera este ejemplo.

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

El Producto cartesiano Producto x Componente será - abajo o sql violín . Puede ver que hay 12 filas = 3 x 4. Obviamente, las filas como "Ordenador portátil" con "ruedas" no tienen ningún significado, esta es la razón por la que en la práctica el producto cartesiano rara vez se utiliza.

| 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 |

Las UNIONES están aquí para agregar más valor a estos productos. Lo que realmente queremos es "unir" el producto con sus componentes asociados, porque cada componente pertenece a un producto. La forma de hacerlo es con un join:

Producto JOIN Component ON Pname

La consulta SQL asociada sería así (puedes jugar con todos los ejemplos aquí )

SELECT * FROM Product JOIN Component ON Product.Pname = Component.Pname

y el resultado:

| PNAME | PRICE | CNAME | COST | ---------------------------------- | Laptop | 1500 | CPU | 500 | | Laptop | 1500 | hdd | 300 | | Laptop | 1500 | case | 700 | | Car | 20000 | wheels | 1000 |

Tenga en cuenta que el resultado tiene solo 4 filas, porque la computadora portátil tiene 3 componentes, el automóvil tiene 1 y el avión no. Esto es mucho más útil.

Volviendo a sus preguntas, todas las uniones que hace son variaciones de la JOIN que acabo de mostrar:

Natural Join = la unión (la cláusula ON) se realiza en todas las columnas con el mismo nombre; elimina las columnas duplicadas del resultado, a diferencia de todas las demás uniones; la mayoría de los DBMS (sistemas de bases de datos creados por varios proveedores como SQL Server de Microsoft, MySQL de Oracle, etc.) ni siquiera se toman la molestia de respaldar esto, es solo una mala práctica (o deliberadamente eligió no implementarla). Imagine que un desarrollador viene y cambia el nombre de la segunda columna en Producto de Precio a Costo. Entonces todas las uniones naturales se realizarían en PName Y en Costo, lo que da como resultado 0 filas, ya que no hay números que coincidan.

Theta Join = esta es la unión general que todo el mundo usa porque le permite especificar la condición (la cláusula ON en SQL). Puede unirse casi a cualquier condición que desee, por ejemplo, en Productos que tienen las primeras 2 letras similares, o que tienen un precio diferente. En la práctica, esto rara vez es el caso, en el 95% de los casos se unirá a una condición de igualdad, lo que nos lleva a:

Equi Join = el más común utilizado en la práctica. El ejemplo anterior es un equi join. ¡Las bases de datos están optimizadas para este tipo de uniones! El opuesto de un equi join es un join no equi, es decir, cuando te unes a una condición que no sea "=". ¡Las bases de datos no están optimizadas para esto! Ambos son subconjuntos de theta join general. La unión natural también es una unión theta, pero la condición (la theta) es implícita.

Fuente de información: desarrollador de SQL Server certificado + de la universidad + completó recientemente el MOO "Introducción a las bases de datos" de Stanford así que me atrevo a decir que tengo en mente el álgebra relacional en mente.


Una unión theta permite relaciones de comparación arbitrarias (como ≥).

Una equijoin es una unión theta usando el operador de igualdad.

Una unión natural es una equijoin en atributos que tienen el mismo nombre en cada relación.

Además, una combinación natural elimina las columnas duplicadas implicadas en la comparación de igualdad, por lo que solo queda 1 de cada columna comparada; en términos relacionales algebraicos aproximados: ⋈ = π R,S- a s ○ ⋈ a R = a S


Una unión theta permite relaciones de comparación arbitrarias.

Una equijoin es una unión theta usando el operador de igualdad.


Unión natural: la unión natural puede ser posible cuando hay al menos un atributo común en dos relaciones.

Theta Join: Theta join puede ser posible cuando dos actúan en condiciones particulares.

Equi Join: Equi puede ser posible cuando dos actúan en condiciones de equidad. Es un tipo de unión theta.


Theta Join: cuando realiza una consulta para unirse usando cualquier operador, (por ej., =, <,>,> = Etc.), esa consulta de unión viene bajo Theta join.

Equi Join: cuando realiza una consulta para unirse utilizando solo el operador de igualdad, esa consulta de combinación se incluye en Equi join.

Ejemplo:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID; > SELECT * FROM Emp INNER JOIN Dept USING(DeptID)

This will show: _________________________________________________ | Emp.Name | Emp.DeptID | Dept.Name | Dept.DeptID | | | | | |

Nota: ¡Equi join es también una unión theta!

Unión natural: un tipo de Equi Join que se produce implícitamente al comparar todas las columnas de los mismos nombres en ambas tablas.

Nota: aquí, el resultado de la combinación tiene solo una columna por cada par de columnas con el mismo nombre.

Ejemplo

SELECT * FROM Emp NATURAL JOIN Dept

This will show: _______________________________ | DeptID | Emp.Name | Dept.Name | | | | |