Volver a la lista de artículos Artículos
Lectura de 29 minutos

Las 10 principales preguntas de las entrevistas sobre JOIN en SQL y cómo responderlas

¿Alguna vez pensó en qué preguntas sobre JOIN en SQL le pueden hacer en una entrevista? ¿Se siente preparado para responderlas? Este artículo cubre las preguntas más habituales de las entrevistas sobre JOIN en SQL y cómo responderlas.

Si está solicitando un trabajo como analista de datos o desarrollador de software, es probable que le pregunten sobre sus conocimientos de las cláusulas JOIN en SQL. Las cláusulas JOIN en SQL son un gran tema sobre el que los entrevistadores suelen preguntar. Hay muchas variaciones de las cláusulas JOIN, y cada una de ellas realiza una función diferente.

Existen muchos recursos excelentes para aprender sobre las cláusulas JOIN en SQL, como el curso interactivo Tipos de JOIN en SQL de LearnSQL.es. Pero, este artículo aborda el tema desde la perspectiva de las entrevistas, y cubre algunas de las preguntas más habituales de las entrevistas sobre JOIN en SQL a las que se puede enfrentar.

  1. ¿Qué es la cláusula JOIN en SQL y cuándo hay que usarla?
  2. ¿Cómo escribiría una consulta JOIN para estas dos tablas?
  3. ¿Qué tipos de JOIN existen?
  4. ¿Qué es una operación OUTER JOIN?
  5. ¿Cuál es la diferencia entre una INNER JOIN y una LEFT JOIN en SQL?
  6. ¿Cuál es la diferencia entre una LEFT JOIN y una FULL JOIN?
  7. Escriba una consulta JOIN para estas dos tablas para que todas las filas de la Tabla 1 estén en el resultado.
  8. ¿Cómo se combinan más de dos tablas?
  9. ¿Cómo se combina una tabla consigo misma?
  10. ¿La condición de las cláusulas JOIN debe ser de igualdad?

1. ¿Qué es la cláusula JOIN en SQL y cuándo hay que usarla?

La cláusula JOIN se utiliza para combinar datos de dos tablas de SQL. La cláusula JOIN se usa a menudo cuando las tablas tienen, al menos, una columna de datos en común.

Normalmente, la condición de JOIN es de igualdad entre las columnas de las diferentes tablas, pero también se pueden usar otras condiciones. Se pueden combinar más de dos tablas usando cláusulas JOIN consecutivas.

Existen diferentes tipos de JOIN: INNER JOIN, LEFT JOIN, RIGHT JOIN y FULL JOIN, entre otros. Esta imagen muestra el funcionamiento de una cláusula JOIN:

INNER JOIN

2. ¿Cómo escribiría una consulta JOIN para estas dos tablas?

Durante la entrevista, es posible que se le pida que aplique sus conocimientos en un escenario práctico, escribiendo una cláusula JOIN. Veamos un ejemplo para que pueda resolver este problema fácilmente.

Tenemos dos tablas:

  • employees: Esta tabla contiene el ID de cada empleado, su nombre y el ID del departamento.

idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • departments: Esta tabla contiene el ID y el nombre de cada departamento.

department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research And Development

Si le han pedido que use JOIN en las tablas, intente encontrar una columna que exista en cada una de las tablas. En este ejemplo, es la columna department_id.

SELECT * 
FROM employees 
JOIN departments 
ON employees.department_id = departments.department_id;

La ejecución de este código producirá el siguiente resultado:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources

La condición ON indica cómo deben combinarse las dos tablas (la que está después de FROM y la que está después de JOIN). En el ejemplo anterior, puede ver que ambas tablas contienen la columna department_id. Nuestra consulta SQL devolverá las filas en las que employees.department_id sea igual a departments.department_id.

A veces, los campos relacionales son un poco menos obvios. Por ejemplo, podría haber una tabla llamada "employees" con un campo llamado id, que podría combinarse con un employee_id de cualquier otra tabla.

También se puede especificar qué columnas exactas se desea devolver de cada una de las tablas incluidas en la cláusula JOIN. Cuando se incluye un nombre de columna que existe en ambas tablas, se debe especificar la tabla exacta de la que se desea obtener.

No podemos escribir solo department_id, porque esto causaría un error de ambigüedad en SQL. Debemos escribir employees.department_id o departments.department_id. Por ejemplo, podríamos escribir lo siguiente:

SELECT 
employees.department_id, employee_name, department_name
FROM employees 
JOIN departments 
ON employees.department_id = departments.department_id;

Observe nuestra expresión SELECT. Hemos especificado el nombre exacto de la tabla para la columna department_id, porque esta columna existe en las dos tablas de nuestra cláusula JOIN. No tenemos que hacer esto para las columnas employee_name ni department_name, porque son únicas. Al ejecutar esta consulta SQL se obtiene el siguiente resultado:

department_idemployee_namedepartment_name
1Ned FlandersSales
3Clancy WiggumHuman Resources
4Homer SimpsonCustomer Service
5Barney GumbleResearch And Development

