sql >> Base de Datos >  >> RDS >> Database

Tutorial de uniones SQL

Una unión SQL es donde ejecuta una consulta que une varias tablas.

Este tutorial de uniones SQL presenta ejemplos básicos de uniones SQL, así como una introducción a los distintos tipos de uniones.

Tipos de combinación SQL

El estándar ANSI SQL especifica cinco tipos de uniones, como se enumeran en la siguiente tabla.

Tipo de unión Descripción

INNER JOIN
Devuelve filas cuando hay al menos una fila en ambas tablas que coincide con la condición de combinación.

LEFT OUTER JOIN
o
LEFT JOIN
Devuelve filas que tienen datos en la tabla de la izquierda (a la izquierda de JOIN palabra clave), incluso si no hay filas coincidentes en la tabla de la derecha.

RIGHT OUTER JOIN
o
RIGHT JOIN
Devuelve filas que tienen datos en la tabla derecha (a la derecha de JOIN palabra clave), incluso si no hay filas coincidentes en la tabla de la izquierda.

FULL OUTER JOIN
o
FULL JOIN
Devuelve todas las filas, siempre que haya datos coincidentes en una de las tablas.
CROSS JOIN Devuelve filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.

También hay otros términos para varias operaciones de combinación, como las siguientes:

Unirse Descripción
Auto-unión Cuando una tabla se une a sí misma.
Unión natural Una unión implícita basada en las columnas comunes de las dos tablas que se unen.
Equi-unión Una combinación que contiene solo comparaciones de igualdad en el predicado de combinación.

Sintaxis de Unión SQL

Las uniones internas se pueden especificar en FROM o WHERE cláusulas. Las uniones externas y las uniones cruzadas se pueden especificar en FROM cláusula solamente.

Para crear una unión SQL en FROM cláusula, haga algo como esto:

SELECT *
FROM Table1 < JoinType > Table2 [ ON ( JoinCondition ) ]

Donde JoinType especifica qué tipo de combinación se realiza y JoinCondition define el predicado que se evaluará para cada par de filas unidas.

Para especificar una combinación en WHERE cláusula, haga algo como esto:

SELECT *
FROM Table1, Table2 [ WHERE ( JoinCondition ) ]

De nuevo, JoinCondition define el predicado que se evaluará para cada par de filas unidas.

Además, todo lo encerrado entre corchetes ([] ) es opcional.

Tablas de muestra para los ejemplos de este tutorial

La mayoría de los ejemplos de este tutorial realizan uniones en las siguientes dos tablas.

Los PetTypes tabla:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Las Pets tabla:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

La unión interna

SQL INNER JOIN devuelve filas cuando hay al menos una fila en ambas tablas que coincide con la condición de combinación.

SELECT
    Pets.PetName,
    PetTypes.PetType
FROM Pets
INNER JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId;

Resultado:

-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Para especificar una combinación interna en FROM cláusula, usamos INNER JOIN . También usamos el ON palabra clave para definir el predicado que se evaluará para cada par de filas unidas.

Independientemente del tipo de combinación, calificamos los nombres de nuestras columnas con los nombres de las tablas. La razón por la que hacemos esto es para evitar cualquier ambigüedad con respecto a los nombres de las columnas entre las tablas. Ambas tablas pueden tener columnas con el mismo nombre (como en nuestro ejemplo) y, en tales casos, el DBMS no sabrá a qué columna se refiere. Prefijar los nombres de las columnas con sus nombres de tabla asegura que está haciendo referencia a la columna correcta y evita cualquier error que pueda resultar de cualquier ambigüedad sobre a qué columna se está refiriendo.

En este ejemplo, ambas tablas tienen un PetTypeId columna. Las Pets.PetTypeId la columna es una clave externa a PetTypes.PetTypeId columna, que es la clave principal para esa tabla.

En este ejemplo, podemos ver que se devuelven todas las mascotas, pero no todos los tipos de mascotas. No hay conejos en Pets tabla, y así los Rabbits no se devuelve el tipo de mascota.

La razón por la que los Rabbits type no se devuelve porque INNER JOIN solo devuelve filas cuando hay al menos una fila en ambas tablas que coincide con la condición de unión. En este caso, Rabbits está solo en una tabla (los PetTypes tabla).

Tenga en cuenta que el tipo de combinación es opcional. Por lo tanto, la mayoría (si no todos) los DBMS le permiten omitir el INNER palabra clave. Cuando omite esto (es decir, solo especifica JOIN ), se supone que es una combinación interna.

Por lo tanto, podríamos reescribir el ejemplo anterior a esto:

SELECT
    Pets.PetName,
    PetTypes.PetType
FROM Pets
JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId;

