Las subconsultas, también conocidas como consultas anidadas, son consultas SQL que se incluyen dentro de otra consulta SQL. Las subconsultas pueden ser muy útiles para realizar operaciones complejas y obtener resultados específicos que no se pueden lograr fácilmente con una sola consulta.
Conceptos Clave
- Definición de Subconsulta: Una subconsulta es una consulta dentro de otra consulta. Se puede utilizar en varias partes de una consulta principal, como en la cláusula
SELECT
,FROM
,WHERE
,HAVING
, etc. - Tipos de Subconsultas:
- Subconsultas Escalares: Devuelven un solo valor.
- Subconsultas de Filas: Devuelven una sola fila con múltiples columnas.
- Subconsultas de Tabla: Devuelven múltiples filas y columnas.
- Ubicación de Subconsultas:
- En la cláusula
SELECT
: Para calcular valores en la lista de selección. - En la cláusula
FROM
: Para tratar la subconsulta como una tabla derivada. - En la cláusula
WHERE
: Para filtrar resultados basados en los resultados de la subconsulta. - En la cláusula
HAVING
: Para filtrar grupos de resultados.
- En la cláusula
Ejemplos Prácticos
Subconsulta en la Cláusula WHERE
Supongamos que tenemos dos tablas: employees
y departments
.
CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100), department_id INT, salary NUMERIC ); CREATE TABLE departments ( id SERIAL PRIMARY KEY, name VARCHAR(100) ); INSERT INTO departments (name) VALUES ('HR'), ('Engineering'), ('Sales'); INSERT INTO employees (name, department_id, salary) VALUES ('Alice', 1, 50000), ('Bob', 2, 60000), ('Charlie', 2, 70000), ('David', 3, 55000);
Queremos encontrar los empleados que trabajan en el departamento de 'Engineering'.
SELECT name FROM employees WHERE department_id = (SELECT id FROM departments WHERE name = 'Engineering');
Explicación:
- La subconsulta
(SELECT id FROM departments WHERE name = 'Engineering')
devuelve elid
del departamento de 'Engineering'. - La consulta principal selecciona los nombres de los empleados cuyo
department_id
coincide con elid
devuelto por la subconsulta.
Subconsulta en la Cláusula SELECT
Queremos obtener el nombre de cada empleado junto con el nombre de su departamento.
SELECT name, (SELECT name FROM departments WHERE id = employees.department_id) AS department_name FROM employees;
Explicación:
- La subconsulta
(SELECT name FROM departments WHERE id = employees.department_id)
devuelve el nombre del departamento correspondiente aldepartment_id
de cada empleado. - La consulta principal selecciona el nombre del empleado y el nombre del departamento devuelto por la subconsulta.
Subconsulta en la Cláusula FROM
Queremos encontrar el salario promedio de los empleados en cada departamento.
SELECT department_name, AVG(salary) AS average_salary FROM ( SELECT d.name AS department_name, e.salary FROM employees e JOIN departments d ON e.department_id = d.id ) AS dept_salaries GROUP BY department_name;
Explicación:
- La subconsulta
SELECT d.name AS department_name, e.salary FROM employees e JOIN departments d ON e.department_id = d.id
crea una tabla derivada con los nombres de los departamentos y los salarios de los empleados. - La consulta principal calcula el salario promedio agrupado por el nombre del departamento.
Ejercicio Práctico
Ejercicio 1: Subconsulta en WHERE
Encuentra los nombres de los empleados que tienen un salario mayor que el salario promedio de todos los empleados.
Ejercicio 2: Subconsulta en SELECT
Lista los nombres de los empleados junto con el nombre de su departamento y el salario promedio de su departamento.
SELECT name, (SELECT name FROM departments WHERE id = employees.department_id) AS department_name, (SELECT AVG(salary) FROM employees e WHERE e.department_id = employees.department_id) AS avg_department_salary FROM employees;
Resumen
Las subconsultas son una herramienta poderosa en SQL que permiten realizar consultas complejas y obtener resultados específicos. Pueden ser utilizadas en varias partes de una consulta principal y pueden devolver diferentes tipos de resultados, como valores escalares, filas o tablas completas. Practicar con subconsultas te ayudará a dominar su uso y a escribir consultas SQL más eficientes y efectivas.
Curso de PostgreSQL
Módulo 1: Introducción a PostgreSQL
Módulo 2: Operaciones Básicas de SQL
- Creando Bases de Datos y Tablas
- Insertando Datos
- Consultando Datos
- Actualizando Datos
- Eliminando Datos
Módulo 3: Consultas Avanzadas de SQL
Módulo 4: Diseño de Bases de Datos y Normalización
Módulo 5: Características Avanzadas de PostgreSQL
Módulo 6: Ajuste de Rendimiento y Optimización
- Optimización de Consultas
- Estrategias de Indexación
- Análisis del Rendimiento de Consultas
- Vacuuming y Mantenimiento
Módulo 7: Seguridad y Gestión de Usuarios
Módulo 8: Trabajando con JSON y Características NoSQL
Módulo 9: Extensiones y Herramientas Avanzadas
- PostGIS para Datos Geoespaciales
- Búsqueda de Texto Completo
- Wrappers de Datos Externos
- PL/pgSQL y Otros Lenguajes Procedurales