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

Resumen tipos de datos

-- Tipos de datos numéricos
-- INT para enteros
-- DECIMAL para decimales (tamaño,decimales)
-- BIT para verdadero/falso

-- Tipos de datos de fecha
-- DATE para fecha
-- TIME para hora
-- DATETIME para fecha y hora
-- El formato es año-mes-dia hora:minutos:segundos
-- 2024-10-01 10:03:24

-- Cadenas: especificamos el tamaño
-- CHAR: Tamaño fijo, por ejemplo, si yo le pongo 100 siempre ocupa 100
-- VARCHAR: Tamaño variable, si yo pongo 100 es una cota superior
-- CHAR(20)                 vs   VARCHAR(20)
-- |PEPE                |        |PEPE| 
-- Para campos que sé que tienen un ancho fijo siempre es mejor usar CHAR
-- Por ejemplo telefono, cod postal, nif, dni,...
-- Para campos cuyo ancho sea variable es mejor VARCHAR
-- Nombres, mails, razon social, direccion....

-- El tamaño importa
-- CHAR: 255
-- VARCHAR: 65535 (este es un máximo compartido)
-- campo1 varchar(65000) campo2 varchar(500) campo3 como máximo 35

-- Si yo quiero introducir texto largo puedo user TEXT
-- TEXT un máximo de 65535 caracteres puedo poner todos los que quiera

Ejercicio concesionario

CREATE DATABASE  IF NOT EXISTS `concesionario` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */;
USE `concesionario`;
-- MySQL dump 10.13  Distrib 8.0.34, for Win64 (x86_64)
--
-- Host: localhost    Database: concesionario
-- ------------------------------------------------------
-- 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 `cliente`
--

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

--
-- Dumping data for table `cliente`
--

