Resumen JOIN

-- Relacionamos los datos de diferentes tablas con JOIN
-- Lo que hacemos es seguir el camino de las relaciones
-- Que nos vienen del modelo ER
-- Estas relaciones se implementan con los ids
-- Por lo que para hacer una consulta que relacione varias tablas hacemos:
-- 1) Identificar en que tablas tenemos la información que queremos
-- 2) Ver el camino entre esas tablas
-- 3) Identificar los ids de esas relaciones
-- Ejemplo: Direcciones de España
-- 1) La info la tengo en country y address
-- 2) El camino es country--city--address
-- 3) country-city: country_id  city-address: city_id
select * from country join city on country.country_id=city.country_id
join address on city.city_id=address.city_id;

-- El JOIN es fundamental dentro de las consultas de las bases de datos
-- Porque muy pocas veces querremos información de solo una tabla

-- A los campos y tablas les puedo poner alias
select country pais, address direccion from country c join city ci on c.country_id=ci.country_id
join address a on ci.city_id=a.city_id;

-- Generalmente para modificar el nombre que vemos de los campos y en el caso
-- de las tablas simplificar los joins

-- JOIN me muestra los registros que están relacionados, lo que no tienen
-- relación no salen. Si hay paises que no tienen ciudades o actores que
-- no tienen películas no saldrán en el JOIN
-- Para eso tenemos que usar LEFT o RIGHT para obtener TODOS los registros
-- de la tabla que está a la derecha o a la izquierda aunque
-- no tenga registros relacionados

select * from country left join city on country.country_id=city.country_id;

-- En la consulta anterior salen todos los paises incluyendo aquellos
-- que no tengan ciudades

LEFT / RIGHT joins

-- JOIN por defecto solo nos muestra valores que están relacionados
-- Si tenemos registros que no tienen elementos relacionados no salen
-- Si yo quiero que sí que salgan utilizo LEFT / RIGHT
-- Ejemplo: Todos los países que no tengan ciudades
SELECT country, city FROM country 
left join city on country.country_id=city.country_id
where city is null;

select country,city from city 
right join country on country.country_id=city.country_id;

-- Actores que no han trabajado en ninguna película
select * from actor left join film_actor on actor.actor_id=film_actor.actor_id
where actor.actor_id is null;

-- Los ejemplos anteriores solo funcionan si introducimos datos nuevos
-- Porque la BD de Sakila está cuadrada, no hay 'huecos'
INSERT INTO actor (first_name,last_name) values ('Ana','Pi')

https://www.w3schools.com/sql/sql_join_left.asp

Alias

-- Alias: a los campos y a las tablas les podemos poner alias

select first_name nombre, last_name apellidos from actor;

select first_name as nombre, last_name as apellidos from actor;

-- Se usa mucho en las tablas para simplificar los joins

select name categoria, title pelicula from
category c join film_category fc on c.category_id=fc.category_id
join film f on fc.film_id=f.film_id;

https://www.w3schools.com/sql/sql_alias.asp

Ejemplos JOIN

-- La sintaxis es tabla1 JOIN tabla2 ON tabla1.id=tabla2.id

-- Un join de una relación 1 a N
select country,city from country JOIN city ON country.country_id=city.country_id;

-- Esta sintaxis no es standard del sql, solo sirve para mysql si
-- el nombre del id es igual en las dos tablas
select country,city from country JOIN city using(country_id);

-- Un join de una relación N a N
select name,title from category join film_category 
on category.category_id = film_category.category_id
join film on film_category.film_id=film.film_id;

-- Sintaxis alternativa
select name,title from category join film_category 
using(category_id) join film using(film_id);

-- Quiero ver los clientes de Spain
select * from country join city on country.country_id=city.country_id
join address on city.city_id=address.city_id
join customer on address.address_id=customer.address_id
where country='spain';

-- Alternativa
select * from country join city using(country_id)
join address using(city_id)
join customer using(address_id)
where country='spain';

