Introducción a Bases de Datos
> Sesión 02
> Ejemplo 4
- Escribir consultas que hagan uso de otras subconsultas, ya sea en la cláusula
SELECT
, en la cláusulaFROM
o en la cláusulaWHERE
.
- MySQL Workbench instalado.
-
Abre MySQL Wokbench y conectate a la base de datos del curso.
-
Una subconsulta es una consulta dentro de otra. Puede crear sunconsultas en SQL y pueden aparecer en la cláusula
WHERE
,FROM
oSELECT
. Veamos algunos ejemplos.Usando
WHERE
Queremos los empleados cuyo puesto es
Junior Executive
. Para realizar la subconsulta, descompongamos el problema en partes. Primero necesitamos saber el identificador de los puestos con ese nombre.SELECT id_puesto FROM puesto WHERE nombre = 'Junior Executive';
Ahora, con los identificadores que obtuvimos, podemos hacer una búsqueda de los empleado que tienen dichos identificadores. Para ello, usamos la consulta anterior dentro de la cláusula
WHERE
y filtramos aquellos empleados cuyoid_puesto
esté en los resultados de la misma.SELECT * FROM empleado WHERE id_puesto IN (SELECT id_puesto FROM puesto WHERE nombre = 'Junior Executive');
Usando
FROM
Ahora queremos saber cuál es la menor y mayor cantidad de ventas de un artículo. Nuevamente, volvemos a descomponer el problema. Primero, obtengamos la cantidad de piezas por venta de un artículo.
SELECT clave, id_articulo, count(*) AS cantidad FROM venta GROUP BY clave, id_articulo ORDER BY clave;
Ahora, sobre la tabla resultante hacemos un nuevo agrupamiento para obtener la cantidad mínima y máxima de cada artículo, sin importar la venta.
SELECT id_articulo, min(cantidad), max(cantidad) FROM (SELECT clave, id_articulo, count(*) AS cantidad FROM venta GROUP BY clave, id_articulo ORDER BY clave) AS subconsulta GROUP BY id_articulo;
Usando
SELECT
Ahora, obtendremos el sueldo de cada empleado usando una subconsulta. Para ello, obtenemos primero el sueldo de cada tipo de empleado y luego lo usamos como subconsulta.
SELECT nombre, apellido_paterno, (SELECT salario FROM puesto WHERE id_puesto = e.id_puesto) AS sueldo FROM empleado AS e;