Además, como con cualquier sentencia SQL, el FROM la cláusula puede estar en una línea completa si lo prefiere:

SELECT
    Pets.PetName,
    PetTypes.PetType
FROM Pets JOIN PetTypes ON Pets.PetTypeId = PetTypes.PetTypeId;

Alias

Es una práctica común usar alias de tabla cuando se realizan uniones SQL. Los alias ayudan a que el código sea más conciso y más fácil de leer.

Por lo tanto, podríamos cambiar el ejemplo anterior por este:

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;

Resultado:

-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Equi-Join

La unión anterior también se puede denominar equi-unión . Una unión equitativa es una unión que contiene solo comparaciones de igualdad en el predicado de unión.

Otra forma de escribir la combinación anterior es así:

SELECT
    p.PetName,
    pt.PetType
FROM 
    Pets p, 
    PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+

Este es un ejemplo de cómo especificar una combinación interna en WHERE cláusula. Simplemente proporcionamos una lista separada por comas de las tablas, y luego un WHERE condición. Si hubiéramos omitido el WHERE condición, habríamos terminado con un CROSS JOIN .

Muchos principiantes encuentran la sintaxis anterior mucho más fácil de entender que INNER JOIN sintaxis. Siéntase libre de usar esta sintaxis si lo prefiere, sin embargo, tenga en cuenta que la mayoría de los profesionales de SQL prefieren usar INNER JOIN sintaxis del ejemplo anterior.

Consulte Combinación interna de SQL para obtener más ejemplos, incluida una combinación interna que une 3 tablas.

La Unión Correcta

También conocido como RIGHT OUTER JOIN , la RIGHT JOIN devuelve filas que tienen datos en la tabla de la derecha (a la derecha de JOIN palabra clave), incluso si no hay filas coincidentes en la tabla de la izquierda.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

En este caso, tenemos un PetType extra valor – Rabbit – aunque no haya ninguna mascota en Pets tabla de ese tipo. Esto da como resultado un NULL valor en PetName columna contra Rabbit .

Consulte Unión derecha de SQL para obtener más ejemplos, incluida una unión derecha que une 3 tablas.

La unión izquierda

También conocido como LEFT OUTER JOIN , el SQL LEFT JOIN devuelve filas que tienen datos en la tabla de la izquierda (a la izquierda de JOIN palabra clave), incluso si no hay filas coincidentes en la tabla de la derecha.

Esto es lo opuesto a RIGHT JOIN .

Si cambiamos el ejemplo anterior para usar una combinación izquierda, obtenemos el siguiente resultado.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
LEFT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

En este caso particular, nuestros resultados son los mismos que con la unión interna.

Sin embargo, si cambiamos el orden de la tabla en nuestro FROM cláusula, obtendremos un resultado similar a la unión derecha en el ejemplo anterior.

SELECT 
    p.PetName,
    pt.PetType
FROM PetTypes pt
LEFT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Entonces puede ver que cualquier diferencia resultante entre las uniones izquierda y derecha depende únicamente de cómo ordene las columnas en FROM cláusula.

Consulte SQL Left Join para obtener más ejemplos, incluida una combinación izquierda que une 3 tablas.

La unión completa

SQL FULL JOIN (o FULL OUTER JOIN ) devuelve todas las filas, siempre que haya datos coincidentes en una de las tablas.

En otras palabras, es como tener una combinación izquierda y derecha en una combinación.

Este es un ejemplo de una unión completa.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Esto devuelve el mismo resultado que obtuvimos con la combinación derecha, pero habría devuelto un resultado diferente si hubiera una fila en la tabla de la izquierda que no tuviera un valor correspondiente en la tabla de la derecha.

Intercambiemos los nombres de las tablas y volvamos a ejecutarlo.

SELECT 
    p.PetName,
    pt.PetType
FROM PetTypes pt
FULL JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Tweet     | Bird      |
| Fluffy    | Cat       |
| Scratch   | Cat       |
| Meow      | Cat       |
| Fetch     | Dog       |
| Wag       | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| NULL      | Rabbit    |
+-----------+-----------+
(9 rows affected)

Mismo resultado.

Consulte Combinación completa de SQL para obtener más ejemplos, incluida una combinación completa que une 3 tablas.

La unión cruzada

El SQL CROSS JOIN devuelve filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.