-- ¿En qué películas ha trabajado el actor de id 1?

select first_name,last_name,title from actor join film_actor on actor.actor_id=film_actor.actor_id
join film on film_actor.film_id=film.film_id
where actor.actor_id=1
order by title desc;

select first_name,last_name,title from film join film_actor on film.film_id=film_actor.film_id
join actor on film_actor.actor_id=actor.actor_id
where actor.actor_id=1;

-- Que actores han trabajado en películas de la categoría 'Comedy'
-- Uso DISTINCT para evitar que salgan valores repetidos
-- Si un actor ha trabajado en varias películas saldrá varias veces
-- En order by ordeno por dos campos, first_name y last_name
-- Para que si el nombre sea el mismo en diferentes actores
-- Se ordene por el apellido
select distinct name,first_name, last_name from category join film_category on category.category_id=film_category.category_id
join film on film_category.film_id=film.film_id
join film_actor on film.film_id=film_actor.film_id
join actor on film_actor.actor_id=actor.actor_id
where name='comedy'
order by first_name, last_name;

SQL Selección de datos (II)

-- LIKE e IN

-- Like sirve para buscar patrones sencillos en cadenas
-- LIKE es 'como' busca algo como el patrón que te indico
-- Ejemplo: Todos los médicos cuyo nombre empieza por M
-- Busca todos los nombres que tienen una M y después cualquier cantidad de letras
-- El % es como un 'comodín' que encaja con cualquier número de letras
-- Incluso con 0
SELECT * FROM medico where nombre like 'm%';

-- Ejemplos típicos de %
-- Cadena que empieza por una letra o cadena
SELECT * FROM medico where nombre like 'm%';
SELECT * FROM medico where nombre like 'ma%';
-- Cadena que acabe por una letra o cadena
SELECT * FROM medico where apellidos like '%z';
SELECT * FROM medico where apellidos like '%nez';
-- Cadena que empiece por una letra o cadena y acabe con otra
SELECT * FROM medico where apellidos like 'p%z';
SELECT * FROM medico where apellidos like 'pe%ez';
-- Cadena que contenga otra cadena
SELECT * FROM medico where apellidos like '%gue%';

-- Otras combinaciones
SELECT * FROM medico where apellidos like 'p%z s%z';

-- El guión bajo (_) encaja con un carácter
-- Busco todos los nombres que empiecen por 'ju' tengan cualquier letra y acaben en 'n'
SELECT * FROM medico where nombre like 'ju_n';
-- Todos los códigos que empiezan por M0 y acaban en 3
SELECT * FROM medico where codigo like 'M0_3';

-- En otras bases de datos permiten los corchetes [AEIOU]
-- Ejemplo: Like '[aeiou]%' 

-- ¿Qué medicos tienen pérez en el apellido?

select * from medico where apellidos like '%perez%';
-- ¿Qué medicos su teléfono acaba en 7?

select * from medico where telefono like '%7';

-- IN sirve para comproba si una cadena está en una serie de valores
-- Por ejemplo si está en una lista de nombres:

SELECT * FROM medico WHERE nombre in ('María','Ana');

SELECT * FROM medico WHERE especialidad in ('Cardiología','Neurología','Dermatología');

-- Si lo que quiero es los que no están en esa lista uso NOT IN

SELECT * FROM medico WHERE especialidad NOT IN ('Cardiología','Neurología','Dermatología');

-- Todo se puede combinar y es frecuente que así sea
-- Porque necesitamos obtener información de la base de datos
-- Del tipo que médicos han operado a más pacientes
-- Qué ingresos son de determinadas fechas y especialidades, etc...

-- Dime todos los médicos que no trabajen en cirugía
-- Cuyo apellido acabe en z o en s
-- Y su teléfono acabe en 7 o en 8

SELECT * FROM medico WHERE especialidad NOT LIKE '%cirugía%'
AND (apellidos LIKE '%z' OR apellidos LIKE '%s')
AND (telefono LIKE '%7' OR telefono LIKE '%8');

