¿Cuál es la diferencia entre una unión natural y una unión interna?
¿Cuál es la diferencia entre una unión natural y una unión interna?
Respuestas:
Una diferencia significativa entre INNER JOIN y NATURAL JOIN es el número de columnas devueltas.
Considerar:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
El INNER JOIN
de la Tabla A y la Tabla B en la columna 1 volverá
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
El NATURAL JOIN
de TableA y TableB en Column1 devolverá:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
Se evita la columna repetida.
(AFAICT de la gramática estándar, no puede especificar las columnas de unión en una unión natural; la unión se basa estrictamente en el nombre. Consulte también Wikipedia ).
( Hay una trampa en la combinación interna producción, el trabajo a.
y b.
las partes no estarían en los nombres de columna, sólo tendría column1
, column2
, column1
, column3
como los encabezados. )
NATURAL JOIN
arruinará exactamente , por qué es inesperado y en qué mundo estás?
Customers
y Employees
, uniéndote EmployeeID
. Employees
También tiene un ManagerID
campo. Todo está bien. Entonces, algún día, alguien agrega un ManagerID
campo a la Customers
tabla. Su unión no se romperá (eso sería una misericordia), sino que ahora incluirá un segundo campo y funcionará incorrectamente . Por lo tanto, un cambio aparentemente inofensivo puede romper algo solo distantemente relacionado. MUY MAL. La única ventaja de una unión natural es ahorrar un poco de mecanografía, y la desventaja es sustancial.
SELECT * FROM TableA INNER JOIN TableB USING (Column1)
da 4 columnas. Esto no es correcto porque SELECT * FROM TableA INNER JOIN TableB USING (Column1)
y SELECT * FROM TableA NATURAL JOIN TableB
son iguales, ambos dan 3 columnas.
natural left
o natural right
) que asume que el criterio de combinación es donde las columnas con el mismo nombre en ambas tablas coincidenEvitaría usar combinaciones naturales como la peste, porque las combinaciones naturales son:
NATURAL JOIN Checkouts
"de aspecto casual solo son posibles cuando las convenciones de nombres de bases de datos son formales y se aplican ..."
id
es omnipresente e inútil unirse; los nombres de clave foránea habituales son tablename_id
. Las uniones naturales son una mala, mala, mala idea.
Una combinación natural es solo un atajo para evitar escribir, con la presunción de que la combinación es simple y coincide con campos del mismo nombre.
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
Es lo mismo que...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Sin embargo, lo que no puede hacer con el formato de acceso directo son combinaciones más complejas ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
NATURAL JOIN ... USING ()
:? El estándar es a NATURAL JOIN b
oa JOIN b USING (c)
room_number
, mientras que sus uniones internas tendrán dos columnas con nombre room_number
.
SQL no es fiel al modelo relacional de muchas maneras. El resultado de una consulta SQL no es una relación porque puede tener columnas con nombres duplicados, columnas 'anónimas' (sin nombre), filas duplicadas, nulos, etc. SQL no trata las tablas como relaciones porque se basa en el orden de las columnas, etc.
La idea detrás NATURAL JOIN
de SQL es hacer que sea más fácil ser más fiel al modelo relacional. El resultado de las NATURAL JOIN
dos tablas tendrá columnas desduplicadas por nombre, por lo tanto, no habrá columnas anónimas. Del mismo modo, UNION CORRESPONDING
y EXCEPT CORRESPONDING
se proporcionan para abordar la dependencia de SQL en el orden de las columnas en la UNION
sintaxis heredada .
Sin embargo, como con todas las técnicas de programación, se requiere disciplina para ser útil. Uno de los requisitos para un éxito NATURAL JOIN
es nombrar columnas consistentemente, porque las uniones están implícitas en columnas con los mismos nombres (es una pena que la sintaxis para renombrar columnas en SQL sea detallada, pero el efecto secundario es fomentar la disciplina al nombrar columnas en tablas base y VIEW
s :)
Tenga en cuenta que un SQL NATURAL JOIN
es un equi-join **, sin embargo, esto no es obstáculo para la utilidad. Tenga en cuenta que si NATURAL JOIN
fuera el único tipo de combinación admitido en SQL, aún estaría relacionalmente completo .
Si bien es cierto que cualquiera NATURAL JOIN
puede escribirse usando INNER JOIN
y proyección ( SELECT
), también es cierto que cualquiera INNER JOIN
puede escribirse usando producto ( CROSS JOIN
) y restricción ( WHERE
); Tenga en cuenta además que una NATURAL JOIN
tabla entre sin nombres de columna en común dará el mismo resultado que CROSS JOIN
. Entonces, si solo le interesan los resultados que son relaciones (¡¿y por qué no ?!), entonces NATURAL JOIN
es el único tipo de unión que necesita. Claro, es cierto que desde una perspectiva de diseño de lenguaje, las abreviaturas como INNER JOIN
y CROSS JOIN
tienen su valor, pero también consideran que casi cualquier consulta SQL puede escribirse en 10 formas sintácticamente diferentes, pero semánticamente equivalentes, y esto es lo que hace que los optimizadores SQL sean tan difíciles desarrollar.
Aquí hay algunas consultas de ejemplo (usando la base de datos habitual de partes y proveedores ) que son semánticamente equivalentes:
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** La unión natural relacional no es un equijoin, es una proyección de uno. - filipina
Una NATURAL
unión es solo una sintaxis corta para una unión específica INNER
, o "equi-join", y, una vez que se desenvuelve la sintaxis, ambas representan la misma operación de álgebra relacional. No es un "tipo diferente" de unión, como en el caso de OUTER
( LEFT
/ RIGHT
) o CROSS
uniones.
Vea la sección equi-join en Wikipedia:
Una unión natural ofrece una mayor especialización de equi-une. El predicado de unión surge implícitamente al comparar todas las columnas en ambas tablas que tienen los mismos nombres de columna en las tablas unidas. La tabla unida resultante contiene solo una columna para cada par de columnas con el mismo nombre.
La mayoría de los expertos están de acuerdo en que las UNIONES NATURALES son peligrosas y, por lo tanto, desaconsejan su uso. El peligro viene de agregar inadvertidamente una nueva columna, llamada igual que otra columna ...
Es decir, todas las NATURAL
combinaciones pueden escribirse como INNER
combinaciones (pero lo contrario no es cierto). Para hacerlo, simplemente cree el predicado explícitamente , por ejemplo, USING
o ON
- y, como señaló Jonathan Leffler, seleccione las columnas deseadas del conjunto de resultados para evitar "duplicados" si lo desea.
Feliz codificación
(La NATURAL
palabra clave también se puede aplicar LEFT
y RIGHT
unirse, y lo mismo se aplica. Una NATURAL LEFT/RIGHT
combinación es solo una sintaxis corta para una combinación específica LEFT/RIGHT
).
Unión natural: es la combinación o el resultado combinado de todas las columnas de las dos tablas. Devolverá todas las filas de la primera tabla con respecto a la segunda tabla.
Unión interna: esta unión funcionará a menos que alguno de los nombres de columna sea sxame en dos tablas
Una unión natural es donde se unen 2 tablas sobre la base de todas las columnas comunes.
columna común: es una columna que tiene el mismo nombre en ambas tablas + tiene tipos de datos compatibles en ambas tablas. Puede usar solo = operador
Una unión interna es donde se unen 2 tablas sobre la base de columnas comunes mencionadas en la cláusula ON.
columna común: es una columna que tiene tipos de datos compatibles en ambas tablas pero no necesita tener el mismo nombre. Sólo se puede utilizar cualquier operador de comparación como =
, <=
, >=
, <
, >
,<>
la diferencia es que int la unión interna (equi / default) y la unión natural que en la columna común de natuarl join se mostrará en un solo tiempo, pero la unión interna / equi / default / simple de la columna común se mostrará el doble de tiempo.
La unión interna y la unión natural son casi iguales, pero hay una ligera diferencia entre ellas. La diferencia está en la unión natural, no es necesario especificar la condición, pero en la condición de unión interna es obligatoria. Si especificamos la condición en la unión interna, las tablas resultantes son como un producto cartesiano.
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
UNIR INTERNAMENTE :
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
Unión interna, une dos tablas donde el nombre de la columna es el mismo.
Unión natural, une dos tablas donde el nombre de columna y los tipos de datos son iguales.