Cuando escribimos nuestras cláusulas JOIN en SQL, también podemos usar alias de SQL. Es posible que los nombres de las columnas sean bastante técnicos y poco comprensibles. Esto podría hacer que el resultado de la consulta sea difícil de entender. A continuación, se presentan algunas reglas que se deben seguir cuando se utiliza un alias de SQL:

  • Para dar un nombre descriptivo a una columna, hay que utilizar un alias de columna.
  • Para asignar un alias a una columna, hay que utilizar la palabra clave AS seguida del alias.
  • Si el alias contiene espacios, hay que ponerlo entre comillas simples.

Los alias de SQL se pueden aplicar tanto a los nombres de las tablas como a los de las columnas. Podríamos reescribir nuestra consulta anterior para incluir un alias para cada nombre de columna de la siguiente manera:

SELECT 
employees.department_id AS ID, 
employee_name AS ‘Employee Name’, 
department_name AS Department
FROM employees 
JOIN departments 
ON employees.department_id = departments.department_id;

Observe que tuvimos que utilizar comillas simples para nuestra columna ‘Employee Name’ porque este alias contiene espacios.

Si reescribimos el código anterior, esta vez utilizando un alias para cada nombre de tabla, obtendremos lo siguiente:

SELECT * 
FROM employees AS emp 
JOIN departments AS dep 
ON emp.department_id = dep.department_id;

La palabra clave AS que aquí se utiliza también es completamente opcional, se puede omitir en la expresión. Si realizamos este pequeño cambio, nuestra consulta tendrá el siguiente aspecto:

SELECT * 
FROM employees emp 
JOIN departments dep 
ON emp.department_id = dep.department_id;

Esta debería ser toda la información que usted necesita para hacer JOIN en dos tablas y responder a cualquier pregunta complementaria que le puedan hacer sobre la sintaxis básica de las operaciones JOIN.

3. ¿Qué tipos de JOIN existen?

Como se mencionó en la introducción de este artículo, hay muchos tipos de cláusulas JOIN en SQL. Probar que se domina cada una de ellas es una forma de demostrar los conocimientos que se tiene sobre las operaciones JOIN de SQL. Estos son algunos de los tipos más comunes de cláusulas JOIN con los que se encontrará:

INNER JOIN en SQL

La cláusula INNER JOIN es la cláusula JOIN predeterminada en SQL. Si observa nuestro ejemplo anterior (SELECT * FROM employees JOIN departments), esta cláusula era, en realidad, una INNER JOIN.

La INNER JOIN se utiliza para devolver las filas de ambas tablas que satisfacen la condición dada. La INNER JOIN empareja las filas de la primera y segunda tabla que cumplen la condición ON.

Esta imagen muestra la relación entre las dos tablas que están incluidas en nuestra cláusula INNER JOIN:

INNER JOIN

Voy a mostrar más a fondo la sintaxis y la funcionalidad de INNER JOIN a través de un ejemplo práctico con las dos tablas, employees y departments, descritas anteriormente.

La siguiente expresión SQL busca coincidencias entre las tablas employees y departments, basándose en la columna department_id.

SELECT * from employees emp 
INNER JOIN departments dep 
ON emp.department_id = dep.department_id;

Si la ejecutamos, nos devolverá el siguiente resultado:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources

Cuando observamos nuestro resultado, nos damos cuenta de que el empleado Moe Szyslak no está. En nuestra tabla employees este empleado no tiene asociado ningún department_id. Por lo tanto, no se encontró ninguna coincidencia al realizar la JOIN de esta columna en la tabla departments. Por lo tanto, el empleado no se incluye en el resultado. Este problema se soluciona con el siguiente tipo de JOIN, la LEFT JOIN.

Si quiere conocer más ejemplos de INNER JOIN, lea este artículo con ejemplos visuales y fáciles de entender; le ayudará a comprender este complejo tema.

LEFT JOIN en SQL

Al igual que con la cláusula INNER JOIN, la LEFT JOIN permite consultar datos de dos tablas. Pero, ¿cuál es la principal diferencia entre una LEFT JOIN y una INNER JOIN? La LEFT JOIN devuelve todas las filas que están en la primera tabla (izquierda) que se escribe. También se devuelven las filas que coinciden de la tabla de la derecha.

Con la cláusula LEFT JOIN se empiezan a usar los conceptos de tabla izquierda y tabla derecha.

LEFT JOIN

En el diagrama anterior, la Tabla 1 (Table 1) es la tabla izquierda, y la tabla 2 (Table 2) es la tabla derecha.

La cláusula LEFT JOIN selecciona los datos a partir de la tabla izquierda. Hace coincidir cada fila de la tabla izquierda con las filas de la tabla derecha, basándose en la condición de la cláusula JOIN.