Datos de prueba para la tabla médicos


INSERT INTO medico (codigo,nombre,apellidos,telefono,especialidad)
VALUES
('M001', 'Carlos', 'González López', '600000001', 'Cardiología'),
('M002', 'María', 'Rodríguez Martínez', '600000002', 'Dermatología'),
('M003', 'Juan', 'Pérez Sánchez', '600000003', 'Pediatría'),
('M004', 'Ana', 'García Fernández', '600000004', 'Neurología'),
('M005', 'Luis', 'Martínez Gómez', '600000005', 'Oncología'),
('M006', 'Elena', 'López Díaz', '600000006', 'Ginecología'),
('M007', 'José', 'Sánchez Rodríguez', '600000007', 'Urología'),
('M008', 'Laura', 'Hernández Ruiz', '600000008', 'Psiquiatría'),
('M009', 'David', 'Jiménez Morales', '600000009', 'Oftalmología'),
('M010', 'Sara', 'Álvarez Torres', '600000010', 'Otorrinolaringología'),
('M011', 'Miguel', 'Romero Gil', '600000011', 'Traumatología'),
('M012', 'Lucía', 'Navarro Vázquez', '600000012', 'Endocrinología'),
('M013', 'Fernando', 'Ramos Castro', '600000013', 'Nefrología'),
('M014', 'Raquel', 'Domínguez Muñoz', '600000014', 'Reumatología'),
('M015', 'Javier', 'Vargas Gómez', '600000015', 'Geriatría'),
('M016', 'Patricia', 'Ortega Romero', '600000016', 'Hematología'),
('M017', 'Antonio', 'Santos Delgado', '600000017', 'Inmunología'),
('M018', 'Isabel', 'Rivas López', '600000018', 'Medicina Interna'),
('M019', 'Rafael', 'Luna Pérez', '600000019', 'Neumología'),
('M020', 'Sonia', 'Reyes Fernández', '600000020', 'Gastroenterología'),
('M021', 'Mario', 'Díaz Jiménez', '600000021', 'Anestesiología'),
('M022', 'Beatriz', 'Molina García', '600000022', 'Cirugía General'),
('M023', 'Ignacio', 'Mendoza Álvarez', '600000023', 'Cirugía Plástica'),
('M024', 'Marta', 'Crespo Gil', '600000024', 'Cirugía Cardiovascular'),
('M025', 'Víctor', 'Serrano Vázquez', '600000025', 'Cirugía Torácica'),
('M026', 'Teresa', 'Vega Torres', '600000026', 'Cirugía Pediátrica'),
('M027', 'Alberto', 'Cruz Fernández', '600000027', 'Medicina Familiar'),
('M028', 'Paula', 'Sanz Herrera', '600000028', 'Medicina Preventiva'),
('M029', 'Adrián', 'León Rojas', '600000029', 'Microbiología'),
('M030', 'Natalia', 'Gil Morales', '600000030', 'Nutrición'),
('M031', 'Francisco', 'Castillo Romero', '600000031', 'Patología'),
('M032', 'Eva', 'Medina Ruiz', '600000032', 'Radiología'),
('M033', 'Diego', 'Flores Pérez', '600000033', 'Rehabilitación'),
('M034', 'Alicia', 'Martín López', '600000034', 'Medicina del Deporte'),
('M035', 'Andrés', 'Garrido Díaz', '600000035', 'Cirugía Maxilofacial'),
('M036', 'Cristina', 'Ramos Vázquez', '600000036', 'Cirugía Oral'),
('M037', 'Jorge', 'Ruiz Gil', '600000037', 'Cirugía de la Mano'),
('M038', 'Silvia', 'Hidalgo Torres', '600000038', 'Medicina Nuclear'),
('M039', 'Víctor', 'Pardo Romero', '600000039', 'Medicina del Trabajo'),
('M040', 'Rosa', 'Márquez Álvarez', '600000040', 'Toxicología'),
('M041', 'Gabriel', 'Suárez Díaz', '600000041', 'Osteopatía'),
('M042', 'Julia', 'Carrillo Romero', '600000042', 'Cirugía Laparoscópica'),
('M043', 'Emilio', 'Vargas Herrera', '600000043', 'Cirugía Endoscópica'),
('M044', 'Verónica', 'Lara Sánchez', '600000044', 'Podología'),
('M045', 'Felipe', 'Roldán Gómez', '600000045', 'Medicina Estética'),
('M046', 'Lorena', 'Espinosa Torres', '600000046', 'Medicina Alternativa'),
('M047', 'Roberto', 'Cabrera Fernández', '600000047', 'Homeopatía'),
('M048', 'Ángel', 'Ortiz Muñoz', '600000048', 'Acupuntura'),
('M049', 'Nuria', 'Soto Vázquez', '600000049', 'Terapia Ocupacional'),
('M050', 'Héctor', 'Montes García', '600000050', 'Terapia Física'),
('M051', 'Claudia', 'Vega Ruiz', '600000051', 'Fisioterapia'),
('M052', 'Ricardo', 'Giménez Fernández', '600000052', 'Medicina Aeroespacial'),
('M053', 'Álvaro', 'Sánchez Martínez', '600000053', 'Medicina Forense'),
('M054', 'Daniel', 'Núñez García', '600000054', 'Medicina Militar'),
('M055', 'Carmen', 'Castro Gómez', '600000055', 'Medicina Tradicional China'),
('M056', 'Esteban', 'Bravo Díaz', '600000056', 'Terapia Neural'),
('M057', 'Gloria', 'Mendoza Ruiz', '600000057', 'Hipnoterapia'),
('M058', 'Juan', 'Prieto Fernández', '600000058', 'Quiropráctica'),
('M059', 'Marcos', 'Cano Gómez', '600000059', 'Kinesiología'),
('M060', 'Elisa', 'Santana Pérez', '600000060', 'Aromaterapia'),
('M061', 'Guillermo', 'Reyes Jiménez', '600000061', 'Naturopatía'),
('M062', 'Victoria', 'Aguilar Romero', '600000062', 'Reflexología'),
('M063', 'Rodrigo', 'Cano Torres', '600000063', 'Fitoterapia'),
('M064', 'Susana', 'Delgado Fernández', '600000064', 'Psicología Clínica'),
('M065', 'Federico', 'Ramos Gómez', '600000065', 'Psicoanálisis'),
('M066', 'Pilar', 'Paredes Díaz', '600000066', 'Neurocirugía'),
('M067', 'África', 'Romero López', '600000067', 'Medicina Tropical'),
('M068', 'Sergio', 'Martínez García', '600000068', 'Medicina Rural'),
('M069', 'Nicolás', 'Varela Torres', '600000069', 'Medicina del Sueño'),
('M070', 'Diana', 'Gil Muñoz', '600000070', 'Medicina de Urgencias'),
('M071', 'Mario', 'López Fernández', '600000071', 'Medicina Paliativa'),
('M072', 'Ismael', 'Jiménez Rodríguez', '600000072', 'Medicina Veterinaria'),
('M073', 'Rafael', 'Crespo Gómez', '600000073', 'Medicina Legal'),
('M074', 'Silvia', 'Flores Vázquez', '600000074', 'Medicina Genómica'),
('M075', 'Oscar', 'Ríos Romero', '600000075', 'Medicina Reproductiva'),
('M076', 'Marina', 'León Díaz', '600000076', 'Medicina Conductual'),
('M077', 'Rubén', 'Navas García', '600000077', 'Genética Médica'),
('M078', 'Tamara', 'Campos Torres', '600000078', 'Medicina Familiar y Comunitaria'),
('M079', 'Alfredo', 'Rivas Fernández', '600000079', 'Radioterapia'),
('M080', 'Adriana', 'Lorenzo Gómez', '600000080', 'Medicina de Emergencia'),
('M081', 'Jesús', 'Cruz Vázquez', '600000081', 'Cuidados Intensivos'),
('M082', 'Sofía', 'Martín Díaz', '600000082', 'Medicina Preventiva y Salud Pública'),
('M083', 'Eduardo', 'Calvo Gómez', '600000083', 'Medicina del Adolescente');

