Sí, yo utilizo los tres de los JOINs, a pesar de que tienden a pegarse a usar sólo LEFT (OUTER) JOIN
s en lugar de inter-mezcla LEFT and RIGHT JOINs. También uso FULL OUTER JOIN
sy CROSS JOIN
s.
En resumen, un INNER JOIN
restringe el conjunto de resultados solo a aquellos registros satisfechos por la condición JOIN. Tenga en cuenta las siguientes tablas
EDIT: He cambiado el nombre de los nombres de tabla y el prefijo con @
de modo que las variables de tabla se pueden utilizar para cualquiera que lea esta respuesta y con ganas de experimentar.
Si también desea experimentar con esto en el navegador, I've set this all up on SQL Fiddle también;
@Table1
id | name
---------
1 | One
2 | Two
3 | Three
4 | Four
@Table2
id | name
---------
1 | Partridge
2 | Turtle Doves
3 | French Hens
5 | Gold Rings
código SQL
DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');
DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');
una sentencia SQL INNER JOIN
, se unieron en el campo id
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
Resultados en
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
Un LEFT JOIN
devolverá un conjunto de resultados con todos los registros de la tabla en el lado izquierdo de la unión (si tuviera que escribir la declaración como un revestimiento, la tabla que aparece primero) y los campos de la tabla en el lado derecho de la join que coinciden con la expresión de unión y están incluidos en la cláusula SELECT
.Missing datos se rellenarán con NULL
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
Resultados en
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
Un RIGHT JOIN
es la misma lógica que un LEFT JOIN
y luego se volverá todos los registros desde el lado derecho de la unión y campos desde el lado izquierdo que coinciden con la expresión de unión y están incluidos en la cláusula SELECT
.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
RIGHT JOIN
@Table2 t2
ON
t1.id = t2.id
Resultados en
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
NULL| NULL| Gold Rings
Por supuesto, también existe la FULL OUTER JOIN
, que incluye los registros de ambas tablas de combinación y rellena cualquier falta detalles con NULL.
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
FULL OUTER JOIN
@Table2 t2
ON
t1.id = t2.id
Resultados en
id | name | name
----------------
1 | One | Partridge
2 | Two | Turtle Doves
3 | Three| French Hens
4 | Four | NULL
NULL| NULL| Gold Rings
y una CROSS JOIN
(también conocido como CARTESIAN PRODUCT
), que es simplemente el producto de la cruz aplicación de campos en la instrucción SELECT
de una tabla con los campos en la instrucción SELECT
de la otra mesa. Observe que no hay es la expresión de combinación en un CROSS JOIN
SELECT
t1.id,
t1.name,
t2.name
FROM
@Table1 t1
CROSS JOIN
@Table2 t2
Resultados en
id | name | name
------------------
1 | One | Partridge
2 | Two | Partridge
3 | Three | Partridge
4 | Four | Partridge
1 | One | Turtle Doves
2 | Two | Turtle Doves
3 | Three | Turtle Doves
4 | Four | Turtle Doves
1 | One | French Hens
2 | Two | French Hens
3 | Three | French Hens
4 | Four | French Hens
1 | One | Gold Rings
2 | Two | Gold Rings
3 | Three | Gold Rings
4 | Four | Gold Rings
EDIT:
imaginar que haya ahora un Tabla3
@Table3
id | name
---------
2 | Prime 1
3 | Prime 2
5 | Prime 3
El código SQL
DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))
INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');
Ahora las tres tablas unidas con INNER JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
INNER JOIN
@Table3 t3
ON
t1.id = t3.id
Resultados en
id | name | name | name
-------------------------------
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Podría ayudar a entender este resultado por el pensamiento de que los registros con el ID 2 y 3 son los únicos comunes a las 3 tablas y son también el campo en el que nos estamos uniendo en cada tabla.
Ahora los tres con LEFT JOINS
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
LEFT JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Resultados en
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
4 | Four | NULL | NULL
Joel's answer es una buena explicación para explicar este conjunto de resultados (Tabla 1 es la tabla base/origen).
Ahora con un INNER JOIN
y una LEFT JOIN
SELECT
t1.id,
t1.name,
t2.name,
t3.name
FROM
@Table1 t1
INNER JOIN
@Table2 t2
ON
t1.id = t2.id
LEFT JOIN
@Table3 t3
ON
t1.id = t3.id
Resultados en
id | name | name | name
-------------------------------
1 | One | Partridge | NULL
2 | Two | Turtle Doves | Prime 1
3 | Three| French Hens | Prime 2
Aunque no conocemos el orden en que el optimizador de consultas llevará a cabo las operaciones, vamos a ver en esta consulta de arriba a abajo para comprender el conjunto de resultados. El INNER JOIN
en los identificadores entre Table1 y Table2 restringirá el conjunto de resultados a solo aquellos registros que satisfagan la condición de unión, es decir, las tres filas que vimos en el primer ejemplo. Este temporal resultados será LEFT JOIN
ed a la Tabla 3 en los identificadores entre Table1 y Tablas; Hay registros en la Tabla 3 con id 2 y 3, pero no id 1, por lo que el campo t3.name tendrá detalles para 2 y 3, pero no 1.
En un caso práctico, considere usar múltiples sqls para obtener las filas deseadas en lugar de hacer una combinación. muchas veces se encontraría con un mejor desempeño. esp verdadero para múltiples combinaciones de tablas en mysql. mysql fuerzas brutas para averiguar el mejor orden de unión, lo que significa que se puede gastar mucho tiempo en la optimización de consultas cuando se trata de muchas tablas. –
¿cómo sería una consulta de 'múltiples SQL'? – MedicineMan