[SQL 18] Caso SEIS · matrícula en educación superior
- Leer un modelo relacional grande e identificar el camino de JOIN entre las tablas que pide un requerimiento.
- Reconocer la sintaxis correcta de
ALTER TABLE,ADD PRIMARY KEY,INSERT,UPDATEyDELETEen MySQL, como en las preguntas de alternativas. - Unir tablas con una clave foránea compuesta (carrera → sede) y con tablas de catálogo (área, nivel, vigencia, jornada).
- Construir métricas con
SUM(CASE …), filtrar grupos conHAVINGy contar personas distintas conCOUNT(DISTINCT …).
Caso: el ministerio publica, a través del SEIS, la matrícula de los estudiantes de educación superior: tipo de institución, acreditación, sedes, carreras, jornadas, modalidades y los datos de cada matrícula (año, arancel, forma de ingreso). Como analista, debes mantener la base (DDL y DML) y responder requerimientos con consultas.
Antes de escribir una consulta, ubica en el modelo las tablas que necesitas y su camino de unión. Los caminos más usados:
matricula → estudiante(sexo, edad) ymatricula → carrera(nombre, área, nivel, jornada…).carrera → institucion(nombre, tipo, acreditación) ycarrera → sede → comuna → provincia → region. La sede tiene clave primaria compuesta(sed_codigo, sed_institucion), así que el JOIN usa las dos columnas:s.sed_codigo = c.car_sede AND s.sed_institucion = c.car_institucion.- Las tablas de catálogo (
area,nivel,vigencia,jornada,sexo…) traducen códigos a descripciones. Filtra por la descripción cuando el enunciado la nombra («área Informática»), o por el código si lo da.
En matricula, mat_periodo es el año de la matrícula, mat_agno_ingreso el año en que el estudiante
entró a la carrera y mat_ingreso_primer_agno = 1 marca a los estudiantes de primer año. En estudiante,
est_sexo = 1 es mujer y 2 es hombre.
Nota sobre el modelo: en el diagrama original, carrera tiene solo car_sede aunque la PK de
sede es compuesta. Para que la clave foránea sea válida, esta base agrega car_institucion, y
(car_sede, car_institucion) referencia a sede(sed_codigo, sed_institucion).
CREATE, ALTER, DROP: definen la estructura (tablas, columnas, claves, vistas).INSERT (crear), SELECT (leer), UPDATE (actualizar), DELETE (eliminar).COUNT(DISTINCT est_run).ALTER TABLE t CHANGE COLUMN col col TEXT; ALTER TABLE t MODIFY COLUMN col TEXT;ALTER TABLE t ADD PRIMARY KEY (col); ALTER TABLE t ADD CONSTRAINT fk FOREIGN KEY (c) REFERENCES p(c);ALTER TABLE t MODIFY (col VARCHAR2(400)); ALTER TABLE t ADD CONSTRAINT pk PRIMARY KEY (col);ALTER TABLE t ADD COLUMN …; RENAME COLUMN …; DROP COLUMN … (sin CHANGE/MODIFY ni ADD PRIMARY KEY)1 · Ejemplos guiados · ejecuta y modifica cada bloque
pk indica la posición de la columna dentro de la clave primaria (0 = no es parte de ella).(sed_codigo, sed_institucion): el JOIN con carrera compara las dos columnas. Si usaras solo sed_codigo, cada carrera se uniría con las sedes número 1 de todas las instituciones.matricula → carrera → institucion → tipo_institucion, filtro por periodo y agrupación por la descripción del tipo.ROUND(AVG(…)) redondea al peso. El área está en la tabla de catálogo area.SUM(CASE …) (o SUM(condición) en SQLite y MySQL) cuenta por categoría dentro de cada grupo: es la base de las métricas tipo «hombres − mujeres».Sintaxis en otros motores (referencia, no se ejecuta aquí)
CREATE TABLE sede ( sed_codigo INT NOT NULL, sed_institucion INT NOT NULL, sed_nombre VARCHAR(80) NOT NULL, sed_comuna INT NOT NULL, PRIMARY KEY (sed_codigo, sed_institucion), CONSTRAINT fk_sede_institucion FOREIGN KEY (sed_institucion) REFERENCES institucion (inst_codigo), CONSTRAINT fk_sede_comuna FOREIGN KEY (sed_comuna) REFERENCES comuna (com_codigo) ) ENGINE = InnoDB;
CREATE TABLE matricula ( mat_estudiante INT NOT NULL, mat_carrera INT NOT NULL, mat_periodo INT NOT NULL, mat_valor_matricula INT, mat_valor_arancel INT, mat_ingreso_primer_agno TINYINT, mat_ingreso_semestre_matricula TINYINT, mat_agno_ingreso INT, mat_semestre_ingreso TINYINT, mat_forma_ingreso INT, PRIMARY KEY (mat_estudiante, mat_carrera, mat_periodo), FOREIGN KEY (mat_estudiante) REFERENCES estudiante (est_run), FOREIGN KEY (mat_carrera) REFERENCES carrera (car_codigo), FOREIGN KEY (mat_forma_ingreso) REFERENCES ingreso (ing_codigo) ) ENGINE = InnoDB;
CHANGE COLUMN repite el nombre (viejo y nuevo) y permite renombrar; MODIFY COLUMN solo cambia la definición. Ambos exigen ALTER TABLE y el tipo completo.ALTER TABLE carrera CHANGE COLUMN car_requisito_ingreso car_requisito_ingreso TEXT; ALTER TABLE carrera MODIFY COLUMN car_requisito_ingreso TEXT; ALTER TABLE institucion ADD COLUMN inst_sitio_web VARCHAR(200); ALTER TABLE area ADD PRIMARY KEY (are_codigo); ALTER TABLE area ADD CONSTRAINT fk_area_tipo FOREIGN KEY (are_tipo_area) REFERENCES tipo_area (tpar_codigo); ALTER TABLE estudiante DROP COLUMN est_rango_edad;
⚠ Errores frecuentes
- Escribir
ALTER estudiante …oMODIFY estudiante …: la instrucción siempre empieza conALTER TABLE. ADD COLUMN colsin tipo de dato: toda columna nueva necesita su tipo (INTEGER,VARCHAR(200)…).INSERT INTO TABLE …,UPDATE TABLE …oDELETE FROM TABLE …: la palabraTABLEno va en el DML.- Unir
carreraconsedesolo porsed_codigo: con PK compuesta se duplican filas. - Contar matrículas cuando se piden estudiantes: un estudiante aparece una vez por año; usa
COUNT(DISTINCT …). - En un
LIKE, un espacio dentro del patrón cuenta:' %Vida'exige que el texto empiece con un espacio. El patrón correcto es'%Vida'.
2 · Retos con corrección automática
Escribe tu solución y pulsa comprobar (Ctrl + Enter). Tu consulta y la solución se ejecutan en bases limpias y se comparan los resultados: no importan los nombres de las columnas, sí los datos (y el orden, cuando el reto lo pide). Si te atascas, usa la pista o mira el resultado esperado.
3 · Preguntas tipo solemne
car_requisito_ingreso a TEXT en la tabla carrera (MySQL)?CHANGE COLUMN pide el nombre actual, el nombre nuevo (aquí el mismo) y la definición completa, siempre detrás de ALTER TABLE. Con MODIFY COLUMN car_requisito_ingreso TEXT se obtendría lo mismo.area, cuyo atributo es are_codigo?ALTER TABLE tabla ADD PRIMARY KEY (columnas): falta TABLE en la primera, falta ADD en la segunda y MODIFY no inicia una instrucción.inst_sitio_web a la tabla institucion?ALTER TABLE.TABLE, que no corresponde.SET indica qué cambia (el nombre) y WHERE qué fila (código 9), en ese orden. La primera opción hace lo contrario de lo pedido.DELETE FROM tabla WHERE condición. Ojo: un patrón como ' %Magíster' (con espacio inicial) no calzaría, porque exige que el texto comience con un espacio.(sed_codigo, sed_institucion). ¿Cuál es el JOIN correcto entre carrera c y sede s?COUNT(DISTINCT …) lo cuenta una sola vez.▸ Para seguir practicando
- Calcula la tasa de retención: de los que ingresaron en 2021, ¿qué porcentaje sigue matriculado en 2022?
- Arma un ranking de instituciones por matrícula 2023 con
RANK() OVER (ORDER BY …). - Abre el modelo en el editor relacional, genera el script para MySQL Workbench e impórtalo con Reverse Engineer.