SQL Selección de datos (I)

-- sentencias sql para consultar los datos
-- Leer

-- SELECT  campo1,campo2,... | * FROM nombre_tabla [WHERE condicion]
USE sanpatras;
-- Nombre y apellidos de todos los pacientes
SELECT nombre,apellidos FROM paciente;

-- Asterisco es igual a todos los campos
SELECT * FROM paciente;

-- Podemos utilizar el nombre de la base de datos como prefijo
SELECT * FROM sanpatras.paciente;

-- Muestra todos los campos de los pacientes cuyo teléfono es '666'
SELECT * FROM paciente where telefono='666';

-- =, <, <=, >,>=, <>
-- Con el id igual a 1
SELECT * FROM medico where idmedico=1;

-- Con el id mayor que 5
SELECT * FROM medico where idmedico>5;

-- Con el id diferente de 1
SELECT * FROM medico where idmedico<>1;

-- Entre un rango puedo usar comparadores normales o BETWEEN

SELECT * FROM medico where idmedico>=2 and idmedico<=5;

SELECT * FROM medico where idmedico between 2 and 5;

-- Lo mismo para cadenas

SELECT * FROM medico where nombre>='l';

SELECT * FROM medico where nombre between 'l' and 'n';

-- Médicos que se llamen Miguel Y su id sea mayor que 7
SELECT * FROM medico where nombre='Miguel' AND idmedico>7;

