Me pregunto cómo diferenciar todas estas uniones diferentes ...
Me pregunto cómo diferenciar todas estas uniones diferentes ...
Respuestas:
Ejemplo simple : Digamos que tienes una Students
mesa y una Lockers
mesa. En SQL, la primera tabla que especifique en una combinación, Students
es la tabla IZQUIERDA , y la segunda Lockers
, es la tabla DERECHA .
Cada estudiante puede ser asignado a un casillero, por lo que hay una LockerNumber
columna en la Student
tabla. Potencialmente, más de un estudiante podría estar en un solo casillero, pero especialmente al comienzo del año escolar, es posible que tenga algunos estudiantes entrantes sin casilleros y algunos casilleros que no tienen alumnos asignados.
Por el bien de este ejemplo, supongamos que tiene 100 estudiantes , 70 de los cuales tienen casilleros. Tiene un total de 50 casilleros , 40 de los cuales tienen al menos 1 estudiante y 10 casilleros no tienen estudiante.
INNER JOIN es equivalente a " muéstrame a todos los estudiantes con casilleros ".
Faltan estudiantes sin casilleros o casilleros sin estudiantes.
Devuelve 70 filas
IZQUIERDA EXTERIOR UNIRSE sería " muéstrame a todos los estudiantes, con su casillero correspondiente si tienen uno ".
Esta podría ser una lista general de estudiantes, o podría usarse para identificar estudiantes sin casillero.
Devuelve 100 filas
DERECHO EXTERIOR UNIRSE sería " muéstrame todos los casilleros, y los estudiantes asignados a ellos si hay alguno ".
Esto podría usarse para identificar casilleros que no tienen estudiantes asignados, o casilleros que tienen demasiados estudiantes.
Devuelve 80 filas (lista de 70 estudiantes en los 40 casilleros, más los 10 casilleros sin estudiante)
FULL OUTER JOIN sería una tontería y probablemente no sería de mucha utilidad.
Algo así como " muéstrame todos los estudiantes y todos los casilleros, y combínalos donde puedas "
Devuelve 110 filas (los 100 estudiantes, incluidos los que no tienen casilleros. Además los 10 casilleros sin estudiante)
CROSS JOIN también es bastante tonto en este escenario.
No utiliza el lockernumber
campo vinculado en la tabla de estudiantes, por lo que básicamente terminas con una gran lista gigante de cada posible emparejamiento de estudiante a casillero, ya sea que exista o no.
Devuelve 5000 filas (100 estudiantes x 50 casilleros). Podría ser útil (con filtrado) como punto de partida para unir a los nuevos estudiantes con los casilleros vacíos.
SELECT * FROM students RIGHT OUTER JOIN lockers...
daría como resultado un resultado diferente que SELECT * FROM lockers RIGHT OUTER JOIN students...
. Gran respuesta, pero me encantaría verlo actualizado con SQL
consultas completas
Hay tres tipos básicos de unión:
INNER
join compara dos tablas y solo devuelve resultados donde existe una coincidencia. Los registros de la primera tabla se duplican cuando coinciden con múltiples resultados en la segunda. Las uniones INNER tienden a hacer que los conjuntos de resultados sean más pequeños, pero como los registros pueden duplicarse, esto no está garantizado.CROSS
join compara dos tablas y devuelve todas las combinaciones posibles de filas de ambas tablas. Puede obtener muchos resultados de este tipo de unión que podrían no ser significativos, así que úselo con precaución.OUTER
join compara dos tablas y devuelve datos cuando hay una coincidencia disponible o valores NULL en caso contrario. Al igual que con INNER join, esto duplicará filas en una tabla cuando coincida con múltiples registros en la otra tabla. Las combinaciones OUTER tienden a hacer que los conjuntos de resultados sean más grandes, porque no eliminarán por sí mismos ningún registro del conjunto. También debe calificar una unión EXTERIOR para determinar cuándo y dónde agregar los valores NULL:
LEFT
significa mantener todos los registros de la primera tabla sin importar qué e inserte valores NULL cuando la segunda tabla no coincida. RIGHT
significa lo contrario: mantenga todos los registros de la segunda tabla sin importar qué e inserte valores NULL cuando la primera tabla no coincida. FULL
significa mantener todos los registros de ambas tablas e insertar un valor NULL en cualquiera de las tablas si no hay coincidencia.A menudo, verá la OUTER
palabra clave omitida de la sintaxis. En cambio, solo será "LEFT JOIN", "RIGHT JOIN" o "FULL JOIN". Esto se hace porque las uniones INNER y CROSS no tienen significado con respecto a IZQUIERDA, DERECHA o COMPLETA, por lo que son suficientes por sí mismas para indicar inequívocamente una unión EXTERIOR.
Aquí hay un ejemplo de cuándo es posible que desee utilizar cada tipo:
INNER
: Desea devolver todos los registros de la tabla "Factura", junto con sus "Líneas de factura" correspondientes. Esto supone que cada factura válida tendrá al menos una línea.OUTER
: Desea devolver todos los registros de "InvoiceLines" para una factura particular, junto con sus registros correspondientes de "InventoryItem". Esta es una empresa que también vende servicios, de modo que no todas las líneas de factura tendrán un artículo de inventario.CROSS
: Tiene una tabla de dígitos con 10 filas, cada una con valores del '0' al '9'. Desea crear una tabla de rango de fechas para unirse, de modo que termine con un registro para cada día dentro del rango. Al unir CROSS esta tabla consigo mismo repetidamente, puede crear tantos enteros consecutivos como necesite (dado que comienza con 10 a 1ª potencia, cada combinación suma 1 al exponente). Luego use la función DATEADD () para agregar esos valores a su fecha base para el rango.Solo hay 4 tipos:
NULL
para cada valor en la tabla de la derecha. Esto significa que cada fila de la tabla de la izquierda aparecerá al menos una vez en la salida. Una "unión cruzada" o "unión cartesiana" es simplemente una unión interna para la que no se han especificado condiciones de unión, lo que da como resultado la salida de todos los pares de filas.
Gracias a RusselH por señalar uniones COMPLETAS, que había omitido.
SQL SE UNE a la diferencia:
Muy simple de recordar:
INNER JOIN
solo muestra registros comunes a ambas tablas.
OUTER JOIN
todo el contenido de las dos tablas se fusionan, ya sea que coincidan o no.
LEFT JOIN
es lo mismo que LEFT OUTER JOIN
- (Seleccione los registros de la primera tabla (la más a la izquierda) con los registros de la tabla derecha coincidentes).
RIGHT JOIN
es igual que RIGHT OUTER JOIN
- (Seleccione registros de la segunda tabla (más a la derecha) con los registros de la tabla izquierda coincidentes).
Echa un vistazo a Join (SQL) en Wikipedia
combinación izquierda / derecha (exterior): dadas dos tablas devuelve todas las filas que existen en la tabla izquierda o derecha de su combinación, además de que las filas del otro lado se devolverán cuando la cláusula de combinación coincida o se devuelva un valor nulo para esas columnas
Exterior completo: dadas dos tablas devuelve todas las filas y devolverá nulos cuando la columna izquierda o derecha no esté allí
Cross Joins: unión cartesiana y puede ser peligroso si no se usa con cuidado
Hacerlo más visible podría ayudar. Un ejemplo:
Tabla 1:
ID_STUDENT STUDENT_NAME
1 Raony
2 Diogo
3 Eduardo
4 Luiz
Tabla 2:
ID_BLOQUEO DE ESTUDIANTE
3 l1
4 l2
5 l3
Lo que obtengo cuando hago:
-Inner join of Table 1 and Table 2:
- Inner join returns both tables merged only when the key
(ID_STUDENT) exists in both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-Left join of Table 1 and Table 2:
- Left join merges both tables with all records form table 1, in
other words, there might be non-populated fields from table 2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
-Right join of table 1 and table 2:
- Right join merges both tables with all records from table 2, in
other words, there might be non-populated fields from table 1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5 - l3
-Outter join of table 1 and table 2:
- Returns all records from both tables, in other words, there
might be non-populated fields either from table 1 or 2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -
2 Diogo -
3 Eduardo l1
4 Luiz l2
5 - l3
LEFT JOIN
y RIGHT JOIN
son tipos de OUTER JOIN
s.
INNER JOIN
es el valor predeterminado: las filas de ambas tablas deben coincidir con la condición de unión.
Unión interna : solo muestra filas, cuando tiene datos de ambas tablas.
Combinación externa : (izquierda / derecha) : Mostrar el resultado de todo desde la izquierda / derecha tabla con las filas emparejado ( s ), si existe o no.
Al principio tienes que entender lo que hace join? Conectamos varias tablas y obtenemos resultados específicos de las tablas unidas. La forma más sencilla de hacer esto es la unión cruzada .
Digamos que la tabla A tiene dos columnas A y B. Y la tabla B tiene tres columnas C y D. Si aplicamos la unión cruzada, producirá muchas filas sin sentido. Luego tenemos que hacer coincidir el uso de la clave primaria para obtener datos reales.
Izquierda: devolverá todos los registros de la tabla izquierda y el registro coincidente de la tabla derecha.
Derecha: volverá frente a la unión izquierda. Devolverá todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda.
Interior: esto es como una intersección. Solo devolverá registros coincidentes de ambas tablas.
Exterior: Y esto es como la unión. Devolverá todos los registros disponibles de ambas tablas.
Algunas veces no necesitamos todos los datos, y también deberíamos necesitar solo datos o registros comunes. podemos obtenerlo fácilmente usando estos métodos de unión. Recuerde que la unión izquierda y derecha también son uniones externas.
Puede obtener todos los registros simplemente usando cross join. Pero podría ser costoso cuando se trata de millones de registros. Por lo tanto, hágalo simple usando la unión izquierda, derecha, interna o externa.
Gracias