Nuevo mes, nuevos objetivos. Su ayuda ayuda al proyecto a avanzar. 🖥️ Apoye sqltest →
Código SQL copiado al portapapeles

Base de datos University (MariaDB): esquema, tablas y ejercicios de SQL

University es una base de ejemplo de MariaDB sobre una universidad: departamentos, profesores, estudiantes, cursos, grupos, matrículas, calificaciones e investigación. En SQLtest.online puedes consultarla directamente en el navegador: resolver ejercicios con corrección automática y ejecutar tus propias consultas en el playground, sin instalar nada.

  • 16 tablas y 7 vistas
  • 2000 estudiantes
  • 24 981 matrículas
  • 5 ejercicios de SQL

Qué es University

University es una base de ejemplo moderna para MariaDB 11, pensada como una alternativa más rica a la clásica Sakila. Está normalizada hasta la tercera forma normal y usa muchos tipos de datos de MariaDB: JSON, ENUM y SET, índices FULLTEXT y columnas VECTOR para embeddings.

Hay datos suficientes para análisis reales: unas 25 000 matrículas, 300 000 calificaciones y un registro de auditoría de más de medio millón de filas. Y el tema resulta familiar para cualquiera que haya estudiado en la universidad.

Diagrama ER

El diagrama muestra las tablas de University y las claves foráneas que las unen. Haz clic para abrirlo a tamaño completo.

Diagrama ER de la base de datos University

Qué contiene la base

Las tablas se agrupan en tres bloques.

Personas y estructura

departments (un árbol), faculty, students y rooms.

Docencia

courses con course_prerequisites, semesters, sections, enrollments y grade_events.

Investigación y becas

research_projects, project_members, publications, scholarships y student_scholarships, además de audit_log.

Lo principal: el estudiante se matricula en un grupo, una edición concreta del curso en un semestre, no en el curso en sí. Por eso el camino del estudiante al curso es enrollments → sections → courses. Siete vistas, como v_student_gpa y v_course_pass_rate, contienen informes ya preparados.

Cuántos datos hay en las tablas:

TablaFilasContenido
students2000estudiantes
faculty250profesores
departments25departamentos
courses116cursos
course_prerequisites49requisitos previos de los cursos
semesters20semestres
sections1715grupos de un curso en el semestre
rooms48aulas
enrollments24 981matrículas en grupos
grade_events307 081calificaciones de tareas y exámenes
research_projects200proyectos de investigación
project_members876miembros de los proyectos
publications500publicaciones
scholarships20becas
student_scholarships773becas concedidas a estudiantes
audit_log664 124registro de cambios

Estructura de las tablas

Haz clic en una tabla para ver sus columnas, una fila de ejemplo y sus claves.

La lista de tablas

semesters - tabla de semestres académicos.
  • semester_ididentificador único del registro (PK, TINYINT)
  • termtipo de término: Otoño, Primavera, o Verano (ENUM)
  • academic_yearaño académico (YEAR)
  • namenombre del semestre (por ejemplo, 'Otoño 2024')
  • start_dateprimer día del semestre
  • end_dateúltimo día del semestre
  • enroll_deadlineúltima fecha para la inscripción de estudiantes
  • is_activesi el semestre está actualmente activo (BOOLEAN)
semester_id term academic_year name start_date end_date enroll_deadline is_active
1 Otoño 2024 Otoño 2024 2024-09-02 2024-12-20 2024-09-13 1
  • CLAVE PRIMARIA, btree (semester_id)
  • CLAVE ÚNICA (term, academic_year)
rooms - aulas y laboratorios del campus.
  • room_ididentificador único del registro (PK, SMALLINT)
  • buildingnombre del edificio
  • room_numbernúmero o etiqueta de la sala
  • capacitynúmero máximo de asientos (SMALLINT)
  • room_typetipo de sala: conferencia, seminario, laboratorio, laboratorio de computación, o en línea (ENUM)
  • has_projectorsi la sala tiene proyector (BOOLEAN)
  • has_videosi la sala tiene equipo de videoconferencia (BOOLEAN)
room_id building room_number capacity room_type has_projector has_video
1 Salón de Ciencias 101 120 conferencia 1 0
  • CLAVE PRIMARIA, btree (room_id)
  • CLAVE ÚNICA (building, room_number)
scholarships - becas y subvenciones disponibles.
  • scholarship_ididentificador único del registro (PK, SMALLINT)
  • namenombre de la beca
  • amountmonto de la beca (DECIMAL)
  • frequencyfrecuencia de la beca: única, anual, o por semestre (ENUM)
  • eligibilitycriterios de elegibilidad como JSON — por ejemplo, {"min_gpa": 3.5, "need_based": true}
  • is_activesi la beca se ofrece actualmente (BOOLEAN)
scholarship_id name amount frequency eligibility is_active
1 Beca de Excelencia del Decano 5000.00 anual {"min_gpa": 3.8, "need_based": false, "majors": ["CS","Math"]} 1
  • CLAVE PRIMARIA, btree (scholarship_id)
departments - jerarquía de departamentos de tres niveles (Facultad → Departamento → Subdepartamento).
  • department_ididentificador único del registro (PK, TINYINT)
  • parent_ididentificador del departamento padre — FK autorreferencial (nullable)
  • codecódigo corto del departamento (CHAR)
  • namenombre del departamento
  • levelnivel de jerarquía: 1 = Facultad, 2 = Departamento, 3 = Subdepartamento (TINYINT)
  • head_faculty_ididentificador del jefe del departamento (FK, nullable)
  • establishedaño en que se estableció el departamento (YEAR, nullable)
