Joins En SQL: Un Breve Ejemplo | Entender El Por Qué Y El Cómo De Los Joins En SQL

Tony Yiu
May 18, 2020

Contents Outline

Joins En SQL: Un Breve Ejemplo | Entender El Por Qué Y El Cómo De Los Joins En SQL

May 18, 2020 6 minutes read



Esta entrada en el blog fue originalmente destinada a ser una nota complementaria a mi entrada de Pandas Join vs. Merge. Pero resultó ser lo suficientemente larga como para justificar su propio post (y demasiado verborreica para ser una nota complementaria). No pretende ser un manual completo sobre Joins en SQL, sino más bien un ejemplo para ayudar a aquellos que son nuevos en SQL y en bases de datos relacionales a entender lo que significa unir dos tablas.

¿Por qué unimos?

¿Por qué molestarse en unir? ¿No podemos simplemente volcar todo en una hoja de cálculo y ordenar las cosas allí? Tal vez... pero sería increíblemente lento, tedioso y propenso a errores.

Las bases de datos relacionales están diseñadas para ser unidas. Cada tabla de la base de datos contiene datos de una forma o función específica. Por ejemplo, una tabla podría tener datos básicos sobre los clientes de una compañía como el ID del cliente (un ID único que puede ser usado para identificar a cada cliente), nombre, edad, sexo, fecha de la primera compra y dirección. Mientras que una tabla separada mucho más grande almacena datos detallados a nivel de transacción - ID de transacción, fecha de transacción, ID de cliente, categoría de producto, ID de producto, unidades vendidas y precio.

Un cliente determinado (o ID de cliente) podría tener cientos o incluso miles de transacciones, por lo que sería extremadamente redundante almacenar la información básica de ese cliente una y otra vez para cada fila de la tabla de transacciones. La tabla de transacciones debería ser sólo para datos relevantes para las transacciones. Tener demasiados datos superpuestos entre los cuadros es un despilfarro y puede afectar negativamente al rendimiento del sistema.

Pero eso no significa que no nos preocupemos por los vínculos entre las tablas. Dada la especificidad de cada tabla, los análisis que sólo implican una unica tabla no suelen ser útiles. Los análisis interesantes provienen de conjuntos de datos que combinan múltiples tablas. Por ejemplo, podríamos querer segmentar las transacciones por edad o geografía. Para ello, necesitaríamos datos de ambas tablas. Y ahí es donde entra en juego el join 

¿Cómo unimos?
Cuando unimos dos tablas, las unimos mediante una característica seleccionada. Digamos que tenemos dos tablas. La primera, Empleado, lista el número de identificación único de un empleado, su nombre y cargo. La segunda, Venta, lista los datos de quién hizo qué venta adjuntando el número de identificación del empleado y las unidades vendidas a un número de venta único:

SELECT * FROM Employee
SELECT * FROM Sale


Nuestras 2 tablas Empleado (izquierda) y Venta (derecha). (Omití los subrayados de los nombres de las columnas en mis gráficos para su legibilidad)

Ahora unamos las dos tablas. Para unir las dos tablas, necesitamos elegir una columna (o combinación de columnas) que sirva como punto de intersección - llamemos a la columna elegida el índice de unión. Las entradas de la tabla que comparten el mismo valor para el índice de unión se unen entre sí. Tenga en cuenta que la intersección no tiene que ser uno a uno. Por ejemplo, Tony ha hecho 2 ventas, así que al unirse a las tablas, ambas ventas estarán vinculadas a Tony (también conocido como Employee ID 1).

Cuando unimos las tablas, generalmente queremos que el índice de unión sea único. Si el índice de unión no fuera único, podrían ocurrir cosas extrañas. Por ejemplo, digamos que tenemos un segundo empleado llamado Tony (ejemplo en las tablas de abajo), y que es un vendedor mega estrella. Si en lugar de unirnos en "ID de empleado" unimos en "Nombre", entonces vincularíamos erróneamente las ventas de Tony la Megaestrella a mí, haciendo que mi bonificación sea demasiado alta:

No se recomienda unir en columnas no únicas

Y Tony la Megaestrella también obtendría crédito por mis lamentables ventas (no es que lo necesite). Así que para evitar esto, unimos en una columna con valores únicos como "Employee ID" (eliminé a Tony la Megaestrella ya que sólo estaba allí para ilustrar lo que no se debía hacer, y sus increíbles éxitos me hicieron sentir indigno):

La columna "Employee ID" proporciona el enlace entre las 2 tablas

Hay varios tipos de uniones SQL y no voy a entrar en los detalles de todos ellos aquí. En este ejemplo, usaremos un Left Join (unión izquierda), lo que significa que priorizamos las filas de la tabla de la izquierda. Así que nuestra salida incluirá cada fila de la tabla izquierda (la que tiene "Nombre" y "Título") independientemente de si hay una coincidencia con la tabla derecha - por lo tanto, los empleados que no han hecho una venta seguirán apareciendo en una fila de nuestro resultado, pero no habrá valores (NULLs para ser exactos) para las columnas "Número de venta" y "Unidades vendidas".
Echemos un vistazo a nuestro resultado (estamos seleccionando sólo "Número de Venta" y "Unidades Vendidas" de la tabla de la derecha y clasificando por "ID del Empleado"):

SELECT e.*, s.Sale_Number, s.Units_Sold
FROM Employee as e
   LEFT JOIN Sale as s ON e.Employee_ID=s.Employee_ID
ORDER BY e.Employee_ID

Resultado de nuestra unión a la izquierda

La salida de nuestra unión ahora incluye datos de ambas tablas. Los datos de ventas de Tony han sido vinculados sus datos de (gracias al Employee ID) al igual que los de Lisa. 

Fijemonos en dos cosas:
  1. Parece un poco repetitivo porque "ID de empleado", "Nombre" y "Título" se repiten tantas veces como el empleado tenga ventas. En realidad, no nos detendremos aquí. A continuación, lo más probable es que hagamos un group by para contar cuántas ventas hizo cada vendedor o calcular el promedio de unidades vendidas cada vez que el vendedor hizo una venta

  1. El ID del empleado 3 no está en la salida porque hicimos una unión a la izquierda y no había ninguna entrada para el ID del empleado 3 en la tabla de la izquierda. Por lo tanto, se omitió.

Asi  concluye nuestro breve ejemplo. Con suerte, esto te da una idea rudimentaria de por qué necesitamos las uniones y cómo funcionan.


Puntos importantes
  • Las tablas de la base de datos generalmente contienen información muy específica. Por lo tanto, los análisis significativos suelen combinar datos de múltiples tablas.
  • Esto se logra a través de la operación de unión, que combina dos tablas haciéndolas coincidir en base a una columna específica.
  • La columna utilizada para combinar las tablas debe contener sólo valores únicos.
  • Existen varios tipos de uniones. La de este ejemplo es una unión a la izquierda, que devuelve cada fila de la tabla de la izquierda, haya o no coincidencia.


Join our private community in Discord

Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!