-- Médicos que se llamen Miguel O se llamen Laura
SELECT * FROM medico WHERE nombre='Miguel' OR nombre='Laura';

-- Médicos que NO se llamen Miguel
SELECT * FROM medico WHERE NOT nombre='Miguel';

-- Precedencia de operadores: NOT AND OR
-- En la sentencia siguiente primero se evalua el AND y después el OR
-- El resultado no es el esperado
SELECT * FROM medico WHERE nombre='Miguel' OR nombre='Laura' AND especialidad='Neurología';

-- Lo tendríamos que reescribir así:
SELECT * FROM medico WHERE (nombre='Miguel' OR nombre='Laura') AND especialidad='Neurología';

-- Aquí no hacen falta parentesis pero si lo ponemos no pasa nada
SELECT * FROM medico WHERE (idmedico>2 and idmedico<12) OR nombre='Ana'




SQL Manipulación de datos

-- CRUD Create Read Update Delete

-- Sentencias sql para manipular los datos
-- Crear, modificar y borrar

-- Crear, insertar datos en una tabla
-- INSERT INTO nombre_tabla (campo1,campo2,...) VALUES (valor1,valor2,...)
-- Comillas simples para las cadenas, escape para comilla

INSERT INTO paciente (codigo,nombre,apellidos,direccion,telefono,fecha_nacimiento)
VALUES ('PA001','Juan','Perez','Agla 6','66699966','2000-1-1');
INSERT INTO paciente (codigo,nombre,apellidos,direccion,telefono,fecha_nacimiento)
VALUES ('PA001','Juan','Perez','L\'orizon','66699966','2000-1-1');

-- Puedo poner varios valores después de values
INSERT INTO paciente (codigo,nombre,apellidos,direccion,telefono,fecha_nacimiento)
VALUES 
('PA006','Juan','Perez','L\'orizon','66699966','2000-1-1'),
('PA007','Juan','Perez','L\'orizon','66699966','2000-1-1'),
('PA008','Juan','Perez','L\'orizon','66699966','2000-1-1'),
('PA009','Juan','Perez','L\'orizon','66699966','2000-1-1');