La cláusula LEFT JOIN de SQL devuelve todas las filas de la tabla izquierda, incluso si no hay coincidencias en la tabla derecha. Esto significa que, si la cláusula ON no encuentra ninguna coincidencia de registros en la tabla derecha, el resultado de la JOIN seguirá mostrando la fila, pero con valores NULL en cada columna de la tabla derecha.

La LEFT JOIN de SQL devuelve todos los valores de la tabla izquierda, más los valores que coinciden de la tabla derecha. Si no se encuentra ninguna coincidencia, la LEFT JOIN devuelve un valor NULL en su lugar.

La sintaxis de nuestra cláusula LEFT JOIN de SQL es la siguiente:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

Especificamos que queremos una LEFT JOIN. Se hace igual para todos los tipos de JOIN (especificar antes de la palabra clave JOIN la variante de JOIN que se está utilizando).

La palabra clave ON funciona igual que en nuestro ejemplo de INNER JOIN. Estamos buscando valores que coincidan de la columna department_id de nuestra tabla employees, con la columna department_id de nuestra tabla departments.

En este caso, nuestra tabla employees será la tabla izquierda porque es la primera tabla que especificamos.

El resultado de la ejecución de esta consulta SQL sería el siguiente:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Ahora, el empleado Moe Szyslak aparece en el conjunto de resultados, aunque no hay ningún department_id de la tabla departments que coincida con el suyo. Este es exactamente el propósito de la cláusula LEFT JOIN (incluir todos los datos de la tabla izquierda, independientemente de si se encuentra alguna coincidencia en la tabla de la derecha).

RIGHT JOIN en SQL

La operación RIGHT JOIN es similar a la operación LEFT JOIN, excepto que la acción que se realiza en las tablas combinadas se invierte. Básicamente, ejecuta la acción opuesta a la de la LEFT JOIN. Esto significa que la RIGHT JOIN devuelve todos los valores de la tabla derecha, más los valores que coinciden de la tabla izquierda o NULL, en caso de no coincidir con lo que dicta la JOIN.

En el diagrama siguiente, la Tabla 2 es nuestra tabla derecha y la Tabla 1 es nuestra tabla izquierda:

RIGHT JOIN

Y, el resultado de la imagen es el que se obtiene cuando aplicamos el siguiente código a nuestras tablas employees y departments:

SELECT * FROM employees emp 
RIGHT JOIN departments dep 
ON emp.department_id = dep.department_id;

La sintaxis de esta consulta es similar a la de la LEFT JOIN. Especificamos que queremos realizar una RIGHT JOIN, buscando coincidencias entre las tablas departments y employees.

En este caso, nuestra tabla employees será la tabla izquierda, porque es la primera tabla que especificamos. La tabla departments es la tabla derecha. El resultado de la ejecución de esta consulta JOIN de SQL sería el siguiente:

idemployee_namedepartment_iddepartment_iddepartment_name
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

La RIGHT JOIN comienza a seleccionar los datos de la tabla derecha (departments). Empareja cada fila de la tabla derecha con cada fila de la tabla izquierda. Si la aplicación de la condición JOIN en ambas filas da como resultado "verdadero", combina los registros en otra fila y la incluye en el conjunto de resultados.

FULL JOIN en SQL

La FULL JOIN de SQL combina los resultados de las combinaciones externas izquierda y derecha. La tabla de la combinación contiene todos los registros de ambas tablas, y valores NULL cuando no hay coincidencias en cada lado.

Tenga en cuenta que las FULL JOIN pueden devolver un conjunto de datos muy grande. Las FULL JOIN devuelven todas las filas de las tablas de la combinación, tanto si existen coincidencias, como si no.

La FULL JOIN de SQL es un tipo de OUTER JOIN (la veremos más adelante en el artículo), por lo que también puede denominarse FULL OUTER JOIN.

Aquí se ilustra claramente el concepto de una FULL JOIN en SQL:

FULL JOIN

Observe que en nuestro diagrama se devuelven todas las filas de ambas tablas.

A continuación, muestro la sintaxis de la cláusula FULL JOIN de SQL mediante un ejemplo de código:

SELECT * FROM employees emp 
FULL JOIN departments dep 
ON emp.department_id = dep.department_id;

Cuando esta consulta SQL se ejecuta contra nuestras tablas employees y departments, produce el siguiente resultado:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
2Ned Flanders11Sales
NULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Compare este conjunto de resultados con los resultados de nuestras consultas LEFT JOIN y RIGHT JOIN. Verá cómo estos datos son una combinación de los datos que devolvieron nuestros ejemplos anteriores. Este tipo específico de cláusula JOIN produce un gran conjunto de datos. Piénselo bien antes de utilizar alguna cláusula FULL JOIN.

CROSS JOIN

La cláusula CROSS JOIN de SQL se utiliza cuando se necesita averiguar todas las posibilidades de la combinación de dos tablas, ya que su conjunto de resultados incluye todas las filas de las tablas de la consulta. La cláusula CROSS JOIN devuelve el producto cartesiano de las filas de las tablas combinadas.

