🎓 Aprender SQL con PHP - Sistema Completo

Practica JOINS con múltiples tablas relacionadas

👨‍🎓 Estudiantes
5
👨‍🏫 Profesores
5
📚 Materias
7
🏫 Salones
5
📝 Inscripciones
13

📊 Diagrama de Relaciones entre Tablas

estudiantes
🔑 id
nombre
edad
email
carrera
profesores
🔑 id
nombre
especialidad
email
telefono
salones
🔑 id
nombre
edificio
capacidad
tiene_proyector
materias
🔑 id
nombre
codigo
creditos
🔗 profesor_id
🔗 salon_id
horario
inscripciones
🔑 id
🔗 estudiante_id
🔗 materia_id
calificacion
fecha_inscripcion

🔑 Primary Key | 🔗 Foreign Key

⚡ Ejecutor de Consultas SQL

📚 Ejemplos de Consultas SQL con JOINS (Haz clic para copiar):

🔗 INNER JOIN - Combinar tablas relacionadas
SELECT estudiantes.nombre AS estudiante, materias.nombre AS materia, inscripciones.calificacion FROM inscripciones INNER JOIN estudiantes ON inscripciones.estudiante_id = estudiantes.id INNER JOIN materias ON inscripciones.materia_id = materias.id
Ver estudiantes con sus materias y calificaciones
SELECT materias.nombre AS materia, materias.codigo, profesores.nombre AS profesor, salones.nombre AS salon FROM materias INNER JOIN profesores ON materias.profesor_id = profesores.id INNER JOIN salones ON materias.salon_id = salones.id
Ver materias con su profesor y salón asignado
SELECT estudiantes.nombre, COUNT(inscripciones.id) AS total_materias, AVG(inscripciones.calificacion) AS promedio FROM estudiantes INNER JOIN inscripciones ON estudiantes.id = inscripciones.estudiante_id GROUP BY estudiantes.id, estudiantes.nombre
Estudiantes con total de materias y promedio de calificaciones
SELECT profesores.nombre AS profesor, COUNT(materias.id) AS total_materias, profesores.especialidad FROM profesores INNER JOIN materias ON profesores.id = materias.profesor_id GROUP BY profesores.id, profesores.nombre, profesores.especialidad
Profesores con el número de materias que imparten
⬅️ LEFT JOIN - Incluir registros sin relación
SELECT estudiantes.nombre, COUNT(inscripciones.id) AS materias_inscritas FROM estudiantes LEFT JOIN inscripciones ON estudiantes.id = inscripciones.estudiante_id GROUP BY estudiantes.id, estudiantes.nombre
Todos los estudiantes, incluso los que no tienen materias
SELECT profesores.nombre, COUNT(materias.id) AS materias_asignadas FROM profesores LEFT JOIN materias ON profesores.id = materias.profesor_id GROUP BY profesores.id, profesores.nombre
Todos los profesores, incluso sin materias asignadas
SELECT salones.nombre, salones.edificio, COUNT(materias.id) AS materias_programadas FROM salones LEFT JOIN materias ON salones.id = materias.salon_id GROUP BY salones.id, salones.nombre, salones.edificio
Todos los salones con el número de materias programadas
🎯 JOINS Complejos - Múltiples tablas
SELECT e.nombre AS estudiante, m.nombre AS materia, m.codigo, p.nombre AS profesor, s.nombre AS salon, s.edificio, i.calificacion FROM inscripciones i INNER JOIN estudiantes e ON i.estudiante_id = e.id INNER JOIN materias m ON i.materia_id = m.id INNER JOIN profesores p ON m.profesor_id = p.id INNER JOIN salones s ON m.salon_id = s.id ORDER BY e.nombre, m.nombre
Vista completa: estudiante, materia, profesor, salón y calificación
SELECT p.nombre AS profesor, m.nombre AS materia, s.nombre AS salon, s.capacidad, COUNT(i.id) AS estudiantes_inscritos FROM profesores p INNER JOIN materias m ON p.id = m.profesor_id INNER JOIN salones s ON m.salon_id = s.id LEFT JOIN inscripciones i ON m.id = i.materia_id GROUP BY p.id, p.nombre, m.id, m.nombre, s.nombre, s.capacidad
Profesores con sus materias, salones y número de estudiantes
SELECT e.nombre AS estudiante, e.carrera, COUNT(i.id) AS total_materias, AVG(i.calificacion) AS promedio, MAX(i.calificacion) AS mejor_nota, MIN(i.calificacion) AS peor_nota FROM estudiantes e LEFT JOIN inscripciones i ON e.id = i.estudiante_id GROUP BY e.id, e.nombre, e.carrera ORDER BY promedio DESC
Estadísticas completas por estudiante
🔍 Consultas con WHERE y HAVING
SELECT e.nombre, m.nombre AS materia, i.calificacion FROM inscripciones i INNER JOIN estudiantes e ON i.estudiante_id = e.id INNER JOIN materias m ON i.materia_id = m.id WHERE i.calificacion >= 90 ORDER BY i.calificacion DESC
Estudiantes con calificaciones mayores o iguales a 90
SELECT p.nombre AS profesor, COUNT(m.id) AS total_materias FROM profesores p INNER JOIN materias m ON p.id = m.profesor_id GROUP BY p.id, p.nombre HAVING COUNT(m.id) > 1
Profesores que imparten más de una materia
SELECT e.nombre, AVG(i.calificacion) AS promedio FROM estudiantes e INNER JOIN inscripciones i ON e.id = i.estudiante_id GROUP BY e.id, e.nombre HAVING AVG(i.calificacion) > 85 ORDER BY promedio DESC
Estudiantes con promedio mayor a 85
📊 Consultas de análisis avanzado
SELECT m.nombre AS materia, COUNT(i.id) AS total_estudiantes, AVG(i.calificacion) AS promedio_materia, s.capacidad, ROUND((COUNT(i.id) / s.capacidad) * 100, 2) AS porcentaje_ocupacion FROM materias m INNER JOIN salones s ON m.salon_id = s.id LEFT JOIN inscripciones i ON m.id = i.materia_id GROUP BY m.id, m.nombre, s.capacidad ORDER BY porcentaje_ocupacion DESC
Análisis de ocupación de salones por materia
SELECT e.carrera, COUNT(DISTINCT e.id) AS total_estudiantes, COUNT(i.id) AS total_inscripciones, AVG(i.calificacion) AS promedio_carrera FROM estudiantes e LEFT JOIN inscripciones i ON e.id = i.estudiante_id GROUP BY e.carrera ORDER BY promedio_carrera DESC
Estadísticas por carrera
SELECT s.edificio, COUNT(DISTINCT s.id) AS total_salones, COUNT(DISTINCT m.id) AS materias_programadas, SUM(s.capacidad) AS capacidad_total FROM salones s LEFT JOIN materias m ON s.id = m.salon_id GROUP BY s.edificio ORDER BY capacidad_total DESC
Análisis por edificio
🔧 Consultas básicas de cada tabla
SELECT * FROM estudiantes
Ver todos los estudiantes
SELECT * FROM profesores
Ver todos los profesores
SELECT * FROM materias
Ver todas las materias
SELECT * FROM salones
Ver todos los salones
SELECT * FROM inscripciones
Ver todas las inscripciones
SHOW TABLES
Ver todas las tablas de la base de datos

📚 Ejemplos de Consultas SQL (Haz clic para copiar):

🔍 SELECT - Consultar datos:
SELECT * FROM estudiantes
SELECT nombre, edad FROM estudiantes WHERE edad > 20
SELECT * FROM estudiantes WHERE carrera = 'Ingeniería'
SELECT COUNT(*) as total FROM estudiantes
SELECT carrera, COUNT(*) as cantidad FROM estudiantes GROUP BY carrera
SELECT * FROM estudiantes ORDER BY edad DESC
➕ INSERT - Insertar datos:
INSERT INTO estudiantes (nombre, edad, email, carrera) VALUES ('Ana Martínez', 23, 'ana@email.com', 'Arquitectura')
✏️ UPDATE - Actualizar datos:
UPDATE estudiantes SET edad = 25 WHERE nombre = 'Juan Pérez'
UPDATE estudiantes SET carrera = 'Ingeniería de Software' WHERE id = 1
🗑️ DELETE - Eliminar datos:
DELETE FROM estudiantes WHERE edad < 18
DELETE FROM estudiantes WHERE id = 999
🔧 Otras consultas útiles:
SHOW TABLES
DESCRIBE estudiantes
SELECT AVG(edad) as edad_promedio FROM estudiantes
SELECT MAX(edad) as mayor_edad, MIN(edad) as menor_edad FROM estudiantes