Las subconsultas, también conocidas como consultas anidadas, son consultas dentro de otras consultas. Son una herramienta poderosa en SQL que permite realizar consultas complejas y obtener resultados específicos. En este tema, aprenderemos cómo usar subconsultas en las cláusulas SELECT, FROM y WHERE.

Subconsultas en la cláusula SELECT

Las subconsultas en la cláusula SELECT se utilizan para calcular valores que se mostrarán en el resultado final. Estas subconsultas deben devolver un solo valor (escalar).

Ejemplo:

Supongamos que tenemos dos tablas: empleados y departamentos.

Tabla empleados: | id_empleado | nombre | salario | id_departamento | |-------------|----------|---------|-----------------| | 1 | Juan | 5000 | 1 | | 2 | Ana | 6000 | 2 | | 3 | Pedro | 5500 | 1 | | 4 | María | 7000 | 3 |

Tabla departamentos: | id_departamento | nombre_departamento | |-----------------|---------------------| | 1 | Ventas | | 2 | Marketing | | 3 | IT |

Queremos obtener el nombre de cada empleado junto con el nombre de su departamento.

SELECT 
    nombre,
    (SELECT nombre_departamento 
     FROM departamentos 
     WHERE departamentos.id_departamento = empleados.id_departamento) AS nombre_departamento
FROM 
    empleados;

Explicación:

  • La subconsulta (SELECT nombre_departamento FROM departamentos WHERE departamentos.id_departamento = empleados.id_departamento) se ejecuta para cada fila de la tabla empleados.
  • Devuelve el nombre_departamento correspondiente al id_departamento del empleado actual.

Subconsultas en la cláusula FROM

Las subconsultas en la cláusula FROM se utilizan para crear una tabla temporal que puede ser referenciada en la consulta principal. Esto es útil para simplificar consultas complejas.

Ejemplo:

Queremos obtener el salario promedio de cada departamento y listar los empleados cuyo salario es mayor que el promedio de su departamento.

SELECT 
    e.nombre,
    e.salario,
    d.salario_promedio
FROM 
    empleados e
JOIN 
    (SELECT 
         id_departamento, 
         AVG(salario) AS salario_promedio 
     FROM 
         empleados 
     GROUP BY 
         id_departamento) d
ON 
    e.id_departamento = d.id_departamento
WHERE 
    e.salario > d.salario_promedio;

Explicación:

  • La subconsulta (SELECT id_departamento, AVG(salario) AS salario_promedio FROM empleados GROUP BY id_departamento) calcula el salario promedio por departamento.
  • Esta subconsulta se utiliza como una tabla temporal d en la cláusula FROM.
  • La consulta principal une la tabla empleados con la tabla temporal d y filtra los empleados cuyo salario es mayor que el promedio de su departamento.

Subconsultas en la cláusula WHERE

Las subconsultas en la cláusula WHERE se utilizan para filtrar filas basadas en los resultados de otra consulta. Estas subconsultas pueden devolver un solo valor o un conjunto de valores.

Ejemplo:

Queremos listar los empleados que trabajan en el departamento con el salario promedio más alto.

SELECT 
    nombre
FROM 
    empleados
WHERE 
    id_departamento = (
        SELECT 
            id_departamento
        FROM 
            empleados
        GROUP BY 
            id_departamento
        ORDER BY 
            AVG(salario) DESC
        LIMIT 1
    );

Explicación:

  • La subconsulta (SELECT id_departamento FROM empleados GROUP BY id_departamento ORDER BY AVG(salario) DESC LIMIT 1) encuentra el id_departamento con el salario promedio más alto.
  • La consulta principal filtra los empleados que pertenecen a ese departamento.

Ejercicios Prácticos

Ejercicio 1:

Lista los nombres de los empleados cuyo salario es mayor que el salario promedio de todos los empleados.

SELECT 
    nombre
FROM 
    empleados
WHERE 
    salario > (SELECT AVG(salario) FROM empleados);

Ejercicio 2:

Encuentra los nombres de los empleados que trabajan en departamentos donde el salario promedio es mayor que 6000.

SELECT 
    nombre
FROM 
    empleados
WHERE 
    id_departamento IN (
        SELECT 
            id_departamento
        FROM 
            empleados
        GROUP BY 
            id_departamento
        HAVING 
            AVG(salario) > 6000
    );

Ejercicio 3:

Lista los nombres de los empleados y el nombre de su departamento, pero solo para aquellos empleados cuyo salario es mayor que el salario promedio de su departamento.

SELECT 
    e.nombre,
    (SELECT nombre_departamento 
     FROM departamentos 
     WHERE departamentos.id_departamento = e.id_departamento) AS nombre_departamento
FROM 
    empleados e
WHERE 
    e.salario > (
        SELECT 
            AVG(salario)
        FROM 
            empleados
        WHERE 
            id_departamento = e.id_departamento
    );

Conclusión

Las subconsultas son una herramienta poderosa en SQL que permiten realizar consultas complejas y obtener resultados específicos. En este tema, hemos aprendido cómo usar subconsultas en las cláusulas SELECT, FROM y WHERE. Practicar con estos ejemplos y ejercicios te ayudará a dominar el uso de subconsultas en tus propias consultas SQL.

Curso de SQL

Módulo 1: Introducción a SQL

Módulo 2: Consultas básicas de SQL

Módulo 3: Trabajando con múltiples tablas

Módulo 4: Filtrado avanzado de datos

Módulo 5: Manipulación de datos

Módulo 6: Funciones avanzadas de SQL

Módulo 7: Subconsultas y consultas anidadas

Módulo 8: Índices y optimización de rendimiento

Módulo 9: Transacciones y concurrencia

Módulo 10: Temas avanzados

Módulo 11: SQL en la práctica

Módulo 12: Proyecto final

© Copyright 2024. Todos los derechos reservados