Ejercicios SQL - Base de Datos Hospital

Practica consultas SQL con escenarios reales de un hospital

Cómo usar el simulador

Antes de comenzar con los ejercicios, ve al simulador en: https://learndb.online/simulador-sql

Selecciona la base de datos hospital en el selector de bases de datos del simulador. Una vez seleccionada, podrás ejecutar las consultas copiadas desde este sitio.


Nivel Básico

Ejercicio 1: Listar todas las especialidades

Muestra todas las especialidades médicas disponibles en el hospital.

Básico

Tabla esperada:

id nombre descripcion
1 Cardiología Especialidad del corazón y sistema cardiovascular
2 Neurología Especialidad del sistema nervioso
3 Pediatría Especialidad en medicina infantil
4 Traumatología Especialidad en huesos y articulaciones
5 Medicina General Atención médica general
Tips para este ejercicio
Usa SELECT * para obtener todas las columnas de la tabla especialidades
No necesitas condiciones WHERE para este ejercicio básico
Recuerda terminar siempre la consulta con punto y coma (;)

Ejercicio 2: Doctores activos

Lista todos los doctores que están activos (activo = 1).

Básico

Tabla esperada:

nombre apellido años_experiencia
Carlos Rodríguez 15
María González 12
Ana López 8
Pedro Martínez 20
Laura Sánchez 6
Tips para este ejercicio
Usa la cláusula WHERE activo = 1 para filtrar solo doctores activos
Selecciona solo las columnas necesarias: nombre, apellido y años_experiencia
Los valores numéricos no necesitan comillas en la condición WHERE

Ejercicio 3: Pacientes con seguro FONASA

Muestra los pacientes que tienen seguro FONASA.

Básico

Tabla esperada:

nombre apellido seguro_medico
Juan Pérez FONASA
Diego Morales FONASA
Miguel Torres FONASA
Tips para este ejercicio
Usa WHERE seguro_medico = 'FONASA' para filtrar por tipo de seguro
Los valores de texto (strings) deben ir entre comillas simples
SQL es sensible a mayúsculas en los valores literales, usa 'FONASA' exactamente

Ejercicio 4: Doctores ordenados por experiencia

Lista todos los doctores ordenados por años de experiencia de mayor a menor.

Básico

Tabla esperada:

nombre_completo años_experiencia
Pedro Martínez 20
Roberto Fernández 18
Carlos Rodríguez 15
María González 12
Ana López 8
Laura Sánchez 6
Tips para este ejercicio
Usa ORDER BY años_experiencia DESC para ordenar de mayor a menor
Combina nombre y apellido con el operador || para crear un alias
Usa AS nombre_completo para darle un nombre a la columna combinada

Nivel Intermedio - JOINs

Ejercicio 5: Doctores y sus especialidades

Muestra el nombre completo de cada doctor junto con el nombre de su especialidad.

Intermedio

Tabla esperada:

doctor especialidad
Carlos Rodríguez Cardiología
María González Neurología
Ana López Pediatría
Pedro Martínez Traumatología
Laura Sánchez Medicina General
Roberto Fernández Cardiología
Tips para este ejercicio
Usa JOIN especialidades e ON d.especialidad_id = e.id para conectar tablas
Asigna alias cortos (d para doctores, e para especialidades) para más claridad
El JOIN conecta donde la columna especialidad_id coincide con el id de especialidades

Solución SQL:

SELECT d.nombre || ' ' || d.apellido AS doctor, e.nombre AS especialidad FROM doctores d JOIN especialidades e ON d.especialidad_id = e.id;
Explicación de la consulta
Esta consulta combina información de dos tablas para mostrar cada doctor con su especialidad médica. Usa un JOIN para conectar doctores con sus especialidades mediante el ID.

Componentes utilizados:

d.nombre || ' ' || d.apellido AS doctor - Combina nombre y apellido
e.nombre AS especialidad - Obtiene nombre de especialidad
FROM doctores d - Tabla principal con alias 'd'
JOIN especialidades e - Une con tabla especialidades
ON d.especialidad_id = e.id - Conecta donde coinciden los IDs
; - Termina la consulta SQL

Ejercicio 6: Pacientes con sus citas y doctores

Muestra los pacientes, fechas de citas y nombres de los doctores que los atienden.