En otras palabras, devuelve el producto cartesiano de filas de tablas en la combinación.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Bird      |
| Fetch     | Bird      |
| Scratch   | Bird      |
| Wag       | Bird      |
| Tweet     | Bird      |
| Fluffy    | Bird      |
| Bark      | Bird      |
| Meow      | Bird      |
| Fluffy    | Cat       |
| Fetch     | Cat       |
| Scratch   | Cat       |
| Wag       | Cat       |
| Tweet     | Cat       |
| Fluffy    | Cat       |
| Bark      | Cat       |
| Meow      | Cat       |
| Fluffy    | Dog       |
| Fetch     | Dog       |
| Scratch   | Dog       |
| Wag       | Dog       |
| Tweet     | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Dog       |
| Fluffy    | Rabbit    |
| Fetch     | Rabbit    |
| Scratch   | Rabbit    |
| Wag       | Rabbit    |
| Tweet     | Rabbit    |
| Fluffy    | Rabbit    |
| Bark      | Rabbit    |
| Meow      | Rabbit    |
+-----------+-----------+
(32 rows affected)

Como probablemente pueda imaginar, esto podría ser muy peligroso si lo ejecuta en las tablas incorrectas.

Es lo mismo que hacer esto:

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p, PetTypes pt;

Puedes agregar un WHERE cláusula a una unión cruzada, lo que la convertirá en una unión interna.

Así:

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Consulte SQL Cross Join para obtener más ejemplos.

La unión natural

El SQL NATURAL JOIN es un tipo de combinación equitativa donde el predicado de combinación surge implícitamente al comparar todas las columnas en ambas tablas que tienen los mismos nombres de columna en las tablas combinadas.

El conjunto de resultados contiene solo una columna para cada par de columnas con el mismo nombre. Si no se encuentran columnas con los mismos nombres, el resultado será una unión cruzada.

SELECT 
    Pets.PetName,
    PetTypes.PetType
FROM Pets NATURAL JOIN PetTypes;

Resultado:

petname | pettype 
---------+---------
 Fluffy  | Cat
 Fetch   | Dog
 Scratch | Cat
 Wag     | Dog
 Tweet   | Bird
 Fluffy  | Dog
 Bark    | Dog
 Meow    | Cat
(8 rows)

En realidad, la unión natural no es realmente un tipo de unión, como lo considera el estándar ANSI. Es una palabra clave que puede insertar opcionalmente para que la unión sea natural.

Por lo tanto, podríamos cambiar el ejemplo anterior a NATURAL INNER JOIN si quisiéramos:

SELECT 
    Pets.PetName,
    PetTypes.PetType
FROM Pets NATURAL INNER JOIN PetTypes;

Como se mencionó anteriormente, las combinaciones internas son el tipo de combinación predeterminado, por lo que si omite el tipo de combinación (p. ej., INNER , LEFT , RIGHT , etc.), entonces se trata como una unión interna.

Si el formato de estos resultados se ve diferente a los resultados anteriores, es porque tuve que saltar a PostgreSQL para ejecutar esta consulta. Ejecuté los ejemplos anteriores en SQL Server, pero SQL Server no admite la unión natural.

Consulte Combinación natural de SQL para obtener más ejemplos, incluida una combinación natural que une 3 tablas.

La auto unión

El SELF JOIN de SQL está uniendo una tabla a sí mismo.

Un ejemplo clásico de autocombinación está en una tabla de Empleados. En tal tabla, un empleado podría informar a otro empleado. Por lo tanto, podría usar una unión automática para unirse a la tabla en su columna de ID de empleado y columna de ID de gerente.

Supongamos que tenemos la siguiente tabla:

+--------------+-------------+------------+-------------+
| EmployeeId   | FirstName   | LastName   | ReportsTo   |
|--------------+-------------+------------+-------------|
| 1            | Homer       | Connery    | NULL        |
| 2            | Bart        | Pitt       | 1           |
| 3            | Maggie      | Griffin    | 1           |
| 4            | Peter       | Farnsworth | 2           |
| 5            | Marge       | Morrison   | NULL        |
| 6            | Lisa        | Batch      | 5           |
| 7            | Dave        | Zuckerberg | 6           |
| 8            | Vlad        | Cook       | 7           |
+--------------+-------------+------------+-------------+

Podemos hacer una unión automática en esta tabla para devolver todos los empleados y sus gerentes.

SELECT
    CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
    CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2 
ON e1.ReportsTo = e2.EmployeeId;

Resultado:

+------------------+-----------------+
| Employee         | Manager         |
|------------------+-----------------|
| Homer Connery    |                 |
| Bart Pitt        | Homer Connery   |
| Maggie Griffin   | Homer Connery   |
| Peter Farnsworth | Bart Pitt       |
| Marge Morrison   |                 |
| Lisa Batch       | Marge Morrison  |
| Dave Zuckerberg  | Lisa Batch      |
| Vlad Cook        | Dave Zuckerberg |
+------------------+-----------------+

Consulte SQL Self Join para obtener más ejemplos.