Modelado físico relacional de bases de datos

¿Qué es la Cláusula WITH?

La cláusula WITH en SQL se utiliza para definir consultas temporales o subconsultas que se pueden referenciar dentro de una consulta principal. Estas subconsultas se conocen como "Common Table Expressions" (CTE). La cláusula WITH mejora la legibilidad de las consultas y permite reutilizar el resultado de una subconsulta varias veces.

¿Por qué usar la Cláusula WITH?

Se utiliza principalmente para:

  • Simplificar consultas complejas, dividiéndolas en partes más manejables.
  • Mejorar la legibilidad de las consultas al nombrar subconsultas.
  • Reutilizar subconsultas dentro de la misma consulta.

A continuación, veremos cómo usar la cláusula WITH y algunos ejemplos prácticos.


Sintaxis Básica de la Cláusula WITH

La sintaxis básica para usar la cláusula WITH es:

1WITH nombre_cte AS (
2    subconsulta
3)
4SELECT * FROM nombre_cte;
  • nombre_cte es el nombre que le das a la subconsulta.
  • subconsulta es la consulta que deseas realizar y que será utilizada en la consulta principal.

Ejemplo Básico de la Cláusula WITH

Imagina que tienes una tabla de empleados con columnas como id, nombre, departamento y salario. Ahora, queremos encontrar el salario promedio por departamento y luego obtener los empleados cuyo salario es mayor que el promedio de su departamento.

Tabla empleados:

idnombredepartamentosalario
1JuanVentas3000
2AnaMarketing4000
3PedroVentas2500
4MariaMarketing3500
5LuisVentas3200

Consulta con WITH:

1WITH salario_promedio AS (
2    SELECT departamento, AVG(salario) AS promedio
3    FROM empleados
4    GROUP BY departamento
5)
6SELECT e.nombre, e.salario, e.departamento
7FROM empleados e
8JOIN salario_promedio sp ON e.departamento = sp.departamento
9WHERE e.salario > sp.promedio;

Explicación:

  1. salario_promedio es una CTE que calcula el salario promedio por departamento.
  2. Luego, en la consulta principal, se utiliza la CTE salario_promedio para comparar el salario de cada empleado con el promedio de su departamento.

Resultado esperado:

nombresalariodepartamento
Juan3000Ventas
Luis3200Ventas
Ana4000Marketing

Cláusula WITH con Múltiples CTEs

También puedes usar la cláusula WITH para definir varias CTEs dentro de la misma consulta. Esto puede ser útil cuando necesitas realizar múltiples subconsultas interrelacionadas.

Sintaxis:

1WITH cte1 AS (
2    subconsulta1
3),
4cte2 AS (
5    subconsulta2
6)
7SELECT * FROM cte1
8JOIN cte2 ON cte1.columna = cte2.columna;

Ejemplo: Supongamos que tienes las tablas productos y ventas, y quieres calcular el total de ventas por producto y luego obtener los productos con ventas superiores a un valor específico.

Tablas productos y ventas:

id_productonombre_productoprecio
1Laptop1000
2Smartphone500
id_ventaid_productocantidad
115
2210

Consulta con múltiples CTEs:

1WITH total_ventas AS (
2    SELECT id_producto, SUM(cantidad) AS total_vendido
3    FROM ventas
4    GROUP BY id_producto
5),
6productos_con_ventas AS (
7    SELECT p.id_producto, p.nombre_producto, p.precio, tv.total_vendido
8    FROM productos p
9    JOIN total_ventas tv ON p.id_producto = tv.id_producto
10)
11SELECT nombre_producto, total_vendido, precio
12FROM productos_con_ventas
13WHERE total_vendido > 8;

Explicación:

  1. total_ventas es una CTE que calcula el total de productos vendidos por cada id_producto.
  2. productos_con_ventas es otra CTE que une los datos de productos con el total de ventas calculado en la CTE anterior.
  3. Finalmente, la consulta principal filtra los productos que se han vendido más de 8 veces.

Resultado esperado:

nombre_productototal_vendidoprecio
Smartphone10500

Ventajas de Usar la Cláusula WITH

  • Mejor Legibilidad: Las consultas complejas se pueden dividir en partes más fáciles de entender.
  • Reutilización de Subconsultas: Puedes reutilizar el resultado de una subconsulta varias veces sin necesidad de repetir la misma lógica.
  • Simplicidad en Consultas Anidadas: Las CTEs simplifican las consultas anidadas al hacer que el código sea más limpio y organizado.

Consideraciones Importantes

  • Las CTEs son temporales y solo existen durante la ejecución de la consulta. Una vez que la consulta ha terminado, las CTEs desaparecen.
  • Algunas bases de datos pueden tener limitaciones sobre el uso de CTEs recursivas, que se utilizan para realizar consultas sobre datos jerárquicos (como árboles de empleados o categorías de productos).
  • Loading...