-- No hace falta poner todos los campos, solo aquellos que quiero rellenar
-- Aquí no pongo código y no pasa nada, solo que ese campo no tenddrá valor
INSERT INTO Medico (nombre, apellidos, telefono, especialidad)
VALUES 
('Pedro', 'López', '911234567', 'Cardiología'),
('Elena', 'Rodríguez', '912345678', 'Neurología'),
('Miguel', 'Hernández', '913456789', 'Pediatría'),
('Laura', 'García', '914567890', 'Dermatología'),
('Alberto', 'Ruiz', '915678901', 'Oncología');

-- A veces si tenemos el id dentro del insert y no queremos poner valor
-- Lo ponemos NULL

INSERT INTO ingreso (idingreso,idpaciente,idmedico,habitacion,cama,fecha)
VALUES (NULL,1,1,20,2,'2024-1-1');

-- Modificar (update)
-- UPDATE nombre_tabla SET campo1=valor1, campo2=valor2... [WHERE condicion]

-- Modifica el nombre del paciente a 'Juanito' del paciente con id=1
UPDATE paciente SET nombre='Juanito' WHERE idpaciente=1;

-- Modificamos todos los registros porque no pongo condición
UPDATE ingreso SET cama=1;

-- Podemos usar el valor anterior del campo para hacer la modificación
-- A todos los registros súmale 10 al número de la habitación
UPDATE INGRESO set habitacion=habitacion+10;

-- Puedo modificar más de  un campo a la vez
UPDATE paciente SET nombre='Juanito', apellidos='Pi', 
direccion='diputacio 23', telefono='89898989'
WHERE idpaciente=1;

-- Eliminar registros DELETE
-- DELETE FROM nombre_tabla [WHERE condicion]

-- Eliminando todos los datos de los ingresos ¡Ojo!
DELETE FROM ingreso;

-- ELimino un registro concreto
DELETE FROM paciente where idpaciente=19;

-- Elimino los registros que cumplan una condicion
DELETE FROM paciente where nombre='Juan';


Solución San Patrás

-- MySQL dump 10.13  Distrib 8.0.34, for Win64 (x86_64)
--
-- Host: localhost    Database: sanpatras
-- ------------------------------------------------------
-- Server version	5.5.5-10.4.32-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `ingreso`
--