department_id parent_id code name level head_faculty_id established
1 [null] ENG Facultad de Ingeniería 1 1 1965
  • CLAVE PRIMARIA, btree (department_id)
  • CLAVE ÚNICA (code)
  • CLAVE FORÁNEA (parent_id) REFERENCIAS departments(department_id)
  • CLAVE FORÁNEA (head_faculty_id) REFERENCIAS faculty(faculty_id)
faculty - personal académico y administrativo.
  • faculty_ididentificador único del registro (PK, SMALLINT)
  • department_ididentificador del departamento (FK)
  • first_namenombre del miembro de la facultad
  • last_nameapellido del miembro de la facultad
  • emaildirección de correo electrónico institucional
  • phonenúmero de teléfono de la oficina (nullable)
  • rankrango académico: Instructor, Profesor Asistente, Profesor Asociado, Profesor, o Emérito (ENUM)
  • hire_datefecha de contratación
  • officenúmero o ubicación de la oficina (nullable)
  • office_hourshorario de oficina semanal como arreglo JSON — por ejemplo, [{"day":"Lun","start":"10:00","end":"12:00"}]
  • biotexto biográfico (TEXT, nullable)
  • is_activesi el miembro de la facultad está actualmente activo (BOOLEAN)
faculty_id department_id first_name last_name email phone rank hire_date office office_hours bio is_active
1 3 Alice Carter a.carter@university.edu +15550100 Profesor 2010-08-15 ENG-204 [{"day":"Lun","start":"10:00","end":"12:00"}] Experto en sistemas distribuidos. 1
  • CLAVE PRIMARIA, btree (faculty_id)
  • CLAVE ÚNICA (email)
  • CLAVE FORÁNEA (department_id) REFERENCIAS departments(department_id)
students - estudiantes registrados.
  • student_ididentificador único del registro (PK, INT)
  • department_ididentificador del departamento de origen (FK)
  • student_numbernúmero de identificación único del estudiante (CHAR, por ejemplo, 'S000123')
  • first_namenombre del estudiante
  • last_nameapellido del estudiante
  • emaildirección de correo electrónico del estudiante
  • date_of_birthfecha de nacimiento del estudiante
  • gendergénero: M, F, NB, Otro, o Prefiero no decir (ENUM, nullable)
  • enrollment_datefecha en que el estudiante fue inscrito por primera vez
  • expected_gradaño de graduación esperado (YEAR, nullable)
  • statusestado de inscripción: activo, inactivo, graduado, suspendido, o retirado (ENUM)
  • gpapromedio acumulativo de GPA 0.000–4.000, mantenido por trigger (DECIMAL, nullable)
  • contactscontacto de emergencia y dirección como JSON — por ejemplo, {"emergency":{"name":"Jane Doe","phone":"+1-555-0100"}}
student_id department_id student_number first_name last_name playground.

Un estudiante, un curso y una nota: de la matrícula, pasando por el grupo, al curso y el semestre.

SELECT s.first_name, s.last_name, c.code, sem.name AS semester, e.final_grade
FROM enrollments e
JOIN students s ON s.student_id = e.student_id
JOIN sections sec ON sec.section_id = e.section_id
JOIN courses c ON c.course_id = sec.course_id
JOIN semesters sem ON sem.semester_id = sec.semester_id
WHERE e.final_grade IS NOT NULL
ORDER BY e.enrollment_id
LIMIT 3;
first_namelast_namecodesemesterfinal_grade
AlexisCollierMATH111Fall 2024B+
AlexisCollierNURS102Fall 2024B
AlexisCollierMATH106Summer 2024B

Horario de tutorías en JSON: un valor leído de una columna JSON con JSON_VALUE.

SELECT first_name, last_name,
       JSON_VALUE(office_hours, '$[0].day') AS day,
       JSON_VALUE(office_hours, '$[0].start') AS starts_at
FROM faculty
ORDER BY faculty_id
LIMIT 3;
first_namelast_namedaystarts_at
DanielleJohnsonTue09:00
JasonHahnFri08:00
KathleenCannonFri08:00

Ejercicios de SQL por tema

Por ahora la base University tiene 5 ejercicios, y se están añadiendo más. Las soluciones se comprueban automáticamente en un MariaDB real. El número de la derecha es la cantidad de ejercicios del tema; los puntos de color muestran el rango de dificultad.

Por dónde empezar

Los primeros ejercicios de la base University:

  1. Edad de Inscripción de Estudiantes
  2. Identificar Edificios No de Laboratorio
  3. Departamentos más Antiguos
  4. Proyectos Activos Financiados por NASA
  5. Consulta de Publicaciones

Todos los ejercicios de University →

Preguntas frecuentes

¿Hay que instalar MariaDB para usar University?

No. Los ejercicios y el playground de SQLtest.online ejecutan las consultas en nuestros servidores, así que basta con un navegador. En el playground, University está disponible en MariaDB 11.8.

¿Qué funciones de MariaDB usa?

Columnas JSON, tipos ENUM y SET, índices FULLTEXT, columnas VECTOR para embeddings, vistas y una jerarquía de departamentos para consultas recursivas.

¿Se pueden modificar los datos?

En el playground la base es de solo lectura, para que todos vean los mismos datos. Para practicar INSERT, UPDATE y DELETE en tus propias tablas, elige una versión normal de MariaDB en el playground.