2010-12-14 17 views
5

Duplicar posible:
(self,left outer,right outer,full outer) join - real world examples¿Cuál es la diferencia entre LEFT, RIGHT, INNER y OUTER JOINs?

Hola, querida SO comunidad!

He estado trabajando con bases de datos SQL desde hace un tiempo, pero un aspecto todavía es muy confuso para mí: la mesa se une. Entiendo muy claramente lo que sucede cuando escribo una consulta de varias tablas, pero cuando entra en juego una JOIN, siento que simplemente no entiendo nada.

Por favor, ayúdenme a comprender qué es la unión de tablas, y cuál es la diferencia entre IZQUIERDA, DERECHA, INTERIOR y OUTER JOINs? ¿Qué es una auto unión?

Le agradecería si pudiera dar un ejemplo de su uso en esta sencilla estructura de la tabla:

Tabla autores

id |name 
--------------- 
1 |John 
2 |Bob 
3 |Richard 

Tabla libros

id |author_id |title  |rating 
----------------------------------------- 
1 |1   |book A  |5 
2 |1   |book B  |4.8 
3 |3   |book C  |3 

Gracias ¡tú!

+0

Busqué en Google esa pregunta exacta y presenté varios hits en la página principal que ilustran las diferencias. Pudo haber sido más rápido que preguntar aquí. Para ser sincero, ¡generalmente tengo que refrescar mi memoria cuando voy a hacer uniones yo mismo! – DarinH

+1

"Entiendo muy claramente, qué sucede, cuando escribo una consulta múltiple, pero cuando entra en juego una JOIN, siento que simplemente no entiendo nada". HUh? una unión siempre está en juego cuando se escriben consultas multitables, no se usa la sintaxis de unión implícita (¿con las comas entre tablas)? Si es así, nunca escriba otro código usando esa sintaxis antigua y muy pobre. Si usa esa sintaxis pobre, no es de extrañar que no comprenda las uniones. – HLGEM

+0

HLGEM, ¿por qué está desactualizado y es malo? –

Respuesta

3

DE UN {unirse tipo B} {EN} Únete Condición

interior: sólo mostrará los resultados en la condición de unión es cierto. Si no hay una condición verdadera para una fila en A, se eliminará de los resultados.

Izquierda: no filtrará filas de A que no tienen una coincidencia de combinación en B

Derecha: filtrará filas de A que no tienen una coincidencia de combinación en B

externo: izquierda y las uniones correctas se consideran uniones externas donde lo interno es una unión interna.

3

combinación interna:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    INNER JOIN books b ON 
     a.id = b.author_id 

dará lugar a esto:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
3 |Richard |3 |3   |book C  |3 

en cuenta que Bob no se muestra - un inner join siempre elimina los elementos que no están presentes en ambas fuentes (teniendo en cuenta el criterio de unirse ; en nuestro caso a.id = b.author_id.

izquierda de Ingreso:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    LEFT JOIN books b ON 
     a.id = b.author_id 

dará lugar a esto:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
2 |Bob  |null |null  |null  |null 
3 |Richard |3 |3   |book C  |3 

Ahora se muestran todos los autores - un LEFT JOIN (o LEFT OUTER JOIN, que es lo mismo) mantendrá todos "izquierda" registros (autores) y sustituirán los registros "correctos" que no se encuentran con nulo.

Acerca de "unirse a la derecha" - es lo mismo que "unir a la izquierda", pero con una relación inversa. La siguiente consulta dará como resultado los mismos registros que el último (notar que las mesas están en un orden inverso, para compensar el uso de unirse a derecha):

SELECT 
    a.*, 
    b.* 
FROM 
    books b 
    RIGHT JOIN authors a ON 
     a.id = b.author_id 

espero que sea más claro ahora.

PD: también hay FULL OUTER JOIN. Piense en una combinación de izquierda y derecha combinadas: si hubiera libros sin autor, también se mostrarían al usar una combinación externa completa.

+0

Me encanta. Simplemente pinta la imagen tan claramente. –

Cuestiones relacionadas