🎓 Aprender SQL con PHP - Sistema Completo
Practica JOINS con múltiples tablas relacionadas
📊 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