Soy nuevo en SQL y quería saber cuál es la diferencia entre esos dos JOIN
tipos.
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
¿Cuándo debo usar uno u otro?
Respuestas:
En su primer ejemplo, solo devolverá una lista de usuarios y números de teléfono si existe al menos un registro telefónico para el usuario.
En su segundo ejemplo, devolverá una lista de todos los usuarios, más todos los registros telefónicos si están disponibles (si no están disponibles, obtendrá
NULL
los valores del teléfono).fuente
Cada vez que alguien hace esta pregunta, hay una respuesta: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
Espero que te ayude a entender,
fuente
Una combinación interna devuelve filas que se pueden combinar según los criterios de combinación.
Una combinación externa devuelve estas y todas las filas ...
... de la primera tabla para una combinación izquierda
... de la segunda tabla para una combinación derecha
... de ambas tablas para una combinación completa
Elegir cuándo usar uno u otro es una cuestión de determinar qué datos necesita. Para su ejemplo, si solo necesita registros que tengan ID de usuario del teléfono que coincidan con los ID del usuario, utilice la combinación interna. Si también desea incluir filas del usuario que no tienen una entrada telefónica coincidente, entonces la combinación izquierda sería apropiada.
Para obtener más información, consulte esta pregunta en StackOverflow .
fuente
Si tiene 2 tablas como a continuación:
Si usas Inner Join obtienes:
Si usa Full Outer Join obtendrá:
Si usa Left Outer Join obtendrá:
fuente
La unión externa está expresamente diseñada para producir nulos en su resultado y, por lo tanto, debe evitarse, en general. Relacionalmente hablando, es una especie de matrimonio de escopeta: obliga a las mesas a una especie de unión, sí, quiero decir unión, no unión, incluso cuando las mesas en cuestión no cumplen con los requisitos habituales para la unión. Lo hace, en efecto, rellenando una o ambas tablas con valores nulos antes de hacer la unión, haciéndolas cumplir con los requisitos habituales después de todo. Pero no hay ninguna razón por la cual ese relleno no se debe hacer con valores adecuados en lugar de nulos, como en este ejemplo:
Alternativamente, se podría obtener el mismo resultado utilizando el operador de combinación externa SQL junto con
COALESCE
, como aquí:Una observación sobre la unión externa (4.6) en "SQL y teoría relacional: cómo escribir un código SQL preciso" por fecha CJ
fuente
Una combinación interna es una combinación en la que los únicos resultados que se muestran son resultados en los que las claves están en ambas tablas. Una combinación externa mostrará los resultados para todas las claves en una tabla, una combinación izquierda desde la primera y una combinación derecha desde la segunda. Por ejemplo:
Digamos que la tabla 1 tiene los siguientes pares de datos y clave primaria: (1, a), (2, b), (3, c)
Supongamos también que table2 tiene los siguientes pares de claves principales y datos: (1, diversión), (3, can), (4, pasar)
Por lo tanto, una unión interna de table1 a table2 en las claves primarias produciría los siguientes tripletes resultantes (con la clave primaria común primero, el segundo elemento de la primera tabla segundo y el segundo elemento de la segunda tabla tercero): (1, a, diversión), ( 3, c, lata)
Una combinación externa izquierda de table1 a table2 en las claves primarias produciría los siguientes tripletes resultantes (el mismo formato que el anterior): (1, a, fun), (2, b, NULL), (3, c, can)
Una unión externa derecha de table1 a table2 en las claves primarias produciría los siguientes tripletes resultantes (el mismo formato que el anterior): (1, a, fun), (3, c, can), (4, NULL, suceder)
Espero que esto explique el concepto decentemente bien.
fuente
Déjame intentar describirlo un poco más intuitivo.
La unión interna muestra a los usuarios, que tienen uno o más teléfonos junto con sus números de teléfono.
La combinación externa izquierda enumera adicionalmente aquellos 'usuarios' que no tienen teléfono.
fuente
Como ha preguntado cuándo usar qué, aquí hay un escenario con consultas: seleccione cuál usar según el requisito.
Datos:
Los usuarios de la tabla tienen 10 registros. La tabla Phoneno tiene 6 registros (con una relación 1: 1, lo que significa que una entrada en PhoneNo hará referencia solo a una entrada en Usuarios, y solo una entrada en PhoneNo puede hacer referencia a una entrada dada en Usuarios).
Requisito 1: Mostrar a todos los usuarios con sus números de teléfono. Ignorar usuarios sin número de teléfono.
Consulta:
Resultado: muestra 6 usuarios que tienen número de teléfono
Requisito 2: Mostrar a todos los usuarios con su número de teléfono. Si el usuario no tiene una pantalla de teléfono 'N / A' (no disponible)
Consulta:
Resultado:
Muestra los 10 registros
Nota: ifnull es una sintaxis de MySql para transformar el valor nulo. Utilicé esta función para hacer que el motor de db muestre 'N / A' cuando phonno es nulo. Busque la función adecuada si está utilizando algún otro DBMS. En SQL Server tienes que usar la
CASE
declaración.Espero que esto ayude.
fuente