LOCK TABLES `cliente` WRITE;
/*!40000 ALTER TABLE `cliente` DISABLE KEYS */;
INSERT INTO `cliente` VALUES (1,'1234','ana','pi','666','agla'),(2,'222','eva','buj','777','pi');
/*!40000 ALTER TABLE `cliente` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `coche`
--

DROP TABLE IF EXISTS `coche`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `coche` (
  `idcoche` int(11) NOT NULL AUTO_INCREMENT,
  `idcliente` int(11) DEFAULT NULL,
  `matricula` varchar(45) DEFAULT NULL,
  `modelo` varchar(45) DEFAULT NULL,
  `marca` varchar(45) DEFAULT NULL,
  `color` varchar(45) DEFAULT NULL,
  `nuevo` tinyint(4) DEFAULT NULL,
  `unidades` int(11) DEFAULT NULL,
  `kilometros` int(11) DEFAULT NULL,
  PRIMARY KEY (`idcoche`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `coche`
--

LOCK TABLES `coche` WRITE;
/*!40000 ALTER TABLE `coche` DISABLE KEYS */;
INSERT INTO `coche` VALUES (1,1,'aaaa','seat','seat','azul',1,2,NULL),(2,2,'bbb','clio','clio','verde',0,0,100),(3,1,'ccc','ford','ford','amarillo',1,2,NULL);
/*!40000 ALTER TABLE `coche` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `coche_mecanico`
--

DROP TABLE IF EXISTS `coche_mecanico`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `coche_mecanico` (
  `idcoche_mecanico` int(11) NOT NULL AUTO_INCREMENT,
  `idcoche` int(11) DEFAULT NULL,
  `idmecanico` int(11) DEFAULT NULL,
  `fecha` date DEFAULT NULL,
  `horas` int(11) DEFAULT NULL,
  PRIMARY KEY (`idcoche_mecanico`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `coche_mecanico`
--

LOCK TABLES `coche_mecanico` WRITE;
/*!40000 ALTER TABLE `coche_mecanico` DISABLE KEYS */;
INSERT INTO `coche_mecanico` VALUES (1,1,1,'2024-06-19',3),(2,3,2,'2024-06-18',5);
/*!40000 ALTER TABLE `coche_mecanico` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `mecanico`
--

DROP TABLE IF EXISTS `mecanico`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `mecanico` (
  `idmecanico` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(45) DEFAULT NULL,
  `apellidos` varchar(45) DEFAULT NULL,
  `dni` varchar(45) DEFAULT NULL,
  `fechacontratacion` date DEFAULT NULL,
  `sueldo` int(11) DEFAULT NULL,
  PRIMARY KEY (`idmecanico`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `mecanico`
--

LOCK TABLES `mecanico` WRITE;
/*!40000 ALTER TABLE `mecanico` DISABLE KEYS */;
INSERT INTO `mecanico` VALUES (1,'pep','pi','111','2023-10-01',1000),(2,'juan','pi','222','2023-09-12',2000);
/*!40000 ALTER TABLE `mecanico` 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-20 10:31:12

Ejercicios modelo lógico

Pasar a modelo lógico los ejercicios siguientes:

https://academiairigoyen.com/wp-content/uploads/2023/06/EJERCICIOS_DE_MODELAMIENTO_E_R.-Oposiciones-TAI.pdf

cliente
idcliente
nombre
apellido
rfc
direccion
fechanacimiento

cliente_producto
idclienteproducto
idcliente
idproducto

producto
idproducto
idproveedor
nombre
codigo
preciounitario

proveedor
idproveedor
nif
nombre
direccion
camionero
idcamionero
rfc
nombre
salario
telefono
direccion
poblacion

camionero_camion
idcamionerocamion
idcamionero
idcamion

camion
idcamion
placas
modelo
tipo
potencia

paquete
idpaquete
idcamionero
idciudad
codigo
descripcion
destino
direccion


ciudad
idciudad
apartadopostal
nombre
profesor
idprofesor
rfc
nombre
direccion
telefono


profesor_modulo
idprofesormodulo
idprofesor
idmodulo

modulo
idmodulo
idalumno
codigo
nombre

alumno
idalumno
idalumnodelegado / iddelegado
control
nombre
apellido
fechanacimiento

Más ejercicios modelo entidad relación

Se desea crear una base de datos que contenga información sobre las revistas a las que estás suscrito o compras habitualmente. De cada revista, se pide su título, el ISSN (un código que identifica a la publicación), el número y el año de publicación. También se desea almacenar información de cada uno de los artículos publicados: el título, la página de inicio y la página de fin. Se asume que no hay dos artículos con el mismo título.

Cada artículo puede estar escrito por varios autores, de quienes interesa conocer su nombre, una dirección de correo electrónico y su país de nacimiento, así como un número que indique la posición en la que aparece en cada artículo: un 1 si es el primer autor, un 2 si aparece en segundo lugar, etc.

REVISTA     ARTÍCULO  AUTOR

Revista(1)—(N)Artículo(N)—(N)Autor

Revista: título, ISSN, número, año publicacion

Artículo: título, página inicio y fin

Autor: Nombre, email, país nacimiento

Autor-Artículo: posición

Una ONG desea elaborar una base de datos para llevar el seguimiento de todos sus proyectos. Tiene diversas sedes en varios países que se encargan de gestionar y coordinar los proyectos de ese país, cada uno de los cuales puede afectar a una o varias poblaciones.

Sobre la sedes se desea mantener un identificador, la ciudad y país en el que se encuentra, junto con su dirección, un teléfono de contacto y el nombre del director. Cada sede gestiona un conjunto de proyectos, con un código, un título, fechas de inicio y finalización, el presupuesto asignado y el nombre del responsable.

De cada proyecto es necesario conocer qué actuaciones se realizan en cada población, almacenando el nombre, país y nº de habitantes y un identificador para diferenciarlas. Además se desea la inversión del proyecto que corresponde a la población y una pequeña descripción de la actuación.

PAIS(1)—-(N)CIUDAD(1)—-(N)SEDE(1)—(N)PROYECTO(1)—–(N)ACTUACIONES

DIRECTOR(1,1)                (1,1)RESPONSABLE

Sedes: Identificador, dirección, teléfono

Proyectos: Código, título, inicio, fin, presupuesto

Actuaciones: Población, nombre, país, habitantes, identificador, descripción, inversión

 

Un parque zoológico quiere construir una BD para organizar las especies que posee y los distintos itinerarios para visitar el parque. La información se estructura de la siguiente forma. De las especies, se desea conocer su nombre común y su nombre científico, así como una descripción general y una fotografía. Cada especie puede vivir en distintos hábitats naturales, definidos por su nombre, clima y vegetación predominante. Cada especie tiene asociado un índice de vulnerabilidad dentro de cada hábitat, que mide el riesgo de extinción de la especie en el dicho hábitat. Para organizar las visitas, y en función de los hábitats que desee recorrer un visitante, el parque le ofrece una serie de recorridos por los hábitats, que se identifican por su código y se caracterizan por su duración estimada, longitud y número máximo de visitantes permitidos. Un hábitat sólo puede formar parte de un itinerario.

ESPECIES(N)—(N)HABITATS(N)—(1)ITINERARIO

Especies: Nombre común, científico, descripción, fotografía,

Habitats: nombre, clima, vegetación

Especies-Habitats: índice vulnerabilidad

Itinerario: Duración, longitud, visitantes, código

 

 

Una compañía aérea necesita una base de datos para registrar la información de sus vuelos. Los vuelos están caracterizados por un Id, la fecha y los aeropuertos de origen y destino. Cada vuelo es realizado por un avión. Los aviones tienen una matrícula que los identifica, el fabricante, un modelo e información sobre su capacidad (número máximo de pasajeros) y autonomía de vuelo (en horas). La tripulación asignada al vuelo está formada por el personal de la propia compañía. De cada trabajador se conoce su id, su nombre y su categoría profesional, así como el puesto que ocupa en cada vuelo en particular.

Por último, para cada vuelo, se almacena la lista completa de pasajeros, con su dni, el nombre, el asiento que ocupa y su clase (turista, primera o business).

 

Modelo lógico vuelos

Trabajador
idtrabajador
nombre
categoria

trabajador_vuelo
idtrabajadorvuelo
idtrabajador
idvuelo
puesto

Vuelo
idvuelo
idavion
fecha
origen
destino

vuelo_pasajero
idvuelopasajero
idvuelo
idpasajero
clase
asiento

Avion
idavion
matricula
fabricante
modelo
capacidad
autonomia


Pasajero
idpasajero
dni
nombre
Especie
idespecie
nombrecomun
nombrecientifico
descripcion
fotografia

especie_habitat
idespeciehabitat
idespecie
idhabitat
vulnerabilidad

Habitat
idhabitat
iditinerario
nombre
clima
vegetacion

Itinerario
iditinerario
codigo
duracion
longitud
visitantes