Bases de datos

SQL

SQL

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;

SQL

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
-- 

SQL

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';

SQL

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';

SQL

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';

SQL

... 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`);

SQL

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`);

SQL

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';

SQL

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`);

SQL - INSERT

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');

SQL - UPDATE

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';

SQL - DELETE

Es posible borrar registros en distintas tablas en una sola consulta

DELETE FROM `persona` WHERE `persona`.`numero_licencia` = 'A001002003';

SQL - SELECT

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'

SQL - SELECT

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'

Bases de datos: SQL

By Gilberto 🦁

Bases de datos: SQL

SQL

  • 161