También depende de su nivel de comprensión, para alguien como usted ese artículo no hace nada, pero para alguien que tal vez no entienda completamente se une, es bastante claro
Ejemplo simple : Digamos que tienes una Studentsmesa y una Lockersmesa. En SQL, la primera tabla que especifique en una combinación, Studentses la tabla IZQUIERDA , y la segunda Lockers, es la tabla DERECHA .
Cada estudiante puede ser asignado a un casillero, por lo que hay una LockerNumbercolumna en la Studenttabla. 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 lockernumbercampo 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.
Usando su ejemplo, CROSS join sería útil como punto de partida para crear asignaciones de casilleros: comience con todas las combinaciones posibles y luego use otros criterios para filtrar los resultados de la lista.
Joel Coehoorn el
1
Buena respuesta. Creo que Cross Join se usa con mayor frecuencia para generar datos de prueba de unas pocas filas cuando necesita una gran cantidad de registros.
Eli
66
FULL OUTER JOINS puede ser útil al buscar datos huérfanos o al comparar diferentes versiones del mismo conjunto de datos.
Lara Dougan
3
Cross join aka cartesian product
JavaRocky
3
Creo que cómo comienza su consulta afecta el resultado del tipo de combinación. Por ejemplo, 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 SQLconsultas completas
jbmilgrom
141
Hay tres tipos básicos de unión:
INNERjoin 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.
CROSSjoin 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.
OUTERjoin 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 OUTERpalabra 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.
Agradable. Solo agregaría eso por lo general si solo escribe 'JOIN' significa INNER JOIN.
matpop
47
Solo hay 4 tipos:
Unión interna : el tipo más común. Se genera una fila de salida para cada par de filas de entrada que coinciden en las condiciones de unión.
Externa izquierda : El mismo como una combinación interna, excepto que si hay cualquier fila para la que se puede encontrar ninguna fila coincidente en la tabla de la derecha, una fila es de salida que contiene los valores de la tabla de la izquierda, con NULLpara 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.
Unión externa derecha : lo mismo que una combinación externa izquierda, excepto con los roles de las tablas invertidos.
Unión externa completa : una combinación de combinaciones externas izquierda y derecha. Cada fila de ambas tablas aparecerá en la salida al menos una vez.
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.
¿Qué pasa con la unión externa completa y la unión cruzada (producto cartesiano)?
SQLMenace el
full es realmente el equivalente a dos combinaciones externas
RussellH
25
COMPLETO es lo que obtienes cuando atornillas tu unión interna, y luego haces una pregunta aquí "¿por qué obtengo N ^ 2 filas en lugar de N"? Entonces todos te atraviesan.
Paul Tomblin el
24
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 JOINes 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 JOINes igual que RIGHT OUTER JOIN- (Seleccione registros de la segunda tabla (más a la derecha) con los registros de la tabla izquierda coincidentes).
Hay una forma correcta y relevante de etiquetar los círculos del diagrama de Venn, pero no es así. Los círculos no son las tablas de entrada. Además, las filas de resultados no son filas de entrada, por lo que su descripción es incorrecta allí. Además, esto no está claro: no explica "común a ambos", "coincidente", "combinado".
Unión interna: dadas dos tablas, una combinación interna devuelve todas las filas que existen en ambas tablas
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
-InnerjoinofTable1andTable2:-Innerjoin returns both tables merged only when the key(ID_STUDENT)existsin both tables
ID_STUDENT STUDENT_NAME LOCKER 3 Eduardo l14 Luiz l2-LeftjoinofTable1andTable2:-Leftjoin merges both tables withall records form table1,in
other words, there might be non-populated fields fromtable2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER 1 Raony -2 Diogo -3 Eduardo l14 Luiz l2-Rightjoinoftable1andtable2:-Rightjoin merges both tables withall records fromtable2,in
other words, there might be non-populated fields fromtable1
ID_STUDENT STUDENT_NAME LOCKER 3 Eduardo l14 Luiz l25- l3-Outter joinoftable1andtable2:- Returns all records from both tables,in other words, there
might be non-populated fields either fromtable1or2.
ID_STUDENT STUDENT_NAME LOCKER 1 Raony -2 Diogo -3 Eduardo l14 Luiz l25- l3
No puedo creer cómo esta respuesta tiene muchos votos a favor y al mismo tiempo es tan incompleta.
nbro
Creo que fue una mejor respuesta a la pregunta original.
RussellH
3
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.
Respuestas:
Ejemplo simple : Digamos que tienes una
Students
mesa y unaLockers
mesa. En SQL, la primera tabla que especifique en una combinación,Students
es la tabla IZQUIERDA , y la segundaLockers
, es la tabla DERECHA .Cada estudiante puede ser asignado a un casillero, por lo que hay una
LockerNumber
columna en laStudent
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.
fuente
SELECT * FROM students RIGHT OUTER JOIN lockers...
daría como resultado un resultado diferente queSELECT * FROM lockers RIGHT OUTER JOIN students...
. Gran respuesta, pero me encantaría verlo actualizado conSQL
consultas completasHay 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.fuente
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.
fuente
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 queLEFT 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 queRIGHT OUTER JOIN
- (Seleccione registros de la segunda tabla (más a la derecha) con los registros de la tabla izquierda coincidentes).fuente
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
fuente
Hacerlo más visible podría ayudar. Un ejemplo:
Tabla 1:
ID_STUDENT STUDENT_NAME
Tabla 2:
ID_BLOQUEO DE ESTUDIANTE
Lo que obtengo cuando hago:
fuente
LEFT JOIN
yRIGHT JOIN
son tipos deOUTER JOIN
s.INNER JOIN
es el valor predeterminado: las filas de ambas tablas deben coincidir con la condición de unión.fuente
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.
fuente
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
fuente