UNIVERSIDAD NACIONAL DEL ALTIPLANO PUNO
FACULTAD DE INGENIERIA ESTADISTICA E
INFORMATICA
ESCUELA PROFESIONAL DE INGENIERIA ESTADISTICA E
INFORMATICA
BASE DE DATOS DE UN
HOSPITAL
ING. CAUNA HUANCA GERARDINO JUVENAL
INTEGRANTES:
- Aquino Nolasco Georgina Sharon 228412
- Humiri Ramos Maria Roxana 227458
- Quea Deza Ruth Jimena 229532
- Calcina Mango Yulissa Nataly del Carmen 22
Puno – Perú
2024
Contenido
Introducción............................................................................................2
Base de Datos de un Hospital.................................................................2
Consultas de JOIN:..................................................................................3
INNER JOIN:........................................................................................3
LEFT JOIN:...........................................................................................3
RIGHT JOIN:.........................................................................................4
Consultas de DISTINCT:.........................................................................5
Consulta 1:...........................................................................................5
Consulta 2:...........................................................................................5
Consultas de GROUP BY:........................................................................5
consulta 1:............................................................................................6
consulta 2:............................................................................................6
Procedimientos Almacenados:................................................................7
1° consulta:...........................................................................................7
2° Consulta:..........................................................................................8
3° consulta:...........................................................................................9
Funciones Personalizadas:....................................................................10
1° consulta..........................................................................................10
PÁGINA 1
2° consulta..........................................................................................11
3° consulta..........................................................................................12
Consultas de TRIGGERS:......................................................................12
1° consulta:.........................................................................................12
2° consulta:.........................................................................................13
3° consulta:.........................................................................................14
Conclusión:............................................................................................15
PÁGINA 2
Introducción
La gestión de datos en el ámbito hospitalario es esencial para
garantizar un funcionamiento eficiente, mejorar la calidad de la
atención médica y asegurar que los recursos se utilicen de manera
óptima. En un entorno tan dinámico como el de un hospital, la
información debe ser gestionada de forma precisa y accesible para
todos los actores involucrados, desde médicos hasta personal
administrativo. Las bases de datos permiten centralizar y organizar
toda la información crítica, incluyendo los datos de los pacientes, sus
citas, médicos asignados, historiales médicos y especialidades, entre
otros.
El uso de consultas SQL avanzadas, como JOIN, DISTINCT y GROUP
BY, permite no solo almacenar la información de manera estructurada,
sino también extraer y analizar datos valiosos para la toma de
decisiones. Este enfoque optimiza la gestión de recursos, mejora el
seguimiento de pacientes y facilita la obtención de estadísticas
relevantes que apoyan la mejora continua de los servicios de salud.
Base de Datos de un Hospital
Se crearon 7 tablas de las cuales realizaremos las diversas consultas
SQL, a lo largo del aprendizaje en esta unidad. La tabla principal seria
PÁGINA 3
Citas ya que en ahí es donde se tiene la información de todo lo
necesario. Fig.1.
Figura 1. TABLAS
En estas consultas usaremos diferentes consultas como unir tablas,
eliminar e incluso consultas de triggers para así tener procedimiento y
funciones. (fig.2)
Figura 2. Base de Datos
Consultas de JOIN:
Las consultas JOIN en SQL se utilizan para combinar datos de dos o
más tablas basadas en una condición relacionada. Permiten que los
PÁGINA 4
datos se unan de acuerdo con un campo común que existe en las tablas
que se están combinando.
Ayudan a realizar análisis complejos, generar informes detallados y
mantener la integridad de los datos en bases de datos relacionales.
INNER JOIN:
Es ideal para obtener solo las filas donde existen coincidencias entre
las tablas, proporcionando una vista filtrada de los datos combinados.
La consulta nos permite unir las tablas paciente y citas mediante la
clave foránea pacientes_id en la tabla citas y el campo id en la tabla
pacientes. Esta consulta en este caso que es de un hospital permite al
personal médico o como puede ser también un administrativo
consultar información clave sobre quien tiene citas agendadas y para
que [Link].3.
SELECT [Link], [Link], [Link],
[Link], [Link]
FROM pacientes
INNER JOIN citas ON [Link] = citas.paciente_id;
PÁGINA 5
Figura 3. Resultado de INNER JOIN
LEFT JOIN:
Permite incluir todas las filas de la tabla principal, lo que es útil para
informes que deben mostrar todos los elementos de una tabla
principal, aunque no tengan información relacionada.
Esta consulta asegura que se incluya todos los registros de la table
médicos, aunque no tengan coincidencia en la tabla citas. Si algún
medico no tuviera citas, las columnas de fecha y hora aparecerán con
los valores NULL, en este caso nuestros médicos registrados tienen
citas agendadas. Este tipo de consultas es útil para generar reportes
para programar citas futuras o asignar nuevas tareas a médicos sin
citas agendadas.
La consulta devuelve una lista de todos los médicos, mostrando su
nombre y apellido, y, si existen, la fecha y hora de las citas
[Link].4.
SELECT [Link], [Link], [Link],
PÁGINA 6
[Link]
FROM medicos
LEFT JOIN citas ON [Link] = citas.medico_id;
Figura 4. Consulta LEFT JOIN
RIGHT JOIN:
Se usa cuando se necesita obtener todos los registros de la tabla
secundaria con o sin coincidencias en la primaria.
La consulta relaciona las tablas habitaciones, ingresos y pacientes para
mostrar información sobre las habitaciones ocupadas y los pacientes
asignados. Utiliza un RIGHT JOIN para garantizar que todos los
registros de la tabla ingresos aparezcan, incluso si no hay una
habitación asignada, dejando sus columnas como NULL. También
emplea un LEFT JOIN para incluir los datos de pacientes asociados a
los ingresos, asignando NULL en caso de que no exista relación.
Selecciona específicamente el número y tipo de habitación, junto con
los nombres y apellidos de los pacientes, permitiendo identificar
PÁGINA 7
ocupaciones o ingresos incompletos. La consulta es útil para gestionar
habitaciones y verificar la asignación de pacientes en el [Link].5.
SELECT [Link], [Link],
[Link], [Link]
FROM habitaciones
RIGHT JOIN ingresos ON [Link] =
ingresos.habitacion_id
Figura 5. Consulta RIGHT JOIN.
Consultas de DISTINCT:
La cláusula DISTINCT se utiliza para eliminar duplicados y devolver
solo valores únicos en el resultado de una consulta.
CONSULTA 1:
La primera consulta con DISTINCT, elimina duplicados del campo
nombre en la tabla especialidades, solo nos mostrara una vez cada
especialidad, aunque haya varios médicos con la misma especialidad.
Fig.6.
PÁGINA 8
SELECT DISTINCT nombre
FROM especialidades;
Figura 6. Consulta Distinct.
CONSULTA 2:
La consulta elimina los duplicados. Primeramente, accede a la columna
género y luego, con la palabra clave DISTINCT, muestra solo los
valores diferentes. El resultado es una lista sin repeticiones de los
géneros registrados, útil para análisis demográficos o estadísticos.
SELECT DISTINCT genero
FROM pacientes;
Figura 7. Genero de Pacientes
PÁGINA 9
Consultas de GROUP BY:
Se utiliza para agrupar filas que tienen los mismos valores en una o
más columnas. Se combina a menudo con funciones de agregación
(SUM, COUNT, AVG, etc.) para realizar operaciones en grupos de
datos y se usa para obtener resultados únicos..
CONSULTA 1:
En esta consulta cuenta cuántos médicos hay en cada especialidad y
muestra el nombre de la especialidad junto con el número de médicos.
El GROUP BY se aplica a la columna [Link],
agrupando todos los médicos de la misma especialidad.
SELECT [Link], COUNT([Link]) AS
numero_medicos
FROM medicos
JOIN especialidades ON medicos.especialidad_id =
[Link]
GROUP BY [Link];
PÁGINA 10
Figura 8. Consulta de Especialidades y Médicos.
CONSULTA 2:
En esta consulta se va a seleccionar los nombres y apellidos de los
médicos y cuenta cuántas citas ha tenido cada uno. Para hacerlo,
realiza un LEFT JOIN entre las tablas médicos y citas, uniendo la
información de los médicos con las citas que han sido asignadas a
ellos. Luego, agrupa los resultados por el ID, nombre y apellido de
cada médico, asegurando que cada médico sea un grupo único.
Finalmente, utiliza la función COUNT ([Link]) para contar el número
de citas asociadas a cada médico dentro de su respectivo grupo. Fig.9.
SELECT [Link], [Link], COUNT([Link])
AS total_citas
FROM medicos
LEFT JOIN citas ON [Link] = citas.medico_id
GROUP BY [Link], [Link], [Link];
PÁGINA 11
Figura 9. Total, de citas.
Procedimientos Almacenados:
Es un procedimiento almacenado es un conjunto de instrucciones SQL
predefinidas y almacenadas en la base de datos. Estos procedimientos
pueden ser ejecutados de manera repetida, y sirven para realizar
tareas específicas o complejas, como consultas, actualizaciones,
eliminaciones de datos o transacciones.
1° CONSULTA:
La consulta define un procedimiento almacenado con varios
parámetros de entrada como apellidos, nombres, DNI, etc. Estos
corresponden a los campos de la tabla pacientes. En el procedimiento,
se utiliza una instrucción INSERT INTO para agregar un nuevo
registro a la tabla pacientes utilizando los valores pasados como
parámetros, cuando se ejecute el procedimiento, se insertarán los
PÁGINA 12
datos proporcionados en la tabla, simplificando el proceso de inserción
de nuevos pacientes. Fig.10.
DELIMITER //
CREATE PROCEDURE agregar_paciente(
IN apellidos VARCHAR(255),
IN nombres VARCHAR(255),
IN dni VARCHAR(20),
IN fecha_nacimiento DATE,
IN genero VARCHAR(10),
IN telefono VARCHAR(20),
IN correo VARCHAR(255),
IN direccion TEXT
BEGIN
INSERT INTO pacientes (apellidos, nombres, dni,
fecha_nacimiento, genero, telefono, correo, direccion)
VALUES (apellidos, nombres, dni, fecha_nacimiento, genero,
telefono, correo, direccion);
PÁGINA 13
END //
DELIMITER ;
Figura 10. Insertar de Manera Automatizado
2° CONSULTA:
La consulta acepta un parámetro de entrada especialidad_nombre que
se utiliza para filtrar las citas por especialidad. La consulta hace un
JOIN entre las tablas citas, medicos, especialidades y pacientes, y
luego filtra los resultados mediante WHERE para mostrar solo aquellas
citas que coinciden con la especialidad proporcionada. Esto permite
obtener la información de las citas de pacientes para una especialidad
médica en particular.
El propósito de esta consulta es crear un procedimiento almacenado
llamado citas_por_especialidad, que permite consultar las citas
PÁGINA 14
programadas para una especialidad médica específica, mostrando la
fecha, hora y los datos del paciente asociado a cada cita. Fig.11.
DELIMITER //
CREATE PROCEDURE citas_por_especialidad(IN
especialidad_nombre VARCHAR(255))
BEGIN
SELECT [Link], [Link], [Link],
[Link]
FROM citas
JOIN medicos ON citas.medico_id = [Link]
JOIN especialidades ON medicos.especialidad_id =
[Link]
JOIN pacientes ON citas.paciente_id = [Link]
WHERE [Link] = especialidad_nombre;
END //
DELIMITER ;
PÁGINA 15
Figura 11. Citas por Especialidades
3° CONSULTA:
La consulta acepta dos parámetros: ingreso_id (el ID del ingreso) y
fecha_alta (la fecha de alta del paciente). Utiliza una instrucción
UPDATE para modificar el campo fecha_alta en la tabla ingresos donde
el id de ingreso coincide con el valor de ingreso_id. Esto permite
registrar la fecha de alta de un paciente en el sistema. Fig.12.
DELIMITER //
CREATE PROCEDURE dar_alta_paciente(IN ingreso_id INT, IN
fecha_alta DATE)
BEGIN
UPDATE ingresos
SET fecha_alta = fecha_alta
WHERE id = ingreso_id;
END //
PÁGINA 16
DELIMITER ;
Figura 12. Dar de Alta al Paciente
Funciones Personalizadas:
1° CONSULTA
La consulta acepta un parámetro de entrada fecha_nacimiento (de tipo
DATE) y calcula la edad de la persona utilizando la función
TIMESTAMPDIFF. Esta función calcula la diferencia en años entre la
fecha de nacimiento y la fecha actual (CURDATE()). El valor resultante
se guarda en la variable edad y se devuelve como el resultado de la
función. Esto permite obtener la edad exacta de una persona en
función de su fecha de nacimiento. Fig.13.
DELIMITER //
CREATE FUNCTION obtener_edad(fecha_nacimiento DATE)
PÁGINA 17
RETURNS INT
BEGIN
DECLARE edad INT;
SET edad = TIMESTAMPDIFF(YEAR, fecha_nacimiento,
CURDATE());
RETURN edad;
END //
DELIMITER ;
Figura 13. Obtener edad.
2° CONSULTA
La consulta recibe un parámetro habitacion_id (el ID de la habitación)
y utiliza una subconsulta con EXISTS para comprobar si hay registros
en la tabla ingresos donde la habitacion_id coincida con el
proporcionado y la fecha_alta sea NULL (lo que indica que el paciente
aún no ha sido dado de alta). Si existen tales registros, la función
establece la variable ocupada como TRUE, de lo contrario, la establece
PÁGINA 18
como FALSE. Finalmente, se devuelve el valor de ocupado, que indica
si la habitación está ocupada o libre. Fig.14.
DELIMITER //
CREATE FUNCTION habitacion_ocupada(habitacion_id INT)
RETURNS BOOLEAN
BEGIN
DECLARE ocupado BOOLEAN;
SET ocupado = EXISTS (
SELECT 1 FROM ingresos
WHERE habitacion_id = habitacion_id AND fecha_alta IS
NULL
);
RETURN ocupado;
END //
DELIMITER ;
PÁGINA 19
Figura 14. Habitación Ocupada.
3° CONSULTA
La consulta recibe un parámetro paciente_id (el ID del paciente) y
utiliza una consulta SELECT para obtener el nombre y apellido del
paciente correspondiente en la tabla pacientes. La función CONCAT se
usa para combinar el nombre y los apellidos en una sola cadena, y el
resultado se guarda en la variable nombre_completo. Finalmente, la
función devuelve el valor de nombre_completo, que es el nombre
completo del paciente. Fig.15.
DELIMITER //
CREATE FUNCTION nombre_completo_paciente(paciente_id
INT) RETURNS VARCHAR(255)
BEGIN
DECLARE nombre_completo VARCHAR(255);
SELECT CONCAT(nombres, ' ', apellidos) INTO
nombre_completo
PÁGINA 20
FROM pacientes WHERE id = paciente_id;
RETURN nombre_completo;
END //
DELIMITER ;
Figura 15. Nombre Completo Paciente
Consultas de TRIGGERS:
Un trigger o disparador es un tipo especial de consulta que se asocia a
una tabla o vista y se ejecuta automáticamente en respuesta a ciertos
eventos (como inserciones, actualizaciones o eliminaciones) que
ocurren en esa tabla o vista. Los triggers permiten ejecutar acciones
de forma automática sin necesidad de intervención directa de los
usuarios o aplicaciones.
1° CONSULTA:
Este trigger se activa antes de que se inserte un nuevo registro en la
tabla pacientes. La acción que realiza es verificar si el DNI del
PÁGINA 21
paciente que se intenta insertar ya existe en la base de datos. Si el DNI
ya está registrado, el trigger genera un error y evita la inserción del
nuevo paciente, enviando el mensaje 'El DNI ya existe.'. Este tipo de
trigger asegura que no haya registros duplicados de pacientes debido
a un error al ingresar datos. Fig.16.
DELIMITER //
CREATE TRIGGER antes_de_insertar_paciente
BEFORE INSERT ON pacientes
FOR EACH ROW
BEGIN
IF EXISTS (SELECT 1 FROM pacientes WHERE dni =
[Link]) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'El
DNI ya existe.';
END IF;
END //
DELIMITER ;
PÁGINA 22
Figura 16. DNI existe o no existe.
2° CONSULTA:
Este trigger se activa después de la inserción de un nuevo registro en
la tabla ingresos. La acción que realiza es actualizar el estado de la
habitación en la tabla habitaciones para marcarla como "Ocupada" una
vez que un paciente ha sido ingresado en el hospital. El trigger usa
NEW.habitacion_id para hacer referencia al id de la habitación
asociada al ingreso. Fig.17.
DELIMITER //
CREATE TRIGGER actualizar_habitacion_al_ingresar
AFTER INSERT ON ingresos
FOR EACH ROW
BEGIN
UPDATE habitaciones
SET estado = 'Ocupada'
WHERE id = NEW.habitacion_id;
PÁGINA 23
END //
DELIMITER ;
Figura 17. Ocupada
3° CONSULTA:
Este trigger se activa después de que se actualiza un registro en la
tabla ingresos. En este caso, verifica si la fecha de alta
(NEW.fecha_alta) del paciente ha sido asignada. Si es así, significa que
el paciente ha sido dado de alta, y el trigger actualiza el estado de la
habitación correspondiente en la tabla habitaciones a "Disponible", lo
que indica que la habitación ya está libre para ser ocupada por otro
paciente. Fig.18.
DELIMITER //
CREATE TRIGGER liberar_habitacion_al_dar_alta
PÁGINA 24
AFTER UPDATE ON ingresos
FOR EACH ROW
BEGIN
IF NEW.fecha_alta IS NOT NULL THEN
UPDATE habitaciones
SET estado = 'Disponible'
WHERE id = NEW.habitacion_id;
END IF;
END //
DELIMITER ;
Figura 18. Disponible
PÁGINA 25
Conclusión:
En conclusión, el uso adecuado de consultas SQL en una base de datos
hospitalaria permite gestionar y analizar de manera eficiente la
información relacionada con médicos, pacientes, citas, especialidades
y más. Estas consultas facilitan la integración de datos de múltiples
tablas, garantizando la coherencia y precisión en la gestión de
información, como el seguimiento de citas médicas y el historial de
pacientes. Además, permiten extraer información clave para la toma
de decisiones y la mejora continua de la administración hospitalaria.
El diseño de relaciones entre las tablas, utilizando claves primarias y
foráneas, asegura la integridad de los datos, lo que es crucial para
mantener un sistema confiable y libre de inconsistencias.
PÁGINA 26