¡Descubre Cómo Usar LEFT JOIN en SQL para Unir Tablas y Contar Registros a Cero Fácilmente!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

LEFT JOIN es uno de los métodos más comunes y esenciales de SQL, fundamental para trabajar con datos de dos o más tablas. Es uno de los conceptos clave que aprenderá en el camino de aprendizaje a través de la programación. Las uniones SQL son vitales para trabajar con varias tablas, una tarea cotidiana incluso para los analistas de datos principiantes. Esto también implica conocer LEFT JOIN, ya que es uno de los dos tipos de join más utilizados. Una cláusula JOIN en SQL, correspondiente a una operación de conjunción en álgebra relacional, combina columnas de una o más tablas en un banco de datos relacional. Un JOIN es un medio de combinar columnas de una o más tablas, usando valores comunes a cada una de ellas. En un banco de datos relacional, los datos son distribuidos en varias tablas lógicas.

¿Qué es LEFT JOIN y Cómo Funciona?

LEFT JOIN es uno de los varios tipos de SQL JOINs. El propósito de JOINs es obtener los datos de dos o más tablas. LEFT JOIN logra ese objetivo devolviendo todos los datos de la primera tabla (izquierda) y sólo las filas coincidentes de la segunda tabla (derecha). Si no hay coincidencias en la tabla de la derecha, se devuelven NULL en las columnas correspondientes a la tabla de la derecha. Esto significa que LEFT JOIN es lo mismo que LEFT OUTER JOIN. Como usuarios de SQL, normalmente escribimos sólo LEFT JOIN.

Los dos puntos clave para utilizar LEFT JOIN son la palabra clave LEFT JOIN y la cláusula de unión ON. Las tablas se unen según los valores de columna coincidentes; se hace referencia a estas columnas en la cláusula ON y se pone un signo igual entre ellas. Esto unirá las tablas donde la columna de una tabla es igual a la columna de la segunda tabla. Este es el tipo más común de LEFT JOIN y se llama equi-join por el signo igual. LEFT OUTER JOIN permite realizar lecturas con uniones de tablas que excluyen de las condiciones de intersección la tabla indicada en la parte izquierda. La sintaxis de join es una expresión de unión recursiva. Una expresión join se compone de un lado izquierdo y un lado derecho, unidos utilizando cualquiera [INNER] JOIN o LEFT [OUTER] JOIN. Una expresión de unión puede ser una unión interna (INNER) o una unión externa (LEFT OUTER). Cada expresión de unión se puede encerrar entre paréntesis. En el lado izquierdo, se puede especificar una tabla de base de datos transparente, una vista dbtab_left u otra combinación de expresión de unión. En el lado derecho, se debe especificar una sola tabla de base de datos transparente o una vista dbtab_right, junto con las condiciones de unión join_cond después de ON. De esta manera, es posible especificar un máximo de 24 expresiones de unión después de FROM; estas expresiones unen 25 tablas de base de datos transparentes o vistas conjuntamente. Se pueden vincular varias cláusulas ON.

Diferencias con Otros Tipos de JOIN

Es crucial entender en qué se diferencia LEFT JOIN de otras operaciones JOIN:

  • (INNER) JOIN: Devuelve sólo las filas coincidentes de las tablas unidas. La cláusula INNER JOIN compara cada línea de tabla A con las líneas de tabla B para encontrar todos los pares de líneas que satisfacen la condición de unión. Para cada línea de la tabla A, la consulta la compara con todas las líneas de la tabla B.
  • RIGHT (OUTER) JOIN: Devuelve todos los datos de la tabla derecha y sólo las filas coincidentes de la tabla izquierda. La RIGHT JOIN combina datos de dos o más tablas y retorna un conjunto de resultados que incluye todas las líneas de la tabla “derecha” B, con o sin líneas correspondientes en la tabla “izquierda” A.
  • FULL (OUTER) JOIN: Devuelve todas las filas de ambas tablas unidas. Si hay filas no coincidentes entre las tablas, se muestran como NULL. La cláusula FULL JOIN retorna todas las líneas de las tablas unidas, correspondidas o no, es decir, tú puedes decir que la FULL JOIN combina las funciones de la LEFT JOIN y de la RIGHT JOIN. Cuando no existen líneas correspondientes para la línea de la tabla izquierda, las columnas de la tabla derecha serán nulas.
  • CROSS JOIN: Devuelve todas las combinaciones de todas las filas de las tablas unidas, es decir, un producto cartesiano. La cláusula CROSS JOIN retorna todas las líneas de las tablas por cruzamiento, o sea, para cada línea de la tabla izquierda queremos todas las líneas de la tabla derecha o viceversa. Él también es llamado producto cartesiano entre dos tablas.

Es importante saber que las operaciones LEFT JOIN o RIGHT JOIN se pueden anidar dentro de una operación INNER JOIN, pero una operación INNER JOIN no se puede anidar dentro de una operación LEFT JOIN o RIGHT JOIN.

Lea también: tutorial de sentencias JOIN para bases de datos en PHP

Ejemplos Prácticos de LEFT JOIN

Permítame mostrarle ahora varios ejemplos reales del uso de LEFT JOIN para ilustrar su versatilidad y potencia.

Ejemplo 1: Recuperar Datos de Compañías y Productos

Trabajaré con dos tablas. La primera es company que almacena una lista de empresas de electrónica. La segunda tabla es product. Selecciono la empresa y el nombre del producto. Estas son las columnas de dos tablas. La tabla de la izquierda es company y hago referencia a ella en FROM. En la cláusula ON, especifico las columnas en las que se unirán las tablas. He utilizado ORDER BY para que la salida sea más legible. Cuando una empresa tiene varios productos, se enumeran todos los productos y se duplica el nombre de la empresa.

Ejemplo 2: Departamentos Sin Empleados

Exploremos un escenario común. Aquí está la tabla department y su script. La segunda tabla es employee, que es una lista de empleados. Selecciono el ID de la tabla department y lo renombro como department_id. La segunda columna seleccionada de la misma tabla es department_name. Los datos seleccionados de la tabla employee son id (renombrada como employee_id) y los nombres de los empleados. Todo este cambio de nombre de las columnas es sólo para que la salida sea más fácil de leer. Ahora, puedo hacer referencia a la tabla department en FROM y LEFT JOIN con la tabla employee. Finalmente, ordeno la salida por el departamento y luego por el ID del empleado para hacerla más legible. La salida muestra todos los departamentos y sus empleados. También muestra dos departamentos que no tienen empleados: RRHH y Operaciones. Por ejemplo, puede usar LEFT JOIN con las tablas Departamentos (izquierda) y Empleados (derecha) para seleccionar todos los departamentos, incluidos aquellos que no tengan ningún empleado asignado.

Ejemplo 3: Clientes Sin Pedidos

Para este ejemplo, utilizaré el siguiente conjunto de datos. La primera tabla es customer que es una simple lista de clientes. La segunda tabla del conjunto de datos es orders. En nuestro ejemplo queremos obtener el nombre del cliente y el ID de la factura, pero además saber cuáles clientes no han realizado ninguna compra. Si vamos a la estructura de tablas, recordemos que en la tabla Factura tenemos el ID de la factura y el ID del cliente, pero el nombre del cliente lo tenemos en la tabla cliente. Procedamos a hacer la consulta. Lo primero que vamos a hacer es un select. Selecciono los nombres de los clientes de la tabla customer. La tabla de la izquierda es customer y quiero todas sus filas. Puedes ver que muestra todos los clientes y sus pedidos.

Ejemplo 4: Uniones Múltiples (Escritores, Libros y Traductores)

La primera tabla es writer con el script aquí. La segunda tabla es traductor. Es una lista de traductores de libros. La última tabla es libro, que muestra información sobre los libros en particular. En este ejemplo, quiero mostrar todos los escritores, sin importar si tienen un libro o no. Selecciono los nombres de los escritores, los títulos de sus libros y los nombres de los traductores. La unión de tres (o más) tablas se realiza en forma de cadena. A continuación, añado la segunda cláusula LEFT JOIN. El primer LEFT JOIN está ahí porque puede haber escritores sin libro. Sin embargo, esto también es cierto para la relación entre las tablas book y translator: un libro puede ser o no una traducción, por lo que puede tener o no un traductor correspondiente. Como puede ver, los libros de Bernardine Evaristo se muestran a pesar de no ser traducciones. Normalmente, la elección de LEFT JOIN viene dada por la naturaleza de las relaciones entre las tablas.

Lea también: funciones y beneficios del contabilizador de CONTPAQi

Ejemplo 5: Forzando LEFT JOIN para Retener Datos

A veces nos vemos "obligados" a utilizar LEFT JOIN. La primera tabla del conjunto de datos es una lista de directores denominada director. La siguiente tabla es streaming_platform que es una lista de las plataformas de streaming disponibles. La tercera tabla es streaming_catalogue. Contiene información sobre las películas y está relacionada con las dos primeras tablas a través de director_id y streaming_platform_id. Quiero mostrar todos los directores, sus películas y las plataformas de streaming que están mostrando (o han mostrado) sus películas. La relación entre las tablas es que cada película tiene que tener un director, pero no viceversa. De los ejemplos anteriores, sabes que se espera unir la tabla director con la tabla streaming_catalogue en la columna ID del director. A pesar de no haber películas en el catálogo, Lynne Ramsay y Stanley Kubrick también aparecen en la lista. Pude conseguirlos porque utilicé dos LEFT JOINs. El primero LEFT JOIN no es cuestionable; tuve que utilizarlo por si había directores sin películas. Pero ¿y el segundo LEFT JOIN? En cierto modo me vi obligado a utilizarlo para retener a todos esos directores sin películas y obtener el resultado deseado. ¿Por qué "obligado"? Porque INNER JOIN sólo devuelve las filas coincidentes de las tablas unidas. Si hubiéramos utilizado INNER JOIN para la segunda unión, faltarían Lynne Ramsay y Stanley Kubrick. Pude obtener los directores sin películas con el primer LEFT JOIN, pero un INNER JOIN subsiguiente lo estropearía, ya que filtraría aquellos directores sin coincidencias en la tabla derecha.

Ejemplo 6: LEFT JOIN y la Cláusula WHERE vs. ON

Ahora le mostraré cómo se puede anular el efecto de LEFT JOIN si se utiliza WHERE en la tabla de la derecha. Vuelvo a utilizar el mismo conjunto de datos que en el ejemplo anterior (directores y películas). Digamos que quiero consultarlo y recuperar todos los directores, tengan o no una película en la base de datos. Si se selecciona las columnas necesarias y se aplica un filtro WHERE directamente a una columna de la tabla de la derecha, se obtiene un resultado incorrecto. Obtuve sólo dos directores en lugar de cinco, cuando quería una lista con todos los directores. La razón es que cuando el filtro de WHERE se aplica a los datos de la tabla de la derecha, anula el efecto de LEFT JOIN. Recuerde, si el director no tiene ninguna película en la tabla, entonces los valores de la columna release_year serán NULL. Es el resultado de LEFT JOIN. Entonces, ¿cómo puede listar todos los directores y utilizar el filtro en el año de publicación al mismo tiempo? La condición del año de publicación se convierte ahora en la segunda condición de unión de la cláusula ON. El código siguiente hace exactamente eso para encontrar los directores, sus películas y las fechas de inicio y fin de las proyecciones. Después de seleccionar las columnas necesarias, LEFT JOIN la tabla director con la tabla streaming_catalogue. Utilizo la cláusula WHERE para obtener sólo las películas que finalizaron su proyección antes del 1 de octubre de 2023. El resultado es el siguiente.

Ejemplo 7: Autounión (Self-JOIN) con LEFT JOIN

En todos los ejemplos anteriores, el uso de alias con las tablas en LEFT JOIN no era necesario, pero puede ayudar a acortar los nombres de las tablas y escribir el código un poco más rápido. Veamos cómo funciona esto en un ejemplo en el que quiero recuperar los nombres de todos los empleados y los nombres de sus jefes. Demostraré esto en la tabla llamada employees_managers. Esta es una lista de los empleados. La columna manager_id contiene el ID del empleado que es el gerente del empleado en particular. Hago referencia a la tabla en la cláusula FROM y le doy el alias e. A continuación, hago referencia a la misma tabla en LEFT JOIN y le doy el alias m. De esta forma, he podido unir la tabla consigo misma. No es diferente de unir dos tablas diferentes. Al autounirse, una tabla actúa como dos tablas. La tabla está auto-unida donde el ID del manager de la tabla 'empleado' es igual al ID del empleado de la tabla 'manager'. Ahora que ya tengo las tablas, sólo tengo que seleccionar las columnas necesarias. Como se puede ver, se trata de una lista completa de los empleados y sus gerentes. Deck Trustrie, Garrot Charsley y Priscilla Crocombe no tienen jefes.

Ejemplo 8: Contabilizar Registros a Cero (El Peligro de COUNT(*))

Esta vez, estoy utilizando los datos sobre las empresas y sus productos del Ejemplo 1. Las tablas empresa y producto se LEFT JOINed en el ID de la empresa. Los datos proceden de dos tablas. Necesito LEFT JOIN la tabla department con la tabla employee ya que también quiero departamentos sin empleados. Como he utilizado una función agregada, también necesito agrupar los datos. Para ello utilizo la cláusula GROUP BY. Sin embargo, puedo decirte que una salida con COUNT(*) no es correcta: Huawei y Lenovo deberían haber tenido cero productos. ¡El culpable es COUNT(*)! El asterisco en la función COUNT() significa que cuenta todas las filas, incluyendo NULLs. Cuando las empresas sin productos se LEFT JOINed, tendrán productos NULL. Sin embargo, esto sigue siendo un valor, y COUNT(*) verá cada valor de NULL como un producto. Para solucionar esto, utilice COUNT(expression). En este caso, significa COUNT(product.id). Esto es crucial para contabilizar correctamente las tablas "a cero", es decir, para mostrar la ausencia de registros.

La Importancia de LEFT JOIN en SQL

Puedes ver en los ejemplos anteriores que LEFT JOIN tiene un amplio uso en el trabajo práctico con datos. Se puede utilizar para la recuperación de datos simples donde se necesitan todos los datos de una tabla y sólo los datos coincidentes de otra. Debido a sus características tan específicas, muchas tareas no se pueden hacer de otra forma que no sea aprovechando LEFT JOIN. Además, es necesario practicar todos estos conceptos para que realmente se asimilen. Esto significa practicar tanto LEFT JOIN como otros tipos de JOIN para poder diferenciarlos. Conocer la sintaxis de LEFT JOIN y RIGHT JOIN en SQL es una tarea que deberías empezar a trabajar, ya que son muy importantes para referirte a las bases de datos relacionales. Si tienes una entrevista de trabajo de SQL próximamente, intenta responder a estas 10 preguntas de entrevista de SQL JOIN.

Lea también: Soluciones a problemas comunes con el contabilizador de CFDI

tags: #left #join #contabilizador #tablas #a #cero