Este artículo proporciona una descripción general de INNER JOIN
en SQL, así como algunos ejemplos básicos.
SQL INNER JOIN
devuelve filas cuando hay al menos una fila en ambas tablas que coincide con la condición de unión. Descarta filas no coincidentes de ambas tablas. Este es el tipo de unión predeterminado.
Sintaxis
Hay dos formas de especificar una unión interna:en el FROM
cláusula (utilizando la cláusula INNER JOIN
sintaxis), o usando el WHERE
cláusula.
Para especificar una combinación interna en FROM
cláusula:
SELECT *
FROM Table1 INNER JOIN Table2
ON Table1.Column = Table2.Column;
Para especificar una combinación interna en WHERE
cláusula:
SELECT *
FROM Table1, Table2
WHERE Table1.Column = Table2.Column;
A continuación se muestran ejemplos de cada uno.
Ejemplos
Aquí tenemos ejemplos de cada método para especificar una combinación interna.
Datos de muestra
Primero, aquí están las tablas que usaremos para los ejemplos.
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)
Los Owners
tabla:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | +-----------+-------------+------------+----------------+-------------------+
Tenga en cuenta que:
- El
PetTypeId
columna dePets
la tabla es una clave externa delPetTypeId
de losPetTypes
tabla (que es la clave principal de esa tabla). - El
OwnerId
columna dePets
la tabla es una clave externa delOwnerId
columna de losOwners
mesa.
Ejemplo usando la sintaxis INNER JOIN
Aquí hay un ejemplo básico de cómo especificar una combinación interna usando INNER JOIN
sintaxis.
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)
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 combinación. En este caso, Rabbits
está solo en una tabla (los PetTypes
tabla).
El tipo de unión es opcional
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;
Formateo
Al igual que con cualquier instrucción SQL, puede usar espacios en blanco y sangrías, etc. para formatear sus consultas.
Por ejemplo, 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;
Cuando escribe tablas más grandes que unen varias tablas, la sangría puede ayudar mucho.
Ejemplo usando la Cláusula WHERE
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.
Aquí hay un ejemplo de cómo especificar una combinación interna usando WHERE
cláusula:
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 | +-----------+-----------+ (8 rows affected)
Esto devolvió el mismo resultado que el ejemplo anterior.
Aquí, 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..
Unión interna en 3 tablas
Este es un ejemplo de cómo realizar una unión interna en 3 tablas.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p INNER JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
INNER JOIN Owners o
ON p.OwnerId = o.OwnerId;
Resultado:
+-----------+-----------+---------------+ | PetName | PetType | PetOwner | |-----------+-----------+---------------| | Fluffy | Cat | Nancy Simpson | | Fetch | Dog | Nancy Simpson | | Scratch | Cat | Bart Pitt | | Wag | Dog | Nancy Simpson | | Tweet | Bird | Homer Connery | | Fluffy | Dog | Boris Trump | | Bark | Dog | Bart Pitt | | Meow | Cat | Boris Trump | +-----------+-----------+---------------+ (8 rows affected)
En este ejemplo, trajimos los Owners
table en la mezcla porque necesitábamos esta consulta para devolver información sobre el propietario.
Para usar una tercera tabla, todo lo que hicimos fue agregar otro INNER JOIN... ON
argumento junto con los detalles relevantes de la tabla/columna.
En este caso, utilicé CONCAT()
de T-SQL función para concatenar dos columnas, pero esto es irrelevante para la unión.