Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
Creación, y modificación en caso de ser necesaria, de una base de datos
Es importante cuidar el conjunto de caracteres y la colación de la misma
CREATE DATABASE `aseguradora`
CHARACTER SET utf8mb4
COLLATE utf8mb4_spanish_ci;
-- ALTER DATABASE `asegudadora`
-- CHARACTER SET utf8mb4
-- COLLATE utf8mb4_spanish_ci;
Si estamos usando una consola es necesario especificar con cual base de datos vamos a trabajar
USE aseguradora;
--
-- mysql -h [host] -u [user] -p aseguradora
--
Empezamos creando las tablas que no tengan llaves foráneas
-- Estructura de la tabla accidente
CREATE TABLE `accidente` (
`codigo` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL PRIMARY KEY,
`fecha` datetime NOT NULL,
`lugar` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`descripcion` text COLLATE utf8mb4_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Información de los accidentes registrados';
Empezamos creando las tablas que no tengan llaves foráneas
-- Estructura de la tabla persona
CREATE TABLE `persona` (
`numero_licencia` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL PRIMARY KEY,
`nombre` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`apellido` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Información de los dueños registrados de vehículos';
Podemos crear una tabla con una clave foránea en la misma declaración...
-- Estructura de la tabla vehículo
CREATE TABLE `vehiculo` (
`numero_serie` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`marca` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`modelo` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`persona_numero_licencia` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
PRIMARY KEY (`numero_serie`),
FOREIGN KEY (`persona_numero_licencia`) REFERENCES `persona`(`numero_licencia`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Información de los vehículos registrados';
... o en una declaración posterior
-- Estructura de la tabla multa
CREATE TABLE `multa` (
`numero` int(12) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`fecha` datetime NOT NULL,
`lugar` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`monto` decimal(8,2) NOT NULL,
`descripcion` text COLLATE utf8mb4_spanish_ci NOT NULL,
`vehiculo_numero_serie` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Información de las multas registradas';
-- Índices de la tabla multa
ALTER TABLE `multa`
ADD FOREIGN KEY (`vehiculo_numero_serie`) REFERENCES `vehiculo`(`numero_serie`);
También es posible modificar los atributos de una tabla
-- Estructura de la tabla multa
CREATE TABLE `multa` (
`numero` int(12) NOT NULL,
`fecha` datetime NOT NULL,
`lugar` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`monto` decimal(8,2) NOT NULL,
`descripcion` text COLLATE utf8mb4_spanish_ci NOT NULL,
`vehiculo_numero_serie` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Información de las multas registradas';
-- Índices de la tabla multa
ALTER TABLE `multa`
CHANGE `numero` `numero` INT(12) NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`numero`),
ADD FOREIGN KEY (`vehiculo_numero_serie`) REFERENCES `vehiculo`(`numero_serie`);
Ahora una tabla con una llave primaria compuesta
-- Estructura de la tabla persona_involucrada_accidente
CREATE TABLE `persona_involucrada_accidente` (
`persona_numero_licencia` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`accidente_codigo` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
PRIMARY KEY (`persona_numero_licencia`, `accidente_codigo`),
FOREIGN KEY (`persona_numero_licencia`) REFERENCES `persona`(`numero_licencia`),
FOREIGN KEY (`accidente_codigo`) REFERENCES `accidente`(`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Relación entre personas y accidentes';
Y también podemos especificar las claves en una declaración posterior
-- Estructura de la tabla vehiculo_involucrado_accidente
CREATE TABLE `vehiculo_involucrado_accidente` (
`vehiculo_numero_serie` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL,
`accidente_codigo` varchar(255) COLLATE utf8mb4_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci COMMENT='Relación entre vehículos y accidentes';
-- Índices de la tabla vehiculo_involucrado_accidente
ALTER TABLE `vehiculo_involucrado_accidente`
ADD PRIMARY KEY (`vehiculo_numero_serie`, `accidente_codigo`),
ADD FOREIGN KEY (`vehiculo_numero_serie`) REFERENCES `vehiculo`(`numero_serie`),
ADD FOREIGN KEY (`accidente_codigo`) REFERENCES `accidente`(`codigo`);
No es posible insertar registros a distintas tablas en una sola consulta
INSERT INTO `persona` (`numero_licencia`, `nombre`, `apellido`) VALUES ('A001002003', 'Fulano', 'De Tal');
INSERT INTO `persona` VALUES ('B004002008', 'Mengano', 'De Tal');
INSERT INTO `persona` (`numero_licencia`, `nombre`, `apellido`) VALUES ('C006005004', 'Sutano', 'De Tal'), ('D003007001', 'Perengano', 'De Tal');
Es posible actualizar registros en distintas tablas en una sola consulta
UPDATE `persona` SET `nombre` = 'Fulanito', `apellido` = 'Corcuera De Tal' WHERE `persona`.`numero_licencia` = 'A001002003';
Es posible borrar registros en distintas tablas en una sola consulta
DELETE FROM `persona` WHERE `persona`.`numero_licencia` = 'A001002003';
Es recomendable que siempre, pero siempre, tengan separadas sus condiciones de filtrado (WHERE) de sus condiciones de combinaciones (JOIN)
SELECT
`persona`.`numero_licencia`,
`persona`.`nombre`,
`persona`.`apellido`,
`vehiculo`.`marca`,
`vehiculo`.`modelo`
FROM `vehiculo`
INNER JOIN `persona`
ON `vehiculo`.`persona_numero_licencia` = `persona`.`numero_licencia`
WHERE `persona`.`numero_licencia` = 'A001002003'
Cada tabla nueva que queramos agregar conlleva una nueva instrucción JOIN con las comparaciones necesarias
SELECT
`persona`.`numero_licencia`,
`persona`.`nombre`,
`persona`.`apellido`,
`vehiculo`.`marca`,
`vehiculo`.`modelo`,
`multa`.`numero`,
DATE(`multa`.`fecha`) AS `fecha`,
TIME(`multa`.`fecha`) AS `hora`,
`multa`.`monto`
FROM `vehiculo`
INNER JOIN `persona`
ON `vehiculo`.`persona_numero_licencia` = `persona`.`numero_licencia`
INNER JOIN `multa`
ON `multa`.`vehiculo_numero_serie` = `vehiculo`.`numero_serie`
WHERE `persona`.`numero_licencia` = 'A001002003'
By Gilberto 🦁
SQL
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales