Subqueries en FROM y SELECT

Clase 6 de 26Curso de Gestión de Bases de Datos con SQL Server

Resumen

Dominar las subqueries no se limita a usarlas como filtro en el WHERE. Cuando aprendes a colocarlas en el FROM y en el SELECT, tus consultas ganan versatilidad y potencia. La misma sintaxis —una query encerrada entre paréntesis— se comporta de manera radicalmente distinta según la posición que ocupe, y entender esas diferencias marca la distancia entre escribir consultas básicas y resolver preguntas de negocio complejas con eficiencia.

¿Cómo funciona una subquery en el FROM como tabla virtual?

Cuando colocas una subquery dentro del FROM, el motor de base de datos la ejecuta primero y devuelve una tabla virtual [01:25]. Esa tabla temporal recibe un alias obligatorio y se convierte en el origen de datos de la query principal.

Por ejemplo, para obtener los tres países con el ticket promedio más alto, la subquery calcula el ticket promedio por país y lo entrega como una tabla llamada resumen. Luego, la query principal simplemente pide el TOP 3 ordenado por ticket promedio [02:18].

  • La subquery genera columnas como código país, nombre país y ticket promedio.
  • El alias (resumen) es obligatorio; sin él, SQL Server devuelve error.
  • La query principal consulta esa tabla derivada como si fuera una tabla real.

¿Qué es una tabla derivada y cuándo usarla?

Cuando el cálculo dentro del FROM se vuelve más complejo —por ejemplo, incluye COUNT(DISTINCT ...), divisiones entre agregaciones o múltiples INNER JOIN— el resultado se conoce como tabla derivada [03:30]. En el ejemplo de la clase, una subquery llamada estadisticas calcula clientes activos, ventas totales y ventas por cliente por país, todo en un solo bloque. La query externa luego pide el TOP 5 ordenado por ventas por cliente [04:25].

El flujo siempre es el mismo: primero se ejecuta la subquery interna, se materializa como tabla, y después la consulta principal opera sobre ese resultado.

¿Qué ocurre al colocar una subquery en el SELECT?

A diferencia del FROM, una subquery en el SELECT devuelve un valor calculado fila por fila [05:15]. Esto la convierte en lo que se denomina subquery escalar: debe retornar exactamente una columna y una fila.

El caso práctico consiste en mostrar cada país con su porcentaje sobre las ventas globales. La subquery calcula la suma total de pedidos a nivel global, y ese valor único se usa como divisor para cada fila del resultado principal [05:50].

sql SELECT nombre_pais, SUM(total) AS ventas_pais, SUM(total) * 100.0 / (SELECT SUM(total) FROM pedidos) AS porcentaje_total FROM pedidos GROUP BY nombre_pais

  • Cada fila ejecuta la subquery internamente para obtener el denominador.
  • Con pocas filas el rendimiento es aceptable, pero con miles de registros puede volverse costosa [06:55].
  • Es más poderosa que una planilla de cálculo, aunque requiere atención al impacto en rendimiento.

¿Cómo mejoran las variables declaradas el rendimiento de subqueries escalares?

Para evitar que la subquery escalar se ejecute repetidamente, SQL Server permite declarar variables con DECLARE y almacenar el resultado en memoria [07:30]. El valor se calcula una sola vez y luego se invoca dentro de la fórmula.

sql DECLARE @total_global DECIMAL(18,2) SELECT @total_global = SUM(total) FROM pedidos

SELECT nombre_pais, SUM(total) AS ventas_pais, SUM(total) * 100.0 / @total_global AS porcentaje FROM pedidos GROUP BY nombre_pais

  • La variable @total_global queda en memoria y no se recalcula por cada fila [08:10].
  • El resultado es idéntico, pero la ejecución es más rápida y legible.
  • Es una práctica recomendada cuando el valor escalar no cambia entre filas.

¿Cuál es el propósito de cada posición de subquery?

Las tres posiciones forman un triángulo completo de posibilidades [09:05]:

  • WHERE: filtro dinámico que condiciona qué filas se incluyen.
  • FROM: tabla derivada que permite procesar datos en dos etapas.
  • SELECT: valor escalar calculado por cada fila del resultado.

Cada posición resuelve un tipo de pregunta distinto. Saber cuándo usar cada una es lo que convierte una consulta funcional en una consulta profesional. En la próxima sesión se abordan los CTE (Common Table Expressions), considerados la forma más profesional de estructurar consultas complejas con múltiples subqueries.

El desafío consiste en calcular el porcentaje de ventas de cada categoría de producto usando una subquery escalar en el SELECT y luego reescribir esa misma consulta con DECLARE. ¿Cuál te resulta más legible y cuál más eficiente? Comparte ambas versiones en los comentarios.