Intermedio

Tabla esperada:

paciente doctor fecha_cita motivo
Juan Pérez Carlos Rodríguez 2024-02-15 09:00:00 Control cardiológico
Carmen Silva María González 2024-02-16 14:30:00 Dolor de cabeza recurrente
Diego Morales Ana López 2024-02-17 10:15:00 Control de crecimiento
Elena Vargas Pedro Martínez 2024-02-18 11:00:00 Dolor en rodilla
Miguel Torres Laura Sánchez 2024-02-19 08:30:00 Chequeo general
Juan Pérez Laura Sánchez 2024-02-20 16:00:00 Consulta por gripe
Tips para este ejercicio
Usa múltiples JOINs para conectar las tres tablas: pacientes → citas → doctores
Ordena por fecha_hora para mostrar las citas cronológicamente
La tabla citas es la tabla central que conecta pacientes con doctores

Solución SQL:

SELECT p.nombre || ' ' || p.apellido AS paciente, d.nombre || ' ' || d.apellido AS doctor, c.fecha_hora AS fecha_cita, c.motivo FROM pacientes p JOIN citas c ON p.id = c.paciente_id JOIN doctores d ON c.doctor_id = d.id ORDER BY c.fecha_hora;
Explicación de la consulta
Esta consulta muestra un calendario completo de citas con información de pacientes y doctores. Conecta tres tablas para mostrar quién se cita con quién y cuándo.

Componentes utilizados:

p.nombre || ' ' || p.apellido AS paciente - Nombre completo del paciente
d.nombre || ' ' || d.apellido AS doctor - Nombre completo del doctor
c.fecha_hora AS fecha_cita - Fecha y hora de la cita
c.motivo - Motivo de la consulta
FROM pacientes p JOIN citas c - Conecta pacientes con sus citas
JOIN doctores d - Conecta citas con doctores
ORDER BY c.fecha_hora - Ordena cronológicamente
; - Termina la consulta SQL

Ejercicio 7: Tratamientos con información de pacientes

Muestra los tratamientos con nombres de pacientes, doctores y especialidades.

Intermedio

Tabla esperada:

paciente doctor especialidad medicamento diagnostico
Juan Pérez Carlos Rodríguez Cardiología Enalapril Hipertensión arterial leve
Juan Pérez Carlos Rodríguez Cardiología Aspirina Hipertensión arterial leve
Carmen Silva María González Neurología Ibuprofeno Cefalea tensional
Carmen Silva María González Neurología Relajante muscular Cefalea tensional

Solución SQL:

SELECT p.nombre || ' ' || p.apellido AS paciente, d.nombre || ' ' || d.apellido AS doctor, e.nombre AS especialidad, t.medicamento, t.diagnostico FROM tratamientos t JOIN citas c ON t.cita_id = c.id JOIN pacientes p ON c.paciente_id = p.id JOIN doctores d ON c.doctor_id = d.id JOIN especialidades e ON d.especialidad_id = e.id ORDER BY p.nombre, t.medicamento;
Explicación de la consulta
Esta consulta muestra todos los tratamientos médicos con información completa del paciente, doctor, especialidad y diagnóstico. Conecta 5 tablas para obtener un reporte detallado de tratamientos.

Componentes utilizados:

FROM tratamientos t - Tabla principal de tratamientos
JOIN citas c - Conecta tratamientos con citas
JOIN pacientes p - Obtiene datos del paciente
JOIN doctores d - Obtiene datos del doctor
JOIN especialidades e - Obtiene especialidad médica
ORDER BY p.nombre, t.medicamento - Ordena por paciente y medicamento
; - Termina la consulta SQL

Ejercicio 8: Doctores con más de 10 años y sus especialidades

Muestra los doctores con más de 10 años de experiencia y sus especialidades.

Intermedio

Tabla esperada:

doctor especialidad años_experiencia
Carlos Rodríguez Cardiología 15
María González Neurología 12
Pedro Martínez Traumatología 20
Roberto Fernández Cardiología 18

Solución SQL:

SELECT d.nombre || ' ' || d.apellido AS doctor, e.nombre AS especialidad, d.años_experiencia FROM doctores d JOIN especialidades e ON d.especialidad_id = e.id WHERE d.años_experiencia > 10 ORDER BY d.años_experiencia DESC;
Explicación de la consulta
Esta consulta identifica doctores con experiencia senior (más de 10 años) y muestra su especialidad. Combina filtro de experiencia con información de especialidad médica.

Componentes utilizados:

FROM doctores d JOIN especialidades e - Conecta doctores con especialidades
WHERE d.años_experiencia > 10 - Filtra doctores experimentados
ORDER BY d.años_experiencia DESC - Ordena por experiencia descendente
d.nombre || ' ' || d.apellido AS doctor - Nombre completo del doctor
e.nombre AS especialidad - Nombre de la especialidad
; - Termina la consulta SQL

Ejercicio 9: Citas completadas con especialidades

Muestra las citas completadas incluyendo la especialidad médica.

Intermedio

Tabla esperada:

paciente doctor especialidad fecha_cita motivo
Juan Pérez Carlos Rodríguez Cardiología 2024-02-15 09:00:00 Control cardiológico
Carmen Silva María González Neurología 2024-02-16 14:30:00 Dolor de cabeza recurrente

Solución SQL:

SELECT p.nombre || ' ' || p.apellido AS paciente, d.nombre || ' ' || d.apellido AS doctor, e.nombre AS especialidad, c.fecha_hora AS fecha_cita, c.motivo FROM pacientes p JOIN citas c ON p.id = c.paciente_id JOIN doctores d ON c.doctor_id = d.id JOIN especialidades e ON d.especialidad_id = e.id WHERE c.estado = 'Completada';
Explicación de la consulta
Esta consulta muestra el historial de citas que ya fueron completadas. Filtra las citas por estado 'Completada' y muestra información completa del paciente, doctor y especialidad.

Componentes utilizados:

FROM pacientes p JOIN citas c - Conecta pacientes con citas
JOIN doctores d - Conecta citas con doctores
JOIN especialidades e - Obtiene especialidades médicas
WHERE c.estado = 'Completada' - Filtra solo citas completadas
p.nombre || ' ' || p.apellido AS paciente - Nombre completo del paciente
; - Termina la consulta SQL

Ejercicio 10: Pacientes agrupados por seguro médico

Cuenta cuántos pacientes hay por cada tipo de seguro médico.

Intermedio

Tabla esperada:

seguro_medico cantidad_pacientes
FONASA 3
ISAPRE 2

Solución SQL:

SELECT seguro_medico, COUNT(*) AS cantidad_pacientes FROM pacientes GROUP BY seguro_medico ORDER BY cantidad_pacientes DESC;
Explicación de la consulta
Esta consulta agrupa pacientes por tipo de seguro médico y cuenta cuántos pacientes hay en cada categoría. Muestra una distribución estadística de los seguros médicos.

Componentes utilizados:

SELECT seguro_medico, COUNT(*) AS cantidad_pacientes - Selecciona seguro y cuenta pacientes
FROM pacientes - Consulta la tabla de pacientes
GROUP BY seguro_medico - Agrupa por tipo de seguro
COUNT(*) - Cuenta todos los registros en cada grupo
ORDER BY cantidad_pacientes DESC - Ordena de mayor a menor cantidad
; - Termina la consulta SQL

Nivel Avanzado - JOINs Múltiples

Ejercicio 11: Reporte completo de citas y tratamientos

Genera un reporte completo que muestre las citas con sus tratamientos, incluyendo toda la información relacionada.

Avanzado

Tabla esperada:

paciente doctor especialidad fecha_cita diagnostico medicamento dosis
Juan Pérez Carlos Rodríguez Cardiología 2024-02-15 09:00:00 Hipertensión arterial leve Enalapril 10mg
Juan Pérez Carlos Rodríguez Cardiología 2024-02-15 09:00:00 Hipertensión arterial leve Aspirina 100mg
Carmen Silva María González Neurología 2024-02-16 14:30:00 Cefalea tensional Ibuprofeno 400mg
Carmen Silva María González Neurología 2024-02-16 14:30:00 Cefalea tensional Relajante muscular 10mg
Tips para este ejercicio
Usa LEFT JOIN tratamientos para incluir citas que pueden no tener tratamientos
Filtra con WHERE t.id IS NOT NULL para mostrar solo citas con tratamientos
Conecta 5 tablas en orden lógico: pacientes → citas → doctores → especialidades → tratamientos

