SQL Subqueries: Exploración de tipos y aplicaciones prácticas

Las subconsultas, o subqueries, son una característica esencial de SQL que permite realizar consultas más avanzadas y específicas. Comprender cómo aplicar subqueries de manera efectiva amplía las posibilidades de tus consultas SQL, mejorando la capacidad para extraer información específica y realizar análisis más detallados en bases de datos relacionales.

Vamos a explorar en detalle los tipos de subqueries y profundizar en cómo se pueden aplicar en casos de uso comunes para mejorar la eficacia de tus consultas SQL.

¿Qué son las Subqueries en SQL?

En SQL, una subquery es una consulta anidada dentro de otra consulta principal. Este recurso permite realizar operaciones más complejas y obtener resultados más específicos al integrar consultas dentro de otras, brindando una flexibilidad adicional en la manipulación de datos.

Tipos de Subqueries

Subqueries Escalares (Scalar Subqueries)

Devuelven un solo valor que se puede utilizar en la consulta principal.

Ejemplo Práctico: Obtener la fecha del último pedido:

SELECT CustomerName, OrderDate
FROM Customers
WHERE OrderDate = (SELECT MAX(OrderDate) FROM Orders WHERE CustomerID = Customers.CustomerID);

En este caso, la subquery devuelve la fecha máxima del pedido para cada cliente, permitiendo seleccionar solo aquellos pedidos que coinciden con la fecha máxima.

Subqueries de Tabla (Table Subqueries):

Devuelven un conjunto de filas que se pueden tratar como una tabla temporal dentro de la consulta principal.

Ejemplo Práctico: Encontrar clientes que han realizado más de un pedido:

SELECT CustomerID, CustomerName
FROM Customers
WHERE CustomerID IN (SELECT CustomerID FROM Orders 
                   GROUP BY CustomerID HAVING COUNT(OrderID) > 1);

En este ejemplo, la subquery devuelve los CustomerID de clientes que han realizado más de un pedido, permitiendo seleccionar solo aquellos clientes que cumplen con este criterio.

Subqueries Correlativas (Correlated Subqueries):

Hacen referencia a las columnas de la consulta principal, permitiendo comparaciones y operaciones más complejas.

Ejemplo Práctico: Obtener empleados con salarios superiores al promedio de su departamento:

SELECT EmployeeName, Salary, DepartmentID
FROM Employees e
WHERE Salary > (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = e.DepartmentID);

En este caso, la subquery está correlacionada con la consulta principal mediante el identificador de departamento, permitiendo comparaciones específicas para cada departamento.

Usos Comunes de Subqueries:

Filtrado de Resultados

Utilizar subqueries en la cláusula WHERE para filtrar resultados basados en condiciones específicas.

Ejemplo Práctico: Encontrar productos con existencias bajas:

SELECT ProductName, UnitsInStock
FROM Products
WHERE UnitsInStock < (SELECT MIN(ReorderLevel) FROM Products);

En este caso, la subquery filtra los productos que tienen existencias por debajo del nivel mínimo de reorden.

Comparaciones Complejas

Realizar comparaciones avanzadas utilizando los resultados de una subquery.

Ejemplo Práctico: Encontrar clientes que han realizado pedidos en más de una categoría de productos

SELECT CustomerID, CustomerName FROM Customers 
                                WHERE CustomerID IN (SELECT CustomerID FROM OrderDetails 
                                                 INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID GROUP BY CustomerID HAVING COUNT(DISTINCT CategoryID) > 1);

En este ejemplo, la subquery busca clientes que han realizado pedidos en más de una categoría de productos.

Operaciones de Agregación

Obtener resultados agregados o estadísticas específicas utilizando subqueries.

Ejemplo Práctico: Encontrar empleados con salarios superiores al promedio global de la empresa:

SELECT EmployeeName, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);

Esta subquery compara el salario de cada empleado con el salario promedio global de la empresa.