/* =========================================================
1) Crear BBDD y seleccionarla
========================================================= */
DROP DATABASE IF EXISTS salud_imc;
CREATE DATABASE salud_imc
CHARACTER SET utf8mb4
COLLATE utf8mb4_spanish_ci;
USE salud_imc;
/* =========================================================
2) Crear tabla PERSONAS
(Añadimos PK para buenas prácticas)
========================================================= */
DROP TABLE IF EXISTS personas;
CREATE TABLE personas (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(20) NOT NULL,
fnac DATE,
peso DECIMAL(8,2),
altura DECIMAL(4,2)
) ENGINE=InnoDB;
/* =========================================================
3) Insertar datos de ejemplo
========================================================= */
INSERT INTO personas (nombre, fnac, peso, altura) VALUES
('ANA', '1997-11-23', 53, 1.52),
('LUIS', '2000-05-28', 80, 1.80),
('DAVID', '1997-06-07', 63, 1.75);
/* =========================================================
4) Crear función IMC
- Controlamos división por 0 o altura NULL
========================================================= */
DROP FUNCTION IF EXISTS imc;
DELIMITER //
CREATE FUNCTION imc(p_peso DECIMAL(8,2), p_altura DECIMAL(4,2))
RETURNS DECIMAL(5,2)
DETERMINISTIC
BEGIN
DECLARE v_imc DECIMAL(5,2);
-- Validación básica para evitar errores
IF p_altura IS NULL OR p_altura <= 0 OR p_peso IS NULL OR p_peso <= 0 THEN
RETURN NULL;
END IF;
SET v_imc = p_peso / (p_altura * p_altura);
RETURN v_imc;
END//
DELIMITER ;
/* =========================================================
5) Pruebas
========================================================= */
-- Prueba 1: Ver datos
SELECT * FROM personas;
-- Prueba 2: Probar la función con valores directos
SELECT imc(53, 1.52) AS imc_ana;
SELECT imc(80, 1.80) AS imc_luis;
SELECT imc(63, 1.75) AS imc_david;
-- Prueba 3: Calcular IMC para todas las personas en una consulta
SELECT
nombre,
fnac,
peso,
altura,
imc(peso, altura) AS imc
FROM personas;
-- Prueba 4 (opcional): Clasificación simple por rangos de IMC
SELECT
nombre,
imc(peso, altura) AS imc,
CASE
WHEN imc(peso, altura) < 18.5 THEN 'Bajo peso'
WHEN imc(peso, altura) < 25 THEN 'Normopeso'
WHEN imc(peso, altura) < 30 THEN 'Sobrepeso'
ELSE 'Obesidad'
END AS categoria
FROM personas;