El diagrama siguiente ilustra bien cómo se combinan las filas:

CROSS JOIN

La CROSS JOIN produce un conjunto de resultados cuyo tamaño es el número de filas de la primera tabla multiplicado por el número de filas de la segunda tabla. Este tipo de resultado se denomina producto cartesiano de dos tablas (Tabla 1 x Tabla 2).

Veamos las dos tablas de antes:

  • La tabla employees
idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • La tabla departments
department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research And Development

Para realizar una CROSS JOIN de estas tablas, escribiríamos una consulta SQL como esta:

SELECT * FROM employees 
CROSS JOIN departments;

Observe que con la CROSS JOIN no se utiliza ON ni USING. Esto no ocurre con las cláusulas JOIN que hemos visto anteriormente.

Después de ejecutar la CROSS JOIN, el conjunto de resultados sería el siguiente:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson41Sales
2Ned Flanders11Sales
3Barney Gumble51Sales
4Clancy Wiggum31Sales
5Moe SzyslakNULL1Sales
1Homer Simpson42Engineering
2Ned Flanders12Engineering
3Barney Gumble52Engineering
4Clancy Wiggum32Engineering
5Moe SzyslakNULL2Engineering
1Homer Simpson43Human Resources
2Ned Flanders13Human Resources
3Barney Gumble53Human Resources
4Clancy Wiggum33Human Resources
5Moe SzyslakNULL3Human Resources
1Homer Simpson44Customer Service
2Ned Flanders14Customer Service
3Barney Gumble54Customer Service
4Clancy Wiggum34Customer Service
5Moe SzyslakNULL4Customer Service
1Homer Simpson45Research And Development
2Ned Flanders15Research And Development
3Barney Gumble55Research And Development
4Clancy Wiggum35Research And Development
5Moe SzyslakNULL5Research And Development

Nuestro conjunto de resultados contiene todas las combinaciones posibles entre las dos tablas. Incluso cuando las tablas utilizadas tienen pocos datos, como ocurre nuestras tablas employees y departments, pueden producir un enorme conjunto de resultados cuando se utilizan junto con la cláusula CROSS JOIN de SQL.

NATURAL JOIN en SQL

La NATURAL JOIN es un tipo de JOIN que combina tablas basadas en columnas con el mismo nombre y tipo de datos. Cuando se utiliza la cláusula NATURAL JOIN, se crea una cláusula JOIN implícita que se basa en las columnas comunes de las dos tablas que se están combinando.

Las columnas comunes son columnas que tienen el mismo nombre en ambas tablas. No es necesario especificar los nombres de las columnas a combinar. La tabla resultante no contendrá ninguna columna repetida.

La sintaxis de la NATURAL JOIN es sencilla:

SELECT * FROM employees 
NATURAL JOIN departments;

Cuando se ejecute esta consulta, producirá el siguiente conjunto de resultados:

department_ididemployee_namedepartment_name
12Ned FlandersSales
34Clancy WiggumHuman Resources
41Homer SimpsonCustomer Service
53Barney GumbleResearch And Development

La NATURAL JOIN se realiza en la columna que las dos tablas comparten. En este caso, es la columna department_id. Esta columna que coincide solo se muestra una vez en nuestro conjunto de resultados.

4. ¿Qué es una operación OUTER JOIN?

Con las OUTER JOIN de SQL se pueden devolver las filas que no coinciden de una o ambas tablas. Existen diferentes variaciones para la cláusula OUTER JOIN, algunas de las cuales ya hemos cubierto en este artículo. Estos son los tipos habituales de cláusulas OUTER JOIN:

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN
  • FULL OUTER JOIN

LEFT JOIN es un sinónimo de LEFT OUTER JOIN. La funcionalidad de ambas cláusulas es idéntica. Esta puede ser una de las preguntas que le hagan en la entrevista sobre JOIN en SQL. Lo mismo puede decirse de RIGHT JOIN y RIGHT OUTER JOIN, y de FULL JOIN y FULL OUTER JOIN. Veamos un ejemplo de cada una de ellas.

LEFT OUTER JOIN en SQL

Utilice una LEFT OUTER JOIN cuando quiera obtener todos los resultados que se encuentran en la primera tabla de la consulta. La LEFT OUTER JOIN solo devolverá las filas que coinciden de la segunda tabla.

La sintaxis de la cláusula LEFT OUTER JOIN es la siguiente:

SELECT * FROM employees emp 
LEFT OUTER JOIN departments dep 
ON emp.department_id = dep.department_id;

El resultado de la ejecución de esta consulta SQL sería el siguiente:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Observe que nuestro empleado Moe Syzslak fue incluido en el conjunto de resultados a pesar de que en la tabla departments no hay ningún department_id que coincida. Este es exactamente el propósito de la cláusula LEFT OUTER JOIN (incluir todos los datos de la tabla izquierda, independientemente de si se encuentra alguna coincidencia en la tabla de la derecha).

RIGHT OUTER JOIN en SQL