Solución SQL:

SELECT p.nombre || ' ' || p.apellido AS paciente, d.nombre || ' ' || d.apellido AS doctor, e.nombre AS especialidad, c.fecha_hora AS fecha_cita, t.diagnostico, t.medicamento, t.dosis FROM pacientes p JOIN citas c ON p.id = c.paciente_id JOIN doctores d ON c.doctor_id = d.id JOIN especialidades e ON d.especialidad_id = e.id LEFT JOIN tratamientos t ON c.id = t.cita_id WHERE t.id IS NOT NULL ORDER BY c.fecha_hora, t.medicamento;
Explicación de la consulta
Esta consulta genera un reporte médico completo mostrando solo citas que tienen tratamientos asignados. Usa LEFT JOIN para incluir todas las citas y luego filtra para mostrar solo aquellas con tratamiento.

Componentes utilizados:

FROM pacientes p JOIN citas c - Conecta pacientes con sus citas
JOIN doctores d - Conecta citas con doctores
JOIN especialidades e - Obtiene especialidades médicas
LEFT JOIN tratamientos t - Incluye citas que podrían no tener tratamiento
WHERE t.id IS NOT NULL - Filtra solo citas con tratamiento
ORDER BY c.fecha_hora, t.medicamento - Ordena por fecha y medicamento
; - Termina la consulta SQL

Ejercicio 12: Pacientes con múltiples citas

Encuentra los pacientes que tienen más de una cita y muestra cuántas tienen.

Avanzado

Tabla esperada:

paciente seguro_medico total_citas
Juan Pérez FONASA 2
Tips para este ejercicio
Usa GROUP BY para agrupar citas por paciente y contarlas con COUNT()
Filtra grupos con HAVING COUNT(c.id) > 1 para encontrar pacientes con múltiples citas
Include todas las columnas seleccionadas no agregadas en el GROUP BY

Solución SQL:

SELECT p.nombre || ' ' || p.apellido AS paciente, p.seguro_medico, COUNT(c.id) AS total_citas FROM pacientes p JOIN citas c ON p.id = c.paciente_id GROUP BY p.id, p.nombre, p.apellido, p.seguro_medico HAVING COUNT(c.id) > 1 ORDER BY total_citas DESC;
Explicación de la consulta
Esta consulta identifica pacientes que tienen más de una cita médica. Agrupa las citas por paciente y usa HAVING para filtrar solo aquellos con múltiples citas.

Componentes utilizados:

SELECT ... COUNT(c.id) AS total_citas - Cuenta citas por paciente
FROM pacientes p JOIN citas c - Conecta pacientes con sus citas
GROUP BY p.id, p.nombre, p.apellido, p.seguro_medico - Agrupa por paciente
HAVING COUNT(c.id) > 1 - Filtra grupos con más de una cita
ORDER BY total_citas DESC - Ordena de mayor a menor cantidad
; - Termina la consulta SQL

Ejercicio 13: Especialidades con más citas

Muestra cuántas citas ha atendido cada especialidad, ordenadas de mayor a menor.

Avanzado

Tabla esperada:

especialidad total_citas citas_completadas citas_programadas
Medicina General 2 0 1
Cardiología 1 1 0
Neurología 1 1 0
Pediatría 1 0 1
Traumatología 1 0 1
Tips para este ejercicio
Usa CASE WHEN para contar citas por estado en columnas separadas
Utiliza LEFT JOINs para incluir especialidades que pueden no tener citas
Agrupa por especialidad para contar todas las citas de cada área médica

Solución SQL:

SELECT e.nombre AS especialidad, COUNT(c.id) AS total_citas, SUM(CASE WHEN c.estado = 'Completada' THEN 1 ELSE 0 END) AS citas_completadas, SUM(CASE WHEN c.estado = 'Programada' THEN 1 ELSE 0 END) AS citas_programadas FROM especialidades e LEFT JOIN doctores d ON e.id = d.especialidad_id LEFT JOIN citas c ON d.id = c.doctor_id GROUP BY e.nombre, e.id ORDER BY total_citas DESC;
Explicación de la consulta
Esta consulta analiza la carga de trabajo por especialidad médica, contando citas totales y clasificándolas por estado. Usa CASE WHEN para crear columnas de conteo condicional.

