Módulo 5 · 01 | Subconsultas, vistas e índices: conceptos

MÓDULO 5 · CLASE 1

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).

Descargar tablasLibro.sql (Drive)

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:

TipoDevuelveEjemplo en tablas_libro
EscalarUn solo valorEmpleados que ganan más que el promedio
Con INUna columna (lista)Alumnos inscriptos en algún curso
Con EXISTSVerdadero/falsoCursos que tienen al menos un alumno
CorrelacionadaSe recalcula por cada fila externaEmpleados que superan el promedio de su cargo
Tabla derivada (en FROM)Una tabla temporalContar 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 con IN 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 BY y MIN/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 por ESPECIE, o por ESPECIE y SEXO, pero no solo por SEXO.

No todo lleva índice

Cada índice ocupa espacio y hay que actualizarlo en cada INSERT, 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

El manual oficial de MySQL está en inglés; podés usar el traductor del navegador.

Siguiente clase: Subconsultas.

Scroll al inicio
¿Consultas? Escribinos