La operación RIGHT OUTER JOIN es similar a la operación LEFT OUTER JOIN, excepto que la acción que se realiza en las tablas combinadas se invierte. Básicamente, ejecuta la acción opuesta a la de la LEFT OUTER JOIN. Esto significa que la RIGHT OUTER JOIN devuelve todos los valores de la tabla derecha, más los valores que coinciden de la tabla izquierda o NULL en caso de que no haya coincidencias.

Cuando aplicamos la cláusula RIGHT OUTER JOIN a nuestras tablas employees y departments, la consulta resultante es la siguiente:

SELECT * FROM employees emp 
RIGHT OUTER JOIN departments dep 
ON emp.department_id = dep.department_id;

En este caso, nuestra tabla employees será la tabla izquierda, porque es la primera tabla que especificamos.

El resultado de la ejecución de esta consulta SQL sería el siguiente:

idemployee_namedepartment_iddepartment_iddepartment_name
2Ned Flanders11Sales
NULLNULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

La RIGHT OUTER JOIN comienza a seleccionar los datos de la tabla derecha, en este caso, nuestra tabla departments. Empareja cada fila de la tabla derecha con cada fila de la tabla izquierda. Si la aplicación de la condición JOIN en ambas filas da como resultado "verdadero", combina los registros en otra fila y la incluye en el conjunto de resultados.

FULL OUTER JOIN en SQL

La FULL OUTER JOIN de SQL combina los resultados de las combinaciones externas izquierda y derecha. La tabla de la combinación contiene todos los registros de ambas tablas, y valores NULL cuando no hay coincidencias en cada lado. Las FULL OUTER JOIN devuelven todas las filas de las tablas de la combinación, tanto si existen coincidencias, como si no.

Veamos la sintaxis de la cláusula FULL OUTER JOIN de SQL:

SELECT * FROM employees emp 
FULL OUTER JOIN departments dep 
ON emp.department_id = dep.department_id;

Cuando esta consulta SQL se ejecuta contra nuestras tablas employees y departments, produce el siguiente resultado:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research And Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
2Ned Flanders11Sales
NULLNULL2Engineering
4Clancy Wiggum33Human Resources
1Homer Simpson44Customer Service
3Barney Gumble55Research And Development

Este conjunto de datos es una combinación de nuestras consultas anteriores LEFT OUTER JOIN y RIGHT OUTER JOIN.

5. ¿Cuál es la diferencia entre una INNER JOIN y una LEFT JOIN en SQL?

Existen algunas diferencias importantes que vale la pena recordar sobre estas variantes de JOIN que se suelen usar. La INNER JOIN devuelve filas cuando hay una coincidencia en ambas tablas. La LEFT JOIN devuelve todas las filas de la tabla izquierda y las filas que coinciden de la tabla derecha.

Explicaré un ejemplo práctico que muestra las diferencias entre estas cláusulas. Esto le ayudará a responder con confianza a esta pregunta habitual de las entrevistas sobre JOIN en SQL.

Imagine que tenemos dos tablas:

  • employees: Esta tabla contiene el ID, el nombre y el ID del departamento de cada empleado.
idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL
  • departments: Esta tabla contiene el ID y el nombre de cada departamento.
department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

La siguiente expresión SQL busca coincidencias entre las tablas employees y departments basándose en la columna department_id.

SELECT * from employees emp 
INNER JOIN departments dep 
ON emp.department_id = dep.department_id;

La ejecución de este código producirá el siguiente resultado:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources

Cuando observamos nuestro resultado, nos damos cuenta de que el empleado Moe Szyslak no está. En nuestra tabla employees este empleado no tiene asociado ningún department_id. Por lo tanto, no se encontró ninguna coincidencia al realizar la JOIN de esta columna en la tabla departments. Por lo tanto, el empleado no se incluye en el resultado.

Ahora, usemos una LEFT JOIN para ver cuál es el resultado. La LEFT JOIN de SQL devuelve todos los valores de la tabla izquierda y los valores que coinciden de la tabla derecha. Si no se encuentra ninguna coincidencia, la LEFT JOIN devuelve un valor NULL.

La sintaxis de nuestra cláusula LEFT JOIN de SQL es la siguiente:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

La palabra clave ON funciona igual que en nuestro ejemplo de INNER JOIN. Estamos buscando valores que coincidan de la columna department_id de nuestra tabla employees, con la columna department_id de nuestra tabla departments.

En este caso, nuestra tabla employees actuará como la tabla izquierda porque es la primera tabla que especificamos.

El resultado de ejecutar esta consulta SQL es el siguiente conjunto de resultados:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Obsérvese que Moe Szyslak ha sido incluido en este conjunto de resultados, a pesar de que no existe ningún department_id que coincida en la tabla departments. Este es exactamente el propósito de la cláusula LEFT JOIN (incluir todos los datos de nuestra tabla izquierda, independientemente de que se haya encontrado alguna coincidencia).

6. ¿Cuál es la diferencia entre una LEFT JOIN y una FULL JOIN?

