Subconsultas, vistas e índices: conceptos
Clase de lectura. Tres herramientas para consultas más potentes y mantenibles: consultas dentro de consultas, consultas guardadas y estructuras que aceleran las búsquedas.
Idea clave
Una subconsulta es un SELECT dentro de otro. Una vista es un SELECT guardado con nombre. Un índice es una estructura que le permite a MySQL encontrar filas sin leer toda la tabla.Base de práctica: tablas_libro
Todos los ejemplos usan la base tablas_libro (30 tablas: alumnos, cursos, profesores, empleados, mascotas, artículos, quinielas…). Si todavía no la cargaste: descargátablasLibro.sql, creá la base con CREATE DATABASE tablas_libro;, seleccionala con USE tablas_libro; y ejecutá el script en Workbench (File > Open SQL Script).1. Subconsultas
Una subconsulta va siempre entre paréntesis y puede devolver un valor, una columna, una fila o una tabla. Según dónde la uses:
| Tipo | Devuelve | Ejemplo en tablas_libro |
|---|---|---|
| Escalar | Un solo valor | Empleados que ganan más que el promedio |
Con IN | Una columna (lista) | Alumnos inscriptos en algún curso |
Con EXISTS | Verdadero/falso | Cursos que tienen al menos un alumno |
| Correlacionada | Se recalcula por cada fila externa | Empleados que superan el promedio de su cargo |
| Tabla derivada (en FROM) | Una tabla temporal | Contar inscriptos por curso y filtrar después |
-- Escalar: empleados que ganan más que el promedio (1381,375) → Carlos, José
SELECT NOMBRE, SALARIO
FROM empleados
WHERE SALARIO > (SELECT AVG(SALARIO) FROM empleados);
-- IN: alumnos inscriptos en algún curso → los 6
SELECT NOMBRE FROM alumnos
WHERE ID_ALUMNO IN (SELECT ID_ALUMNO FROM alumnos_cursos);
-- Tabla derivada (necesita alias): cursos con más de 1 inscripto → cursos 1, 3 y 4
SELECT t.ID_CURSO, t.inscriptos
FROM (SELECT ID_CURSO, COUNT(*) AS inscriptos
FROM alumnos_cursos GROUP BY ID_CURSO) AS t
WHERE t.inscriptos > 1;¿Subconsulta o JOIN?
Muchas subconsultas conIN o EXISTS se pueden escribir como JOIN. Elegí la versión más clara; si una consulta es lenta, probá la alternativa.2. Vistas
Una vista es una consulta guardada que se usa como si fuera una tabla. No guarda una copia de los datos: cada vez que la consultás, MySQL ejecuta su SELECT sobre los datos actuales. tablas_libro ya trae cuatro: ALUMNOS_CURSOS_V, EMPLEADOS_V, MASCOTAS_V y TOTALES_SALARIO_V.
CREATE OR REPLACE VIEW v_inscriptos_por_curso AS
SELECT c.ID_CURSO, c.TITULO, COUNT(ac.ID_ALUMNO) AS inscriptos
FROM cursos AS c
LEFT JOIN alumnos_cursos AS ac ON ac.ID_CURSO = c.ID_CURSO
GROUP BY c.ID_CURSO, c.TITULO;
SELECT * FROM v_inscriptos_por_curso ORDER BY inscriptos DESC;
-- Programación PHP 3 · SQL desde cero 2 · Dibujo técnico 2 · Modelos 1 · SQL avanzado 0- Reutilizar lógica compleja con un nombre simple.
- Simplificar la conexión desde Excel o Power BI: conectás a la vista, no a varias tablas.
- Seguridad: mostrar solo algunas columnas o filas a ciertos usuarios.
La definición queda “congelada” al crearla: si después agregás columnas a la tabla, no aparecen en una vista hecha con SELECT *.
3. Índices
Sin índice, para encontrar las mascotas de una ubicación MySQL tiene que leer la tabla entera. Un índice funciona como el índice de un libro: ordena los valores de una o más columnas para ir directo a las filas. En MySQL la mayoría se guarda como árbol B (B-tree).
CREATE INDEX idx_mascotas_ubicacion ON mascotas (UBICACION);
CREATE INDEX idx_mascotas_especie_sexo ON mascotas (ESPECIE, SEXO);- Aceleran
WHERE,JOIN,ORDER BY,GROUP BYyMIN/MAX. - La clave primaria ya es un índice; las claves foráneas también se indexan (por ejemplo,
cursos.ID_PROFE). - Un índice de varias columnas sirve para su prefijo izquierdo:
(ESPECIE, SEXO)ayuda a filtrar porESPECIE, o porESPECIEySEXO, pero no solo porSEXO.
No todo lleva índice
Cada índice ocupa espacio y hay que actualizarlo en cadaINSERT, UPDATE y DELETE. En tablas chicas, o cuando la consulta lee casi todas las filas, leer la tabla completa es igual o más rápido. Indexá las columnas que más usás para filtrar y unir.Bibliografía
- MySQL 8.0 Reference Manual. Subqueries.
- MySQL 8.0 Reference Manual. Correlated Subqueries.
- MySQL 8.0 Reference Manual. Derived Tables.
- MySQL 8.0 Reference Manual. CREATE VIEW Statement.
- MySQL 8.0 Reference Manual. How MySQL Uses Indexes.
- MySQL 8.0 Reference Manual. CREATE INDEX Statement.
El manual oficial de MySQL está en inglés; podés usar el traductor del navegador.
Siguiente clase: Subconsultas.