Componentes utilizados:

FROM especialidades e LEFT JOIN doctores d - Incluye especialidades sin doctores
LEFT JOIN citas c - Incluye especialidades sin citas
COUNT(c.id) AS total_citas - Cuenta todas las citas
SUM(CASE WHEN c.estado = 'Completada' THEN 1 ELSE 0 END) - Cuenta citas completadas
SUM(CASE WHEN c.estado = 'Programada' THEN 1 ELSE 0 END) - Cuenta citas programadas
GROUP BY e.nombre, e.id - Agrupa por especialidad
; - Termina la consulta SQL

Ejercicio 14: Doctores con pacientes por seguro médico

Muestra cuántos pacientes diferentes atiende cada doctor según su tipo de seguro.

Avanzado

Tabla esperada:

doctor especialidad seguro_medico cantidad_pacientes
Carlos Rodríguez Cardiología FONASA 1
María González Neurología ISAPRE 1
Ana López Pediatría FONASA 1
Pedro Martínez Traumatología ISAPRE 1
Laura Sánchez Medicina General FONASA 1
Tips para este ejercicio
Usa COUNT(DISTINCT p.id) para contar pacientes únicos y evitar duplicados
Agrupa por doctor y seguro médico para ver la distribución de pacientes
Conecta múltiples tablas para obtener información completa del doctor-paciente

Solución SQL:

SELECT d.nombre || ' ' || d.apellido AS doctor, e.nombre AS especialidad, p.seguro_medico, COUNT(DISTINCT p.id) AS cantidad_pacientes FROM doctores d JOIN especialidades e ON d.especialidad_id = e.id JOIN citas c ON d.id = c.doctor_id JOIN pacientes p ON c.paciente_id = p.id GROUP BY d.id, d.nombre, d.apellido, e.nombre, p.seguro_medico ORDER BY d.nombre, p.seguro_medico;
Explicación de la consulta
Esta consulta muestra la distribución de pacientes que atiende cada doctor según su tipo de seguro. Agrupa por doctor y seguro para analizar la cartera de pacientes de cada médico.

Componentes utilizados:

FROM doctores d JOIN especialidades e - Conecta doctores con especialidades
JOIN citas c - Conecta doctores con sus citas
JOIN pacientes p - Conecta citas con pacientes
COUNT(DISTINCT p.id) AS cantidad_pacientes - Cuenta pacientes únicos
GROUP BY d.id, ..., p.seguro_medico - Agrupa por doctor y seguro
ORDER BY d.nombre, p.seguro_medico - Ordena por doctor y tipo de seguro
; - Termina la consulta SQL

Ejercicio 15: Pacientes sin citas programadas

Encuentra los pacientes que no tienen citas programadas usando LEFT JOIN.

Avanzado

Tabla esperada:

nombre apellido seguro_medico telefono
Elena Vargas ISAPRE +56955111213
Miguel Torres FONASA +56977111213
Tips para este ejercicio
Usa LEFT JOIN para incluir todos los pacientes, incluso sin citas
Filtra con WHERE c.id IS NULL para encontrar pacientes sin coincidencias
Agrega condición c.estado = 'Programada' en el JOIN para filtrar solo citas programadas

Solución SQL:

SELECT p.nombre, p.apellido, p.seguro_medico, p.telefono FROM pacientes p LEFT JOIN citas c ON p.id = c.paciente_id AND c.estado = 'Programada' WHERE c.id IS NULL ORDER BY p.apellido;
Explicación de la consulta
Esta consulta identifica pacientes que no tienen citas programadas. Usa LEFT JOIN para incluir todos los pacientes y filtra aquellos que no tienen citas con estado 'Programada'.

Componentes utilizados:

FROM pacientes p LEFT JOIN citas c - Incluye todos los pacientes
ON p.id = c.paciente_id AND c.estado = 'Programada' - Conecta solo citas programadas
WHERE c.id IS NULL - Filtra pacientes sin citas programadas
LEFT JOIN - Mantiene pacientes aunque no tengan citas
ORDER BY p.apellido - Ordena alfabéticamente por apellido
; - Termina la consulta SQL