Esta es una de las preguntas de JOIN de SQL a las que se puede enfrentar durante una entrevista.

Como mencioné antes, las LEFT JOIN de SQL devuelven todos los valores de la tabla izquierda, más los valores que coinciden de la tabla derecha. Si no se encuentra ninguna coincidencia, las LEFT JOIN devuelven un valor NULL en su lugar. Las FULL JOIN de SQL devuelven todas las filas de las tablas combinadas, tanto si coinciden como si no. Básicamente, combinan la funcionalidad de las LEFT JOIN y de las RIGHT JOIN.

Comparemos el conjunto de resultados de una cláusula LEFT JOIN con el conjunto de resultados de una FULL JOIN.

A continuación, se muestra una consulta que hace uso de una LEFT JOIN:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

En este caso, nuestra tabla employees actuará como la tabla izquierda, porque es la primera tabla que especificamos.

El resultado de la ejecución de esta consulta SQL sería el siguiente:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Veamos cuál sería la diferencia en el resultado si se usase una cláusula FULL JOIN de SQL. La sintaxis es similar, como demuestra este código:

SELECT * FROM employees emp 
FULL JOIN departments dep 
ON emp.department_id = dep.department_id;

Cuando esta consulta SQL se ejecuta contra nuestras tablas employees y departments produce el siguiente resultado:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL
NULLNULLNULL2Engineering

Compare este conjunto de resultados con los resultados de nuestras consultas LEFT JOIN y RIGHT JOIN. Como puede ver, no se encontró ninguna coincidencia para el departamento Engineering (Ingeniería), pero, aun así, este se devolvió. Está claro que estos datos son una combinación de los datos que devolvieron nuestros ejemplos anteriores. Este tipo específico de cláusula JOIN produce un gran conjunto de datos. Piénselo bien antes de utilizar alguna cláusula FULL JOIN en SQL.

7. Escriba una consulta JOIN para estas dos tablas para que todas las filas de la Tabla 1 estén en el resultado.

Cuando le entrevisten para un puesto de analista de datos o de desarrollador de software, es posible que le pidan que realice un reto técnico de SQL. Una tarea habitual de las entrevistas de JOIN en SQL es escribir una consulta que combine dos tablas de una manera determinada. Imaginemos que se le pide que escriba una consulta que combine dos tablas para que todas las filas de la Tabla 1 estén en el resultado.

En primer lugar, debe entender el concepto de tablas derecha e izquierda.

LEFT JOIN

En el diagrama anterior, la Tabla 1 es la tabla izquierda y la Tabla 2 es la tabla derecha. En otras palabras, la tabla izquierda es la primera en la consulta; recibe su nombre por estar a la izquierda de la condición de combinación. La tabla derecha aparece después de la palabra clave JOIN.

La cláusula LEFT JOIN selecciona los datos a partir de la tabla izquierda. Hace coincidir cada fila de la tabla izquierda con las filas de la tabla derecha, basándose en la condición de la cláusula JOIN. Devuelve todos los valores de la tabla izquierda y los valores que coinciden de la tabla derecha. Si no se encuentra ninguna coincidencia, la LEFT JOIN devuelve un valor NULL. Esto significa que, si la cláusula ON no encuentra ninguna coincidencia de registros en la tabla derecha, la JOIN seguirá devolviendo esa fila, pero con valores NULL en cada columna de la tabla derecha.

Para nuestro ejemplo práctico, utilizaremos las tablas employees y departments de nuestro ejemplo anterior:

employees: Esta tabla contiene el ID, el nombre y el ID del departamento de cada empleado.

idemployee_namedepartment_id
1Homer Simpson4
2Ned Flanders1
3Barney Gumble5
4Clancy Wiggum3
5Moe SyzslakNULL

departments: Esta tabla contiene el ID y el nombre de cada departamento.

department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

Si queremos mantener todas las filas de la Tabla 1 (en este caso, employees), debemos especificar que es nuestra tabla izquierda.

La sintaxis de esta cláusula LEFT JOIN es la siguiente:

SELECT * FROM employees emp 
LEFT JOIN departments dep 
ON emp.department_id = dep.department_id;

Cuando se ejecuta esta consulta, se obtiene el siguiente conjunto de resultados:

idemployee_namedepartment_iddepartment_iddepartment_name
1Homer Simpson44Customer Service
2Ned Flanders11Sales
3Barney Gumble55Research and Development
4Clancy Wiggum33Human Resources
5Moe SzyslakNULLNULLNULL

Ahora, el empleado Moe Szyslak aparece en el conjunto de resultados, aunque no hay ningún department_id de la tabla departments que coincida con el suyo. Este es exactamente el propósito de la cláusula LEFT JOIN (incluir todos los datos de la tabla izquierda, independientemente de si se encuentra alguna coincidencia en la tabla de la derecha).

8. ¿Cómo se combinan más de dos tablas?

