Skip to content

Instantly share code, notes, and snippets.

@eduardogpg
Last active April 4, 2025 00:36
Show Gist options
  • Save eduardogpg/38bb890d281cc4a2978baa6608b64c8c to your computer and use it in GitHub Desktop.
Save eduardogpg/38bb890d281cc4a2978baa6608b64c8c to your computer and use it in GitHub Desktop.
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT,
enrollment_year INT
);
CREATE TABLE enrollments (
id INT PRIMARY KEY,
student_id INT,
course_id INT,
grade FLOAT,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
CREATE TABLE courses (
id INT PRIMARY KEY,
title VARCHAR(100),
credits INT
);
INSERT INTO students (id, name, age, enrollment_year) VALUES
(1, 'Alice Johnson', 20, 2021),
(2, 'Bob Smith', 22, 2020),
(3, 'Clara Lee', 21, 2021),
(4, 'Daniel Kim', 23, 2019),
(5, 'Eva Brown', 22, 2020),
(6, 'John', 20, 2021),
(7, 'Claude', 22, 2022),
(8, 'Daniel', 21, 2023),
(9, 'Rose', 23, 2022),
(10, 'Devin', 22, 2024);
INSERT INTO courses (id, title, credits) VALUES
(101, 'Introduction to Programming', 3),
(102, 'Database Systems', 4),
(103, 'Data Structures', 3),
(104, 'Operating Systems', 4),
(105, 'Computer Networks', 3);
INSERT INTO enrollments (id, student_id, course_id, grade) VALUES
(1, 1, 101, 88.5),
(2, 1, 102, 91.0),
(3, 2, 101, 76.0),
(4, 2, 103, 82.0),
(5, 3, 104, 85.5),
(6, 3, 105, 90.0),
(7, 4, 102, 65.0),
(8, 4, 105, 72.0),
(9, 5, 101, 95.0),
(10, 5, 104, 89.5);
- Obtener el nombre de todos los estudiantes con más de un curso.
- Obtener los cursos con menos de 3 estudiantes matriculados.
- Obtener el nombre de todos los estudiantes cuyo promedio de notas es mayor que el promedio.
- Obtener los cursos en los que está matriculada 'Alice Johnson'.
- Obtener los estudiantes matriculados en los mismos cursos que 'Bob Smith'.
- Obtener los cursos con estudiantes que tienen promedios de notas superiores a 85.
- Obtener los estudiantes que obtuvieron el mejor promedio en 'Database Systems'.
- Obtener el nombre de todos los estudiantes con un grado mayor a 90.
- Obtener el nombre del cursos con menor cantidad de usuarios registrados.
- Listas los estudiantes no matriculados en ningún curso.
- Listas los estudiantes quienes están matriculados en al menos un curso.
- Listar los estudiante quienes no están matriculados a ningún curso.
- Listar los estudiantes que están matriculados en el curso 'Database Systems'.
- Listas los cursos que tienen al menos un estudiante con una calificación mayor a 90.
- Listar los estudiantes que están matriculados en todos los cursos que 'Alice Johnson' está matriculada.
- Obtener el nombre de todos los estudiantes con más de un curso.
SELECT
name
FROM students
WHERE id IN (
SELECT
student_id
FROM enrollments
GROUP BY student_id
HAVING COUNT(*) > 1
);
-- Obtener el nombre de todos los estudiantes del curso 'Introduction to Programming'
SELECT
name
FROM students
WHERE id IN (
SELECT
student_id
FROM enrollments
WHERE course_id IN (
SELECT id FROM courses WHERE courses.title = 'Python'
)
);
-- ALL - ANY (IN - NOT IN)
-- Obtener los cursos con menos de 3 estudiantes matriculados.
SELECT title FROM COURSES
WHERE id IN(
SELECT course_id
FROM enrollments
GROUP BY course_id
HAVING COUNT(*) < 3
);
-- Obtener el nombre de todos los estudiantes cuyo promedio de notas es mayor que el promedio.
SELECT name FROM students WHERE id IN (
SELECT student_id FROM enrollments WHERE grade > (
SELECT AVG(grade) FROM enrollments
)
);
-- Obtener los cursos en los que está matriculada 'Alice Johnson'.
SELECT title FROM courses WHERE id IN (
SELECT course_id
FROM enrollments
WHERE student_id IN (
SELECT id from students WHERE name = 'Alice Johnson'
)
);
-- Obtener los estudiantes matriculados en los mismos cursos que 'Bob Smith'.
SELECT name FROM students
WHERE id IN (
SELECT student_id
FROM enrollments WHERE course_id IN (
SELECT course_id
FROM enrollments
WHERE student_id IN (
SELECT id from students WHERE name = 'Bob Smith'
)
)
) AND id <> (SELECT id from students WHERE name = 'Bob Smith')
-- Obtener el nombre de todos los estudiantes con un grado mayor a 90.
SELECT name FROM students WHERE id IN (
SELECT student_id FROM enrollments WHERE grade > 90
)
-- Obtener el nombre del curso con menor cantidad de usuarios registrados.
SELECT
title
FROM courses
INNER JOIN (
SELECT
course_id,
COUNT(*) AS total
FROM enrollments
GROUP BY course_id
ORDER BY total
LIMIT 1
) AS last_course ON courses.id = last_course.course_id;
SELECT
title
FROM courses
WHERE id IN (
SELECT course_id FROM (
SELECT
course_id,
COUNT(*) AS total
FROM enrollments
GROUP BY course_id
ORDER BY total
LIMIT 1
) as A
);
-- Listas los estudiantes no matriculados en ningún curso.
SELECT
name
FROM students -- main
WHERE EXISTS (
SELECT 1 FROM enrollments --
WHERE enrollments.student_id = students.id
);
-- Listar los estudiantes quienes están matriculados en al menos un curso.
SELECT
name
FROM students -- main
WHERE EXISTS (
SELECT 1 FROM enrollments --
WHERE enrollments.student_id = students.id
);
-- Listar los estudiantes que están matriculados en el curso 'Database Systems'.
SELECT
name
FROM students -- main
WHERE EXISTS (
SELECT 1
FROM enrollments
INNER JOIN courses ON enrollments.course_id = courses.id
AND courses.title = 'Database Systems'
WHERE enrollments.student_id = students.id
);
-- Listar los cursos que tienen al menos un estudiante con una calificación mayor a 90.
SELECT
title
FROM
courses
WHERE EXISTS (
SELECT 1
FROM enrollments
WHERE
courses.id = enrollments.course_id
AND grade > 90
);
-- Listar los estudiantes que están matriculados en todos los cursos que 'Alice Johnson' está matriculada.
SELECT
name
FROM students
WHERE EXISTS (
SELECT 1
FROM
(
SELECT student_id FROM enrollments WHERE course_id
IN (
SELECT
course_id
FROM enrollments WHERE student_id IN (
SELECT id from students WHERE name = 'Alice Johnson' -- 1
)
)
) AS b
WHERE students.id = b.student_id
) AND id NOT IN (
SELECT id from students WHERE name = 'Alice Johnson' -- 1
);
--- UNION and UNION ALL
SELECT
name, 1, 2, 3 as final_column
FROM students WHERE id IN (
SELECT student_id FROM enrollments WHERE grade > 90
)
UNION ALL
SELECT
name, 5, 6, 7 as final_field
FROM students WHERE id IN (
SELECT student_id FROM enrollments WHERE grade < 70
)
UNION ALL
SELECT 'CODY', 10, 20, 30
UNION ALL
SELECT 'CODY', 10, 20, 30;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment