Skip to content

Ejercicios - Gestión de Empleados

Modelo Relacional

erDiagram

    DEPARTAMENTO ||--o{ EMPLEADO : tiene

    DEPARTAMENTO {
        int id PK
        varchar(100) nombre
        double presupuesto
        double gastos
    }

    EMPLEADO {
        int id PK
        varchar(9) nif
        varchar(100) nombre
        varchar(100) apellido1
        varchar(100) apellido2
        int id_departamento FK
    }

Creación de la bases de datos, tablas e inserts de datos

sql
DROP DATABASE IF EXISTS empleados;
CREATE DATABASE empleados CHARACTER SET utf8mb4;
USE empleados;

CREATE TABLE departamento (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  presupuesto DOUBLE UNSIGNED NOT NULL,
  gastos DOUBLE UNSIGNED NOT NULL
);

CREATE TABLE empleado (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nif VARCHAR(9) NOT NULL UNIQUE,
  nombre VARCHAR(100) NOT NULL,
  apellido1 VARCHAR(100) NOT NULL,
  apellido2 VARCHAR(100),
  id_departamento INT UNSIGNED,
  FOREIGN KEY (id_departamento) REFERENCES departamento(id)
);

INSERT INTO departamento VALUES(1, 'Desarrollo', 120000, 6000);
INSERT INTO departamento VALUES(2, 'Sistemas', 150000, 21000);
INSERT INTO departamento VALUES(3, 'Recursos Humanos', 280000, 25000);
INSERT INTO departamento VALUES(4, 'Contabilidad', 110000, 3000);
INSERT INTO departamento VALUES(5, 'I+D', 375000, 380000);
INSERT INTO departamento VALUES(6, 'Proyectos', 0, 0);
INSERT INTO departamento VALUES(7, 'Publicidad', 0, 1000);

INSERT INTO empleado VALUES(1, '32481596F', 'Aarón', 'Rivero', 'Gómez', 1);
INSERT INTO empleado VALUES(2, 'Y5575632D', 'Adela', 'Salas', 'Díaz', 2);
INSERT INTO empleado VALUES(3, 'R6970642B', 'Adolfo', 'Rubio', 'Flores', 3);
INSERT INTO empleado VALUES(4, '77705545E', 'Adrián', 'Suárez', NULL, 4);
INSERT INTO empleado VALUES(5, '17087203C', 'Marcos', 'Loyola', 'Méndez', 5);
INSERT INTO empleado VALUES(6, '38382980M', 'María', 'Santana', 'Moreno', 1);
INSERT INTO empleado VALUES(7, '80576669X', 'Pilar', 'Ruiz', NULL, 2);
INSERT INTO empleado VALUES(8, '71651431Z', 'Pepe', 'Ruiz', 'Santana', 3);
INSERT INTO empleado VALUES(9, '56399183D', 'Juan', 'Gómez', 'López', 2);
INSERT INTO empleado VALUES(10, '46384486H', 'Diego','Flores', 'Salas', 5);
INSERT INTO empleado VALUES(11, '67389283A', 'Marta','Herrera', 'Gil', 1);
INSERT INTO empleado VALUES(12, '41234836R', 'Irene','Salas', 'Flores', NULL);
INSERT INTO empleado VALUES(13, '82635162B', 'Juan Antonio','Sáez', 'Guerrero', NULL);

Consultas sobre una tabla

  1. Lista el primer apellido de todos los empleados.

    Mostrar solución
    sql
    SELECT apellido1
    FROM empleado;
  2. Lista el primer apellido de los empleados eliminando los apellidos que estén repetidos.

    Mostrar solución
    sql
    SELECT DISTINCT apellido1
    FROM empleado;
  3. Lista todas las columnas de la tabla empleado.

    Mostrar solución
    sql
    SELECT *
    FROM empleado;
  4. Lista el nombre y los apellidos de todos los empleados.

    Mostrar solución
    sql
    SELECT nombre, apellido1, apellido2
    FROM empleado;
  5. Lista el código de los departamentos de los empleados que aparecen en la tabla empleado.

    Mostrar solución
    sql
    SELECT id_departamento
    FROM empleado;
  6. Lista el código de los departamentos de los empleados que aparecen en la tabla empleado, eliminando los códigos que aparecen repetidos.

    Mostrar solución
    sql
    SELECT DISTINCT id_departamento
    FROM empleado;
  7. Lista el nombre y apellidos de los empleados en una única columna.

    Mostrar solución
    sql
    SELECT CONCAT(nombre, ' ', apellido1, ' ', IFNULL(apellido2, '')) AS 'Nombre Completo'
    FROM empleado;
  8. Lista el nombre y apellidos de los empleados en una única columna, convirtiendo todos los caracteres en mayúscula.

    Mostrar solución
    sql
    SELECT UPPER(CONCAT(nombre, ' ', apellido1, ' ', IFNULL(apellido2, ''))) AS 'Nombre Completo'
    FROM empleado;
  9. Lista el nombre y apellidos de los empleados en una única columna, convirtiendo todos los caracteres en minúscula.

    Mostrar solución
    sql
    SELECT LOWER(CONCAT(nombre, ' ', apellido1, ' ', IFNULL(apellido2, ''))) AS 'Nombre Completo'
    FROM empleado;
  10. Lista el código de los empleados junto al nif, pero el nif deberá aparecer en dos columnas, una mostrará únicamente los dígitos del nif y la otra la letra.

    Mostrar solución
    sql
    SELECT e.id, LEFT(e.nif, 8) AS 'Dígitos', RIGHT(e.nif, 1) AS 'Letra'
    FROM empleado e;
  11. Lista el nombre de cada departamento y el valor del presupuesto actual del que dispone. Para calcular este dato tendrá que restar al valor del presupuesto inicial (columna presupuesto) los gastos que se han generado (columna gastos). Tenga en cuenta que en algunos casos pueden existir valores negativos. Utilice un alias apropiado para la nueva columna columna que está calculando.

    Mostrar solución
    sql
    SELECT d.nombre, (d.presupuesto - d.gastos) AS 'Presupuesto actual'
    FROM departamento d;
  12. Lista el nombre de los departamentos y el valor del presupuesto actual ordenado de forma ascendente.

    Mostrar solución
    sql
    SELECT d.nombre, (d.presupuesto - d.gastos) AS 'Presupuesto'
    FROM departamento d
    ORDER BY Presupuesto ASC;
  13. Lista el nombre de todos los departamentos ordenados de forma ascendente.

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    ORDER BY 1 ASC;
  14. Lista el nombre de todos los departamentos ordenados de forma descendente.

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    ORDER BY 1 DESC;
  15. Lista los apellidos y el nombre de todos los empleados, ordenados de forma alfabética tendiendo en cuenta en primer lugar sus apellidos y luego su nombre.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2
    FROM empleado e
    ORDER BY 2 ASC, 3 ASC, 1 ASC;
  16. Devuelve una lista con el nombre y el presupuesto, de los 3 departamentos que tienen mayor presupuesto.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    ORDER BY 2 DESC
    LIMIT 3;
  17. Devuelve una lista con el nombre y el presupuesto, de los 3 departamentos que tienen menor presupuesto.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    ORDER BY 2 ASC
    LIMIT 3;
  18. Devuelve una lista con el nombre y el gasto, de los 2 departamentos que tienen mayor gasto.

    Mostrar solución
    sql
    SELECT d.nombre, d.gastos
    FROM departamento d
    ORDER BY 2 DESC
    LIMIT 2;
  19. Devuelve una lista con el nombre y el gasto, de los 2 departamentos que tienen menor gasto.

    Mostrar solución
    sql
    SELECT d.nombre, d.gastos
    FROM departamento d
    ORDER BY 2 ASC
    LIMIT 2;
  20. Devuelve una lista con 5 filas a partir de la tercera fila de la tabla empleado. La tercera fila se debe incluir en la respuesta. La respuesta debe incluir todas las columnas de la tabla empleado.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e
    LIMIT 2, 5;
  21. Devuelve una lista con el nombre de los departamentos y el presupuesto, de aquellos que tienen un presupuesto mayor o igual a 150000 euros.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto >= 150000;
  22. Devuelve una lista con el nombre de los departamentos y el gasto, de aquellos que tienen menos de 5000 euros de gastos.

    Mostrar solución
    sql
    SELECT d.nombre, d.gastos
    FROM departamento d
    WHERE d.gastos < 5000;
  23. Devuelve una lista con el nombre de los departamentos y el presupuesto, de aquellos que tienen un presupuesto entre 100000 y 200000 euros. Sin utilizar el operador BETWEEN.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto >= 100000 AND d.presupuesto <= 200000;
  24. Devuelve una lista con el nombre de los departamentos que no tienen un presupuesto entre 100000 y 200000 euros. Sin utilizar el operador BETWEEN.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto < 100000 OR d.presupuesto > 200000;
  25. Devuelve una lista con el nombre de los departamentos que tienen un presupuesto entre 100000 y 200000 euros. Utilizando el operador BETWEEN.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto BETWEEN 100000 AND 200000;
  26. Devuelve una lista con el nombre de los departamentos que no tienen un presupuesto entre 100000 y 200000 euros. Utilizando el operador BETWEEN.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto NOT BETWEEN 100000 AND 200000;
  27. Devuelve una lista con el nombre de los departamentos, gastos y presupuesto, de aquellos departamentos donde los gastos sean mayores que el presupuesto del que disponen.

    Mostrar solución
    sql
    SELECT d.nombre, d.gastos, d.presupuesto
    FROM departamento d
    WHERE d.gastos > d.presupuesto;
  28. Devuelve una lista con el nombre de los departamentos, gastos y presupuesto, de aquellos departamentos donde los gastos sean menores que el presupuesto del que disponen.

    Mostrar solución
    sql
    SELECT d.nombre, d.gastos, d.presupuesto
    FROM departamento d
    WHERE d.gastos < d.presupuesto;
  29. Devuelve una lista con el nombre de los departamentos, gastos y presupuesto, de aquellos departamentos donde los gastos sean iguales al presupuesto del que disponen.

    Mostrar solución
    sql
    SELECT d.nombre, d.gastos, d.presupuesto
    FROM departamento d
    WHERE d.gastos = d.presupuesto;
  30. Lista todos los datos de los empleados cuyo segundo apellido sea NULL.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e
    WHERE e.apellido2 IS NULL;
  31. Lista todos los datos de los empleados cuyo segundo apellido no sea NULL.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e
    WHERE e.apellido2 IS NOT NULL;
  32. Lista todos los datos de los empleados cuyo segundo apellido sea López.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e
    WHERE e.apellido2 = 'López';
  33. Lista todos los datos de los empleados cuyo segundo apellido sea Díaz o Moreno. Sin utilizar el operador IN.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e
    WHERE e.apellido2 = 'Díaz' OR e.apellido2 = 'Moreno';
  34. Lista todos los datos de los empleados cuyo segundo apellido sea Díaz o Moreno. Utilizando el operador IN.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e
    WHERE e.apellido2 IN ('Díaz', 'Moreno');
  35. Lista los nombres, apellidos y nif de los empleados que trabajan en el departamento 3.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif
    FROM empleado e
    WHERE e.id_departamento = 3;
  36. Lista los nombres, apellidos y nif de los empleados que trabajan en los departamentos 2, 4 o 5.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif
    FROM empleado e
    WHERE e.id_departamento IN (2, 4, 5);

Consultas multitabla (Composición interna)

  1. Devuelve un listado con los empleados y los datos de los departamentos donde trabaja cada uno.

    Mostrar solución
    sql
    SELECT *
    FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id;
  2. Devuelve un listado con los empleados y los datos de los departamentos donde trabaja cada uno. Ordena el resultado, en primer lugar por el nombre del departamento (en orden alfabético) y en segundo lugar por los apellidos y el nombre de los empleados.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif, d.nombre, d.presupuesto, d.gastos
    FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id
    ORDER BY d.nombre ASC, e.apellido1 ASC, e.apellido2 ASC, e.nombre ASC;
  3. Devuelve un listado con el código y el nombre del departamento, solamente de aquellos departamentos que tienen empleados.

    Mostrar solución
    sql
    SELECT DISTINCT d.id, d.nombre
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento;
  4. Devuelve un listado con el código, el nombre del departamento y el valor del presupuesto actual del que dispone, solamente de aquellos departamentos que tienen empleados. El valor del presupuesto actual lo puede calcular restando al valor del presupuesto inicial (columna presupuesto) el valor de los gastos que ha generado (columna gastos).

    Mostrar solución
    sql
    SELECT DISTINCT d.id, d.nombre, (d.presupuesto - d.gastos) AS Presupuesto
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento;
  5. Devuelve el nombre del departamento donde trabaja el empleado que tiene el nif 38382980M.

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento
    WHERE e.nif = '38382980M';
  6. Devuelve el nombre del departamento donde trabaja el empleado Pepe Ruiz Santana.

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento
    WHERE e.nombre = 'Pepe' AND e.apellido1 = 'Ruiz' AND e.apellido2 = 'Santana';
  7. Devuelve un listado con los datos de los empleados que trabajan en el departamento de I+D. Ordena el resultado alfabéticamente.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento
    WHERE d.nombre = 'I+D';
  8. Devuelve un listado con los datos de los empleados que trabajan en el departamento de Sistemas, Contabilidad o I+D. Ordena el resultado alfabéticamente.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento
    WHERE d.nombre IN ('Sistemas', 'Contabilidad', 'I+D')
    ORDER BY 2 ASC, 3 ASC, 1 ASC;
  9. Devuelve una lista con el nombre de los empleados que tienen los departamentos que no tienen un presupuesto entre 100000 y 200000 euros.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif
    FROM departamento d INNER JOIN empleado e ON d.id = e.id_departamento
    WHERE d.presupuesto NOT BETWEEN 100000 AND 200000;
  10. Devuelve un listado con el nombre de los departamentos donde existe algún empleado cuyo segundo apellido sea NULL. Tenga en cuenta que no debe mostrar nombres de departamentos que estén repetidos.

    Mostrar solución
    sql
    SELECT DISTINCT d.nombre
    FROM empleado e INNER JOIN departamento d ON d.id = e.id_departamento
    WHERE e.apellido2 IS NULL;

Consultas multitabla (Composición externa)

  1. Devuelve un listado con todos los empleados junto con los datos de los departamentos donde trabajan. Este listado también debe incluir los empleados que no tienen ningún departamento asociado.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif, d.nombre, d.presupuesto, d.gastos
    FROM empleado e LEFT JOIN departamento d ON e.id_departamento = d.id;
  2. Devuelve un listado donde sólo aparezcan aquellos empleados que no tienen ningún departamento asociado.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif, d.nombre, d.presupuesto, d.gastos
    FROM empleado e LEFT JOIN departamento d ON e.id_departamento = d.id
    WHERE e.id_departamento IS NULL;
  3. Devuelve un listado donde sólo aparezcan aquellos departamentos que no tienen ningún empleado asociado.

    Mostrar solución
    sql
    SELECT d.nombre
    FROM empleado e RIGHT JOIN departamento d ON e.id_departamento = d.id
    WHERE e.id IS NULL;
  4. Devuelve un listado con todos los empleados junto con los datos de los departamentos donde trabajan. El listado debe incluir los empleados que no tienen ningún departamento asociado y los departamentos que no tienen ningún empleado asociado. Ordene el listado alfabéticamente por el nombre del departamento.

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif, d.nombre, d.presupuesto, d.gastos
    FROM empleado e LEFT JOIN departamento d ON e.id_departamento = d.id
    UNION
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif, d.nombre, d.presupuesto, d.gastos
    FROM empleado e RIGHT JOIN departamento d ON e.id_departamento = d.id
    ORDER BY nombre ASC;
  5. Devuelve un listado con los empleados que no tienen ningún departamento asociado y los departamentos que no tienen ningún empleado asociado. Ordene el listado alfabéticamente por el nombre del departamento.

    Mostrar solución
    sql
    SELECT d.nombre
    FROM empleado e RIGHT JOIN departamento d ON e.id_departamento = d.id
    WHERE e.id IS NULL
    UNION
    SELECT CONCAT(e2.nombre, ' ', e2.apellido1, ' ', IFNULL(e2.apellido2, '')) AS Nombre
    FROM empleado e2 LEFT JOIN departamento d2 ON e2.id_departamento = d2.id
    WHERE e2.id_departamento IS NULL
    ORDER BY nombre ASC;

Consultas resumen

  1. Calcula la suma del presupuesto de todos los departamentos.

    Mostrar solución
    sql
    SELECT SUM(d.presupuesto) AS 'Suma'
    FROM departamento d;
  2. Calcula la media del presupuesto de todos los departamentos.

    Mostrar solución
    sql
    SELECT AVG(d.presupuesto) AS 'Promedio'
    FROM departamento d;
  3. Calcula el valor mínimo del presupuesto de todos los departamentos.

    Mostrar solución
    sql
    SELECT MIN(d.presupuesto) AS 'Presupuesto mínimo'
    FROM departamento d;
  4. Calcula el nombre del departamento y el presupuesto que tiene asignado, del departamento con menor presupuesto.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    ORDER BY d.presupuesto ASC
    LIMIT 1;
  5. Calcula el valor máximo del presupuesto de todos los departamentos.

    Mostrar solución
    sql
    SELECT MAX(d.presupuesto) AS 'Presupuesto máximo'
    FROM departamento d;
  6. Calcula el nombre del departamento y el presupuesto que tiene asignado, del departamento con mayor presupuesto.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    ORDER BY d.presupuesto DESC
    LIMIT 1;
  7. Calcula el número total de empleados que hay en la tabla empleado.

    Mostrar solución
    sql
    SELECT COUNT(*)
    FROM empleado e;
  8. Calcula el número de empleados que no tienen NULL en su segundo apellido.

    Mostrar solución
    sql
    SELECT COUNT(*)
    FROM empleado e
    WHERE e.apellido2 IS NOT NULL;
  9. Calcula el número de empleados que hay en cada departamento. Tienes que devolver dos columnas, una con el nombre del departamento y otra con el número de empleados que tiene asignados.

    Mostrar solución
    sql
    SELECT d.nombre, COUNT(*) AS 'Cantidad'
    FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id
    GROUP BY d.nombre;
  10. Calcula el nombre de los departamentos que tienen más de 2 empleados. El resultado debe tener dos columnas, una con el nombre del departamento y otra con el número de empleados que tiene asignados.

    Mostrar solución
    sql
    SELECT d.nombre, COUNT(*) AS 'Cantidad'
    FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id
    GROUP BY d.nombre
    HAVING Cantidad > 2;
  11. Calcula el número de empleados que trabajan en cada uno de los departamentos. El resultado de esta consulta también tiene que incluir aquellos departamentos que no tienen ningún empleado asociado.

    Mostrar solución
    sql
    SELECT d.nombre, COUNT(e.nombre) AS 'Cantidad'
    FROM empleado e RIGHT JOIN departamento d ON e.id_departamento = d.id
    GROUP BY d.nombre;
  12. Calcula el número de empleados que trabajan en cada unos de los departamentos que tienen un presupuesto mayor a 200000 euros.

    Mostrar solución
    sql
    SELECT d.nombre, COUNT(e.nombre) AS 'Cantidad'
    FROM empleado e RIGHT JOIN departamento d ON e.id_departamento = d.id
    WHERE d.presupuesto > 200000
    GROUP BY d.nombre;

Subconsultas

Con operadores básicos de comparación

  1. Devuelve un listado con todos los empleados que tiene el departamento de Sistemas. (Sin utilizar INNER JOIN).

    Mostrar solución
    sql
    SELECT e.nombre, e.apellido1, e.apellido2, e.nif
    FROM empleado e
    WHERE e.id_departamento = (SELECT d.id
                               FROM departamento d
                               WHERE d.nombre = 'Sistemas');
  2. Devuelve el nombre del departamento con mayor presupuesto y la cantidad que tiene asignada.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto = (SELECT MAX(d.presupuesto)
                           FROM departamento d);
  3. Devuelve el nombre del departamento con menor presupuesto y la cantidad que tiene asignada.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto = (SELECT MIN(d.presupuesto)
                           FROM departamento d);

Subconsultas con ALL y ANY

  1. Devuelve el nombre del departamento con mayor presupuesto y la cantidad que tiene asignada. Sin hacer uso de MAX, ORDER BY ni LIMIT.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto >= ALL(SELECT d.presupuesto
                               FROM departamento d);
  2. Devuelve el nombre del departamento con menor presupuesto y la cantidad que tiene asignada. Sin hacer uso de MIN, ORDER BY ni LIMIT.

    Mostrar solución
    sql
    SELECT d.nombre, d.presupuesto
    FROM departamento d
    WHERE d.presupuesto <= ALL(SELECT d.presupuesto
                               FROM departamento d);
  3. Devuelve los nombres de los departamentos que tienen empleados asociados. (Utilizando ALL o ANY).

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    WHERE d.id = ANY(SELECT e.id_departamento
                     FROM empleado e);
  4. Devuelve los nombres de los departamentos que no tienen empleados asociados. (Utilizando ALL o ANY).

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    WHERE d.id <> ALL(SELECT e.id_departamento
                      FROM empleado e
                      WHERE e.id_departamento IS NOT NULL);

Subconsultas con IN y NOT IN

  1. Devuelve los nombres de los departamentos que tienen empleados asociados. (Utilizando IN o NOT IN).

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    WHERE d.id IN (SELECT e.id_departamento
                   FROM empleado e);
  2. Devuelve los nombres de los departamentos que no tienen empleados asociados. (Utilizando IN o NOT IN).

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    WHERE d.id NOT IN (SELECT e.id_departamento
                       FROM empleado e
                       WHERE e.id_departamento IS NOT NULL);

Subconsultas con EXISTS y NOT EXISTS

  1. Devuelve los nombres de los departamentos que tienen empleados asociados. (Utilizando EXISTS o NOT EXISTS).

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    WHERE EXISTS (SELECT e.id_departamento
                  FROM empleado e
                  WHERE e.id_departamento = d.id);
  2. Devuelve los nombres de los departamentos que no tienen empleados asociados. (Utilizando EXISTS o NOT EXISTS).

    Mostrar solución
    sql
    SELECT d.nombre
    FROM departamento d
    WHERE NOT EXISTS (SELECT e.id_departamento
                      FROM empleado e
                      WHERE e.id_departamento = d.id);

Publicado bajo la licencia MIT.