Subconsultas PostgreSQL
Las subconsultas en PostgreSQL son consultas anidadas que se utilizan dentro de una consulta principal para realizar filtrados o cálculos complejos. Te permiten aislar partes de consultas SQL y utilizar resultados intermedios para formular la salida final de la consulta.
Utilización
Las subconsultas se suelen utilizar en las sentencias SELECT, INSERT, UPDATE, o DELETE para descomponer operaciones SQL complejas en componentes más sencillos y manejables. Van entre paréntesis y pueden devolver un único valor o un conjunto de valores que utilizará la consulta principal.
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (SELECT column FROM table WHERE condition);
En esta sintaxis, la subconsulta se utiliza dentro de una cláusula WHERE para filtrar los resultados en función de la salida de la consulta anidada.
Ejemplos
1. Subconsulta básica en la cláusula WHERE
SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > '2023-01-01');
Este ejemplo recupera los clientes que han realizado pedidos después del 1 de enero de 2023, utilizando una subconsulta dentro de la cláusula WHERE.
2. Subconsulta en la sentencia SELECT
SELECT product_id,
(SELECT AVG(price) FROM products) AS average_price
FROM products;
Aquí, una subconsulta calcula el precio medio de todos los productos y lo presenta junto al ID de cada producto.
3. Utilizar la subconsulta con EXISTS
SELECT supplier_id, supplier_name
FROM suppliers
WHERE EXISTS (SELECT * FROM products WHERE suppliers.supplier_id = products.supplier_id AND products.stock > 0);
Este ejemplo busca proveedores con productos en stock utilizando una condición EXISTS para filtrar los resultados.
4. Subconsulta en la sentencia INSERT
INSERT INTO sales_summary (product_id, total_sales)
SELECT product_id, SUM(sales_amount)
FROM sales
WHERE sale_date > '2023-01-01'
GROUP BY product_id;
Este ejemplo utiliza una subconsulta para agregar datos de ventas e insertar los resultados en una tabla resumen.
5. Subconsulta en la sentencia UPDATE
UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');
Aquí, la subconsulta encuentra el ID de categoría de "Electrónica", y la consulta principal actualiza los precios de esos productos.
6. Subconsulta en la sentencia DELETE
DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_items WHERE quantity = 0);
Este ejemplo elimina los pedidos que no tienen artículos, según lo determinado por una subconsulta.
7. Ejemplo de subconsulta correlacionada
SELECT employee_id, employee_name
FROM employees e
WHERE EXISTS (SELECT 1 FROM sales s WHERE s.employee_id = e.employee_id AND s.amount > 1000);
Una subconsulta correlacionada hace referencia a columnas de la consulta externa, aquí busca empleados con ventas superiores a 1000 $.
Consejos y buenas prácticas
- Optimiza el rendimiento. Utiliza las subconsultas con prudencia; considera indexar las columnas relevantes o reestructurar las consultas para minimizar el tiempo de ejecución.
- Utiliza subconsultas para modular. Divide las consultas complejas en subconsultas para facilitar su gestión y legibilidad.
- Aprovecha con cuidado las subconsultas correlacionadas. Las subconsultas correlacionadas son potentes, pero pueden afectar al rendimiento, ya que se ejecutan una vez por fila en la consulta externa.
- Considera la posibilidad de utilizar
EXISTSpara las comprobaciones de existencia. A menudo es más eficaz que comparar los resultados de las subconsultas con operadores comoIN.