Cómo combinar más de dos tablas en una sola consulta SQL puede ser bastante difícil de entender para los principiantes. El siguiente ejemplo lo explica.

Se realiza una JOIN en más de dos tablas cuando los datos que se quieren incluir en el resultado están en tres o más tablas. Para combinar varias tablas, hay que hacer operaciones consecutivas de JOIN. Primero, se combinan la primera y la segunda tabla, y se obtiene un conjunto virtual de resultados. Después, se combina otra tabla a esta tabla virtual. Veamos un ejemplo.

Para nuestro ejemplo de varias JOIN, imaginemos que tenemos tres tablas:

departments: Esta tabla contiene el ID y el nombre de cada departamento.

department_iddepartment_name
1Sales
2Engineering
3Human Resources
4Customer Service
5Research and Development

office: Esta tabla contiene la dirección de cada oficina.

idaddress
15 Wisteria Lane, Springfield, USA
2124 Chestmount Street, Springfield, USA
36610 Bronzeway, Springfield, USA
4532 Executive Lane, Springfield, USA
510 Meadow View, Springfield, USA

department_office: Esta tabla vincula la información de las oficinas con los departamentos que están en ellas. Algunos departamentos pueden abarcar varias oficinas.

office_iddepartment_id
11
23
32
44
55
21
51
43

En nuestro caso, hemos utilizado una tabla de enlace llamada department_office, que vincula o relaciona departments con las oficinas.

Para escribir una consulta SQL que devuelva las columnas department_name y address una al lado de la otra, tenemos que combinar tres tablas:

  • La primera cláusula JOIN combinará departments y department_office, y creará una tabla temporal que tendrá una columna llamada office_id.
  • La segunda expresión JOIN combinará esta tabla temporal con la tabla office a través de la columna office_id, no que nos proporcionará el resultado deseado.

Observe la siguiente consulta SQL:

SELECT department_name, address
FROM departments d 
JOIN department_office do ON d.department_id=do.department_id 
JOIN office o ON do.office_id=o.id;

Cómo puede ver, solo queremos recuperar dos columnas, el nombre del departamento y la dirección asociada al mismo. Combinamos la tabla department_office, que está vinculada con nuestras tablas departments y office. Esto nos permite combinar la tabla office, que contiene la columna address, en nuestra expresión SELECT.

La ejecución de este código produce el siguiente conjunto de resultados:

department_nameaddress
Sales5 Wisteria Lane, Springfield, USA
Engineering124 Chestmount Street, Springfield, USA
Human Resources6610 Bronzeway, Springfield, USA
Customer Service532 Executive Lane, Springfield, USA
Research and Development10 Meadow View, Springfield, USA
Sales124 Chestmount Street, Springfield, USA
Sales10 Meadow View, Springfield, USA
Human Resources532 Executive Lane, Springfield, USA

¡Ese es el resultado que deseábamos! Tener cada departamento y su correspondiente dirección. Observe que el departamento de Ventas (Sales) es el más grande, ya que abarca tres oficinas diferentes. El segundo departamento más grande es el de Recursos Humanos (Human Resources), que abarca dos oficinas diferentes.

Como puede ver, se pueden utilizar cláusulas JOIN en varias tablas, para crear vínculos entre tablas que tienen columnas en común. Existen muchas situaciones diferentes en las que combinar varias tablas puede ser útil. Para obtener más información, consulte este artículo sobre cómo hacer JOIN en tres o más tablas en SQL.

9. ¿Cómo se combina una tabla consigo misma?

Muchos principiantes no lo saben, pero se puede combinar una tabla consigo misma. Esta operación normalmente se llama autocombinación. Sirve para consultar datos jerárquicos o para comparar filas de la misma tabla. Cuando se utiliza una autocombinación, es importante utilizar un alias de SQL para cada tabla.

Para nuestro ejemplo de autocombinación, utilizaremos la siguiente tabla:

employee: Esta tabla almacena los nombres de todos los empleados de la empresa, los ID de sus departamentos y los ID de sus gerentes.

idemployee_namedepartment_idmanager_id
1Montgomery Burns4NULL
2Waylon Smithers11
3Homer Simpson21
4Carl Carlson51
5Lenny Leonard31
6Frank Grimes23

Digamos que queremos obtener un conjunto de resultados que solo muestre los empleados con sus gerentes. Esto se puede hacer fácilmente, utilizando alias de tablas junto con una autocombinación. En nuestra primera autocombinación utilizaremos una operación LEFT JOIN de SQL. Observe el código siguiente:

SELECT 
e.employee_name AS 'Employee',
m.employee_name AS 'Manager'
FROM employee e
LEFT JOIN employee m ON m.id = e.manager_id

Tenga cuidado con el error de columna ambigua, que puede ocurrir fácilmente cuando se escriben consultas de autocombinación. Para evitar este error, debe hacer un buen uso de los alias de SQL, es decir, dar un alias cada vez que aparece una tabla en su consulta SQL, como demuestra el siguiente fragmento de la consulta anterior:

FROM employee e LEFT JOIN employee m

También debe anteponer el alias de la tabla a los nombres de las columnas para que quede claro a qué tabla se refiere cada columna. Hemos especificado explícitamente e.employee_name y m.employee_name.

Estas reglas le ayudarán a ejecutar con éxito una consulta de autocombinación de SQL que no tenga el error de columna ambigua.

Cuando se ejecuta la consulta anterior, se obtiene el siguiente resultado:

EmployeeManager
Montgomery BurnsNULL
Waylon SmithersMontgomery Burns
Homer SimpsonMontgomery Burns
Carl CarlsonMontgomery Burns
Lenny LeonardMontgomery Burns
Frank GrimesHomer Simpson

¡Este es el resultado que deseábamos! Se puede ver claramente cada empleado (Employee) y su gerente correspondiente (Manager). La mayoría de los empleados dependen del Sr. Burns, aunque el gerente de Frank Grimes es Homer Simpson. Observe que, en la columna Manager hay un valor NULL para Montgomery Burns. Esto se debe a que Montgomery Burns no tiene ningún gerente; él es el jefe.

Ahora, vamos a modificar ligeramente la consulta y a utilizar una INNER JOIN:

SELECT 
e.employee_name AS 'Employee',
m.employee_name AS 'Manager'
FROM employee e
INNER JOIN employee m ON m.id = e.manager_id
EmployeeManager
Waylon SmithersMontgomery Burns
Homer SimpsonMontgomery Burns
Carl CarlsonMontgomery Burns
Lenny LeonardMontgomery Burns
Frank GrimesHomer Simpson

La única diferencia importante es la ausencia de Montgomery Burns en la columna "Employee". Esto se debe a que el valor de su manager_id es NULL; INNER JOIN solo devuelve las columnas que coinciden y excluye los valores NULL.

Ahora, usted sabe realizar autocombinaciones que se pueden aplicar en muchos casos de uso diferentes. Si quiere ver más ejemplos de autocombinaciones, consulte esta excelente guía ilustrada sobre autocombinaciones.

10. ¿La condición de las cláusulas JOIN debe ser de igualdad?

Una combinación non-equi (no equivalente) es aquella cláusula JOIN en la que su condición no utiliza el signo de igualdad ( = ). En cambio, puede usar operadores de comparación habituales (por ejemplo, <, >, <=, >=, != y <>) o el operador BETWEEN.

Hay muchas situaciones en las que las combinaciones no equivalentes pueden resultar útiles, como, por ejemplo, mostrar pares únicos o registros dentro de un rango e identificar duplicados. Veamos nuestro último ejemplo de uso: cómo identificar duplicados mediante una combinación no equivalente.

En primer lugar, observe los datos que vamos a consultar. Para este ejemplo, utilizaremos solo una tabla, employee, que es la siguiente:

idemployee_namedepartment_idmanager_id
1Montgomery Burns4NULL
2Waylon Smithers11
3Homer Simpson21
4Carl Carlson51
5Lenny Leonard31
6Frank Grimes23
7Lenny Leonard31

Si quisiéramos identificar rápidamente los valores duplicados, escribiríamos la siguiente consulta, que hace un buen uso de una combinación no equivalente:

SELECT e1.id, e1.employee_name, e2.id, e2.employee_name
FROM employee e1
JOIN employee e2
ON e1.employee_name = e2.employee_name AND e1.id < e2.id

Si observamos detenidamente la cláusula JOIN, podemos ver que tiene dos condiciones:

  1. Empareja los registros que tienen el mismo nombre.
  2. Recupera los registros cuyo ID es menor que el ID de la tabla temporal de la autocombinación.

Cuando se ejecuta la consulta anterior se obtiene el siguiente resultado:

idemployee_nameidemployee_name
5Lenny Leonard7Lenny Leonard

Podemos ver que Lenny Leonard tiene un registro duplicado en esta tabla. Los registros duplicados pueden causar errores impredecibles y contaminar los datos de los informes.

Este es solo uno de los muchos ejemplos posibles que demuestran la utilidad de las combinaciones no equivalentes. En internet hay disponibles otros recursos excelentes, como este artículo que muestra aplicaciones prácticas de las combinaciones no equivalentes.

Las 10 principales preguntas de las entrevistas sobre SQL han sido respondidas

Ahora, está equipado con los conocimientos necesarios para responder a preguntas complejas de las entrevistas sobre JOIN en SQL. Si todavía se siente inseguro o confuso en relación a las cláusulas JOIN en SQL, aquí tiene excelentes consejos para sus prácticas con las cláusulas JOIN en SQL.

Puede usar este artículo junto con la hoja de referencia de JOIN de SQL, que es una gran herramienta de referencia para los programadores principiantes y para los experimentados de SQL. Tanto si es nuevo en SQL como si cree que tiene que refrescar sus conocimientos sobre el tema, este curso interactivo Tipos de JOIN en SQL es un maravilloso recurso de aprendizaje.