DROP TABLE IF EXISTS `ingreso`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `ingreso` (
  `idingreso` int(11) NOT NULL,
  `idpaciente` int(11) DEFAULT NULL,
  `idmedico` int(11) DEFAULT NULL,
  `habitacion` int(11) DEFAULT NULL,
  `cama` int(11) DEFAULT NULL,
  `fecha` date DEFAULT NULL,
  PRIMARY KEY (`idingreso`),
  KEY `fk_paciente_idx` (`idpaciente`),
  KEY `fk_medico_idx` (`idmedico`),
  CONSTRAINT `fk_medico` FOREIGN KEY (`idmedico`) REFERENCES `medico` (`idmedico`) ON UPDATE NO ACTION,
  CONSTRAINT `fk_paciente` FOREIGN KEY (`idpaciente`) REFERENCES `paciente` (`idpaciente`) ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `ingreso`
--

LOCK TABLES `ingreso` WRITE;
/*!40000 ALTER TABLE `ingreso` DISABLE KEYS */;
/*!40000 ALTER TABLE `ingreso` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `medico`
--

DROP TABLE IF EXISTS `medico`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `medico` (
  `idmedico` int(11) NOT NULL AUTO_INCREMENT,
  `codigo` varchar(45) DEFAULT NULL,
  `nombre` varchar(45) DEFAULT NULL,
  `apellidos` varchar(45) DEFAULT NULL,
  `telefono` varchar(45) DEFAULT NULL,
  `especialidad` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idmedico`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `medico`
--

LOCK TABLES `medico` WRITE;
/*!40000 ALTER TABLE `medico` DISABLE KEYS */;
/*!40000 ALTER TABLE `medico` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `paciente`
--

DROP TABLE IF EXISTS `paciente`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `paciente` (
  `idpaciente` int(11) NOT NULL AUTO_INCREMENT,
  `codigo` varchar(45) DEFAULT NULL,
  `nombre` varchar(45) DEFAULT NULL,
  `apellidos` varchar(45) DEFAULT NULL,
  `direccion` varchar(45) DEFAULT NULL,
  `telefono` varchar(45) DEFAULT NULL,
  `fecha_nacimiento` date DEFAULT NULL,
  PRIMARY KEY (`idpaciente`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `paciente`
--

LOCK TABLES `paciente` WRITE;
/*!40000 ALTER TABLE `paciente` DISABLE KEYS */;
/*!40000 ALTER TABLE `paciente` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-06-25  9:53:58

Solución ejercicio

Modelo lógico

persona
idpersona int
nombre varchar(50)
apellidos varchar(50)
dni char(9)
telefono char(9)
poblacion varchar(50)
direccion varchar(100)

personavehiculo
idpersonavehiculo int
idpersona int
idvehiculo int

vehiculo
idvehiculo int
matricula char(7)
marca varchar(50)
modelo varchar(50)

vehiculoaccidente
idvehiculoaccidente int
idvehiculo int
idaccidente int

accidente
idaccidente int
referencia varchar(50)
fecha date
hora time
lugar varchar(50)
atestado text

infraccion
idinfraccion int
idvehiculo int
referencia varchar(50)
fecha date
hora time
lugar varchar(50)
importe decimal(8,2)

CREATE DATABASE  IF NOT EXISTS `accidentes` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */;
USE `accidentes`;
-- MySQL dump 10.13  Distrib 8.0.34, for Win64 (x86_64)
--
-- Host: localhost    Database: accidentes
-- ------------------------------------------------------
-- Server version	5.5.5-10.4.32-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `accidente`
--

DROP TABLE IF EXISTS `accidente`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `accidente` (
  `idaccidente` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `referencia` varchar(45) DEFAULT NULL,
  `fecha` date DEFAULT NULL,
  `hora` time DEFAULT NULL,
  `atestado` text DEFAULT NULL,
  PRIMARY KEY (`idaccidente`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `accidente`
--

LOCK TABLES `accidente` WRITE;
/*!40000 ALTER TABLE `accidente` DISABLE KEYS */;
INSERT INTO `accidente` VALUES (1,'AAAA','2024-06-20','10:00:00','Se metieron una piña gorda'),(2,'BBBB','2024-06-21','09:00:00','El accidente ocurrió en una transitada intersección en el centro de la ciudad, a las 8:30 de la mañana, durante la hora pico. Un autobús escolar que transportaba a 25 estudiantes fue impactado por un camión de reparto que no respetó la señal de alto. El choque fue tan fuerte que el autobús se volcó, provocando una situación de caos y pánico en la zona. Inmediatamente, los transeúntes y otros conductores se apresuraron a ayudar a los niños a salir del autobús volcado.\n\nEl camión de reparto, que transportaba productos perecederos, terminó empotrado contra una farola. El conductor, aparentemente distraído por un mensaje de texto en su teléfono móvil, no se dio cuenta de la señal de tráfico hasta que fue demasiado tarde. Al momento del impacto, el conductor del camión sufrió heridas en la cabeza y el pecho, y quedó atrapado en la cabina. Los servicios de emergencia llegaron rápidamente, pero tuvieron que utilizar equipos especializados para liberarlo.\n\nMientras tanto, los estudiantes y el conductor del autobús escolar también resultaron heridos, aunque ninguno de ellos de gravedad. La mayoría sufrió contusiones y rasguños, pero cuatro niños y el conductor fueron trasladados al hospital más cercano para observación y tratamiento de heridas menores. Los padres de los estudiantes fueron notificados inmediatamente, y la escuela envió personal para asistir en la evacuación y calmar a los niños afectados.\n\nLa policía cerró la intersección durante varias horas para llevar a cabo la investigación y limpiar los escombros. El accidente provocó un gran embotellamiento en las vías circundantes, afectando significativamente el flujo del tráfico en el área. Las autoridades hicieron un llamado a los conductores para que extremaran las precauciones y recordaran la importancia de no usar dispositivos móviles mientras se conduce. Este trágico incidente subraya la necesidad de respetar las señales de tráfico y mantener la atención en la carretera en todo momento.');
/*!40000 ALTER TABLE `accidente` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `infraccion`
--

DROP TABLE IF EXISTS `infraccion`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `infraccion` (
  `idinfraccion` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idvehiculo` int(10) unsigned DEFAULT NULL,
  `referencia` varchar(45) DEFAULT NULL,
  `fecha` date DEFAULT NULL,
  `hora` time DEFAULT NULL,
  `lugar` varchar(45) DEFAULT NULL,
  `importe` decimal(8,2) DEFAULT NULL,
  PRIMARY KEY (`idinfraccion`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `infraccion`
--

LOCK TABLES `infraccion` WRITE;
/*!40000 ALTER TABLE `infraccion` DISABLE KEYS */;
INSERT INTO `infraccion` VALUES (1,1,'AAA','2024-06-10','10:00:00','Turruncún',100.00),(2,2,'BBB','2024-01-10','14:00:00','Lleida',200.00);
/*!40000 ALTER TABLE `infraccion` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `persona`
--

DROP TABLE IF EXISTS `persona`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `persona` (
  `idpersona` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` varchar(45) DEFAULT NULL,
  `apellidos` varchar(45) DEFAULT NULL,
  `dni` char(9) DEFAULT NULL,
  `telefono` char(9) DEFAULT NULL,
  `poblacion` varchar(45) DEFAULT NULL,
  `direccion` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`idpersona`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `persona`
--

LOCK TABLES `persona` WRITE;
/*!40000 ALTER TABLE `persona` DISABLE KEYS */;
INSERT INTO `persona` VALUES (1,'Ana','Pi','11111','666666','logroño','carmen medrano 11'),(2,'eva','buj','2222','777777','lleida','agla');
/*!40000 ALTER TABLE `persona` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `personavehiculo`
--

DROP TABLE IF EXISTS `personavehiculo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `personavehiculo` (
  `idpersonavehiculo` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idpersona` int(10) unsigned DEFAULT NULL,
  `idvehiculo` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`idpersonavehiculo`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `personavehiculo`
--

LOCK TABLES `personavehiculo` WRITE;
/*!40000 ALTER TABLE `personavehiculo` DISABLE KEYS */;
INSERT INTO `personavehiculo` VALUES (1,1,3),(2,2,1),(3,2,2);
/*!40000 ALTER TABLE `personavehiculo` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `vehiculo`
--

DROP TABLE IF EXISTS `vehiculo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `vehiculo` (
  `idvehiculo` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `matricula` char(7) DEFAULT NULL,
  `marca` varchar(45) DEFAULT NULL,
  `modelo` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idvehiculo`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `vehiculo`
--

LOCK TABLES `vehiculo` WRITE;
/*!40000 ALTER TABLE `vehiculo` DISABLE KEYS */;
INSERT INTO `vehiculo` VALUES (1,'6666AAA','ford','fiesta'),(2,'7777BBB','seat','panda'),(3,'5555','ferrari','testarrosa');
/*!40000 ALTER TABLE `vehiculo` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `vehiculoaccidente`
--

DROP TABLE IF EXISTS `vehiculoaccidente`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `vehiculoaccidente` (
  `idvehiculoaccidente` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idvehiculo` int(10) unsigned DEFAULT NULL,
  `idaccidente` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`idvehiculoaccidente`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `vehiculoaccidente`
--

LOCK TABLES `vehiculoaccidente` WRITE;
/*!40000 ALTER TABLE `vehiculoaccidente` DISABLE KEYS */;
INSERT INTO `vehiculoaccidente` VALUES (1,1,1),(2,1,2),(3,2,1);
/*!40000 ALTER TABLE `vehiculoaccidente` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-06-21 10:20:53