From df2356fda8c474e69a99516b1b783dd9a6823c5a Mon Sep 17 00:00:00 2001 From: devfzn Date: Sun, 29 Oct 2023 03:55:17 -0300 Subject: [PATCH] MySQL: Proyecto Empresa --- 011_mysql/consultas_sql.md | 70 +-- 011_mysql/proyecto_mysql.md | 461 ++++++++++++++++++ 011_mysql/proyecto_scripts/create_tables.sql | 59 +++ 011_mysql/proyecto_scripts/funcs_sp.sql | 151 ++++++ 011_mysql/proyecto_scripts/import_records.sql | 9 + 011_mysql/proyecto_scripts/manage_db.sh | 75 +++ .../proyecto_scripts/populate_tables.sql | 57 +++ .../proyecto_scripts/re_create_tables.sql | 33 ++ 011_mysql/proyecto_scripts/triggers.sql | 38 ++ 011_mysql/proyecto_scripts/triggers.sql.old | 49 ++ 10 files changed, 967 insertions(+), 35 deletions(-) create mode 100644 011_mysql/proyecto_mysql.md create mode 100644 011_mysql/proyecto_scripts/create_tables.sql create mode 100644 011_mysql/proyecto_scripts/funcs_sp.sql create mode 100644 011_mysql/proyecto_scripts/import_records.sql create mode 100755 011_mysql/proyecto_scripts/manage_db.sh create mode 100644 011_mysql/proyecto_scripts/populate_tables.sql create mode 100644 011_mysql/proyecto_scripts/re_create_tables.sql create mode 100644 011_mysql/proyecto_scripts/triggers.sql create mode 100644 011_mysql/proyecto_scripts/triggers.sql.old diff --git a/011_mysql/consultas_sql.md b/011_mysql/consultas_sql.md index 530e9dd..7cf664e 100644 --- a/011_mysql/consultas_sql.md +++ b/011_mysql/consultas_sql.md @@ -91,11 +91,11 @@ condiciones es verdadera - **Operación NAND(NOT AND)**: Negación de la operación **AND** | Verdadero | Falso | -| - | - | +| :-: | :-: | | 1 | 0 | | A | B | OR | AND | NOR | NAND | -| - | - | - | - | - | - | +| :-: | :-: | :-: | :-: | :-: | :-: | | 0 | 0 | 0 | 0 | 1 | 1 | | 0 | 1 | 1 | 0 | 0 | 1 | | 1 | 0 | 1 | 0 | 0 | 1 | @@ -118,7 +118,7 @@ condiciones es verdadera ### Ejemplo | A | B | A=B | A<=B | -| - | - | - | - | +| :-: | :-: | :-: | :-: | | 3 | 5 | 0 | 1 | 0 | 1 | | 5 | 23 | 0 | 1 | 0 | 1 | | 7 | 7 | 1 | 1 | 1 | 1 | @@ -333,7 +333,7 @@ SELECT * FROM tabla_de_productos WHERE sabor LIKE '%manzana%' AND envase = 'bote Devuelve solo registros con valores diferentes | CAMPO_1 | CAMPO_2 | -| - | - | +| :-: | :-: | | A | B | | Z | C | | Z | Q | @@ -352,7 +352,7 @@ SELECT DISTINCT * FROM tb; Retorna: | CAMPO_1 | CAMPO_2 | -| - | - | +| :-: | :-: | | A | B | | Z | C | | Z | Q | @@ -596,7 +596,7 @@ ORDER BY total DESC LIMIT 10; ## GROUP BY | X | Y | -| - | - | +| :-: | :-: | | A | 3 | | Z | 5 | | Z | 1 | @@ -612,7 +612,7 @@ SELECT x, SUM(y) FROM tb GROUP BY X; ``` | X | Y | -| - | - | +| :-: | :-: | | A | 4 | | E | 4 | | T | 4 | @@ -642,7 +642,7 @@ SELECT x, MAX(y) FROM tb GROUP BY X; ``` | X | Y | -| - | - | +| :-: | :-: | | A | 3 | | E | 4 | | T | 3 | @@ -660,7 +660,7 @@ SELECT x, MIN(y) FROM tb GROUP BY X; ``` | X | Y | -| - | - | +| :-: | :-: | | A | 1 | | E | 4 | | T | 1 | @@ -678,7 +678,7 @@ SELECT x, AVG(y) FROM tb GROUP BY X; ``` | X | Y | -| - | - | +| :-: | :-: | | A | 2 | | E | 4 | | T | 2 | @@ -696,7 +696,7 @@ SELECT x, COUNT(y) FROM tb GROUP BY X; ``` | X | Y | -| - | - | +| :-: | :-: | | A | 2 | | E | 1 | | T | 2 | @@ -832,7 +832,7 @@ SELECT COUNT(*) FROM items_facturas Filtro que se aplica sobre el resultado de una agregación | X | Y | -| - | - | +| :-: | :-: | | A | 3 | | Z | 5 | | Z | 1 | @@ -850,7 +850,7 @@ SELECT x, SUM(y) FROM tb ``` | X | Y | -| - | - | +| :-: | :-: | | Z | 16 | @@ -955,7 +955,7 @@ CASE ej. Tabla `tb` | X | Y | -| - | - | +| :-: | :-: | | Cliente_1 | 8 | | Cliente_2 | 6 | | Cliente_3 | 3 | @@ -979,7 +979,7 @@ FROM tb; Resultado: | X | Y | -| - | - | +| :-: | :-: | | Cliente_1 | Muy bueno | | Cliente_2 | Regular | | Cliente_3 | Inferior | @@ -1093,7 +1093,7 @@ Permite unir dos o más tablas a través de un campo en común ### Tabla A | Nombre | Id | -| - | - | +| :-: | :-: | | Alejandro | 2 | | Zaida | 7 | | Ximena | 8 | @@ -1104,7 +1104,7 @@ Permite unir dos o más tablas a través de un campo en común ### Tabla B | Id | Hobby | -| - | - | +| :-: | :-: | | 4 | Lectura | | 5 | Futbol | | 6 | Tenis | @@ -1124,7 +1124,7 @@ INNER JOIN ``` | Nombre | Hobby | -| - | - | +| :-: | :-: | | Zaida | Alpinismo | | Ximena | Fotografía | | Penélope | Hípica | @@ -1142,7 +1142,7 @@ LEFT JOIN ``` | Nombre | Hobby | -| - | - | +| :-: | :-: | | Alejandro | `NULL` | | Zaida | Alpinismo | | Ximena | Fotografía | @@ -1163,7 +1163,7 @@ RIGHT JOIN ``` | Nombre | Hobby | -| - | - | +| :-: | :-: | | `NULL`| Lectura | | `NULL` | Futbol | | `NULL` | Tenis | @@ -1183,7 +1183,7 @@ FULL JOIN ``` | Nombre | Hobby | -| - | - | +| :-: | :-: | | `NULL`| Lectura | | `NULL` | Futbol | | `NULL` | Tenis | @@ -1206,7 +1206,7 @@ Devuelve 36 registros con todas las combinaciónes de todos los hobbies y nombre | Nombre | Hobby | -| - | - | +| :-: | :-: | | Alejandro | Lectura | | Zaida | Lectura | | Ximena | Lectura | @@ -1420,14 +1420,14 @@ El número de campos en las tabls de ser iguales (mismos campos y tipos) ej. | Id | Hobby | -| - | - | +| :-: | :-: | | 4 | Lectura | | 5 | Futbol | | 6 | Tenis | | 7 | Alpinismo | | Id | Hobby | -| - | - | +| :-: | :-: | | 8 | Fotografía | | 9 | Hípica | | 5 | Futbol | @@ -1444,7 +1444,7 @@ UNION Retorna: | Id | Hobby | -| - | - | +| :-: | :-: | | 4 | Lectura | | 5 | Futbol | | 6 | Tenis | @@ -1464,7 +1464,7 @@ UNION ALL Retorna: | Id | Hobby | -| - | - | +| :-: | :-: | | 4 | Lectura | | 5 | Futbol | | 6 | Tenis | @@ -1609,7 +1609,7 @@ FROM tabla_de_clientes Realizar una consulta al interior de otra | X | Y | -| - | - | +| :-: | :-: | | A | 3 | | Z | 5 | | Z | 1 | @@ -1621,7 +1621,7 @@ Realizar una consulta al interior de otra | T | 1 | | Y | -| - | +| :-: | :-: | | 1 | | 2 | @@ -1633,7 +1633,7 @@ WHERE y IN ( ``` | X | Y | -| - | - | +| :-: | :-: | | A | 3 | | Z | 1 | | A | 1 | @@ -1647,7 +1647,7 @@ FROM tb1 GROUP BY X ``` | X | NEW_Y | -| - | - | +| :-: | :-: | | A | 4 | | E | 4 | | T | 4 | @@ -1661,7 +1661,7 @@ SELECT z.x, z.new_y FROM ``` | X | NEW_Y | -| - | - | +| :-: | :-: | | A | 4 | | E | 4 | | T | 4 | @@ -1744,7 +1744,7 @@ La vista tiene un costo de procesamiento, cada vez que es invocada se ejecuta su consulta. | X | Y | -| - | - | +| :-: | :-: | | A | 3 | | Z | 5 | | Z | 1 | @@ -1764,7 +1764,7 @@ FROM tb1 GROUP BY x VW_VIEW | X | Y | -| - | - | +| :-: | :-: | | A | 4 | | E | 4 | | T | 4 | @@ -1776,7 +1776,7 @@ Al almacenar una consulta, se crea una **VIEW**, en este caso llamada tb3 | W | Y | -| - | - | +| :-: | :-: | | F | 4 | | H | 4 | | H | 5 | @@ -1795,7 +1795,7 @@ SELECT VW_VIEW.x, tb3.w FROM VW_VIEW ``` | X | W | -| - | - | +| :-: | :-: | | Z | P | ### Prácticas VIEW diff --git a/011_mysql/proyecto_mysql.md b/011_mysql/proyecto_mysql.md new file mode 100644 index 0000000..c6cb2ce --- /dev/null +++ b/011_mysql/proyecto_mysql.md @@ -0,0 +1,461 @@ +# Proyecto Empresa + +#### Entidades + +- **Cliente** +- **Vendedor** +- **Producto** +- **Factura** +- **Items** + + + + +```mermaid +erDiagram + Producto { + CODIGO varchar PK + DESCRIPCION varchar + SABOR varchar + TAMANO varchar + ENVASE varchar + PRECIO_LISTA float + } + Vendedor { + MATRICULA varchar PK + NOMBRE varchar + BARRIO varchar + COMISION float + FECHA_ADMISION date + VACACIONES bit + } + Cliente { + DNI varchar PK + NOMBRE varchar + BARRIO varchar + CIUDAD varchar + ESTADO varchar + FECHA_NACIMIENTO date + EDAD int + SEXO varchar + LIMITE_CREDITO int + VOLUMEN_COMPRA int + PRIMERA_COMPRA bit + } + Factura { + NUMERO varchar PK + DNI varchar FK + FECHA date + MATRICULA varchar FK + IMPUESTO float + } + Items { + CODIGO varchar FK + PRECIO float + CANTIDAD bigint + } + Vendedor ||--|{ Ventas : realiza + Clientes ||--|{ Ventas : involucra + Productos ||--|{ Items_Vendidos : contiene + Ventas ||--|{ Items_Vendidos : posee +``` + +```sql +CREATE TABLE clientes ( + dni VARCHAR(11) NOT NULL, + nombre VARCHAR(100) NULL, + direccion VARCHAR(150), + barrio VARCHAR(50), + ciudad VARCHAR(50), + estado VARCHAR(20), + cp VARCHAR(10), + fecha_nacimiento DATE, + edad SMALLINT, + limite_credito FLOAT, + volumen_compra FLOAT, + primera_compra BIT, + PRIMARY KEY (dni) +); + +CREATE TABLE vendedores ( + matricula VARCHAR(5) NOT NULL, + nombre VARCHAR(100), + barrio VARCHAR(50), + comision float, + fecha_admision DATE, + vacaciones BIT(1), + PRIMARY KEY (matricula) +); + +CREATE TABLE productos ( + codigo VARCHAR(10) NOT NULL, + descripcion VARCHAR(100), + sabor VARCHAR(50), + tamano VARCHAR(50), + envase VARCHAR(50), + precio FLOAT, + PRIMARY KEY (codigo) +); + +CREATE TABLE facturas ( + numero VARCHAR(5) NOT NULL, + fecha DATE, + dni VARCHAR(5) NOT NULL, + matricula VARCHAR(11) NOT NULL, + impuesto FLOAT, + PRIMARY KEY (numero), + FOREIGN KEY (dni) REFERENCES clientes(dni), + FOREIGN KEY (matricula) REFERENCES vendedores(matricula) +); + +CREATE TABLE items ( + numero VARCHAR(5) NOT NULL, + codigo VARCHAR(10) NOT NULL, + cantidad INT, + precio FLOAT, + PRIMARY KEY (numero, codigo), + FOREIGN KEY (numero) REFERENCES facturas(numero), + FOREIGN KEY (codigo) REFERENCES productos(codigo) +); +``` + +## Poblar tablas + +### Script insertar productos, vendedores y clientes + +[insert](./proyecto_scripts/populate_tables.sql) + +### Importar registros de facturas e items desde `jugos_ventas` + +[./proyecto_scripts/import_records.sql](./proyecto_scripts/import_records.sql) + +```sql +USE empresa; + +INSERT INTO facturas +SELECT numero, fecha_venta as fecha, dni, matricula, impuesto +FROM jugos_ventas.facturas; + +INSERT INTO items +SELECT numero, codigo_del_producto AS codigo, cantidad, precio +FROM jugos_ventas.items_facturas; +``` + +## Funcion RAND + +Devuelve un número aleatorio entre 0 y 1 + +```sql +SELECT RAND(); ++---------------------+ +| rand() | ++---------------------+ +| 0.20842885617951756 | ++---------------------+ +``` + + +```sql +SELECT FLOOR(RAND() * (MAX-MIN+1)+MIN) AS ALEATORIO; +``` + +```sql +-- MIN = 20, MAX = 250 +SELECT FLOOR(RAND() * (250-20+1)+20) AS ALEATORIO; ++-----------+ +| ALEATORIO | ++-----------+ +| 28 | ++-----------+ + +-- MIN = 1, MAX = 10 +SELECT FLOOR(RAND() * (10-1+1)+1) AS ALEATORIO; ++-----------+ +| ALEATORIO | ++-----------+ +| 5 | ++-----------+ +``` + +### Funcion número aleatorio + +#### Activar creación de funciones + +En el caso de MySQL puede ser requerido lo sgte. + +```sql +SET GLOBAL log_bin_trust_function_creators = 1; +``` + +```sql +DROP FUNCTION IF EXISTS f_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_aleatorio(min INT, max INT) +RETURNS INT +BEGIN + DECLARE vresultado INT; + SELECT FLOOR(RAND() * (MAX-MIN+1)+MIN) INTO vresultado; + RETURN vresultado; +END $$ +DELIMITER ; +``` + +### Función Cliente Aleatorio + +```sql +DROP FUNCTION IF EXISTS f_cliente_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_cliente_aleatorio() +RETURNS VARCHAR(11) +BEGIN + DECLARE vresultado VARCHAR(11); + DECLARE vmax, vrand INT; + SELECT COUNT(*) INTO vmax FROM clientes; + SET vrand = f_aleatorio(1, vmax); + SET vrand = vrand-1; + SELECT dni INTO vresultado FROM clientes LIMIT vrand, 1; + RETURN vresultado; +END $$ +DELIMITER ; +``` + +***Crear una función para obtener un producto y otra para obtener un*** +***vendedor, usando como base la función `f_aleatorio()`*** + +#### Función Producto Aleatorio + +```sql +DROP FUNCTION IF EXISTS f_producto_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_producto_aleatorio() +RETURNS VARCHAR(11) +BEGIN + DECLARE vresultado VARCHAR(11); + DECLARE vmax, vrand INT; + SELECT COUNT(*) INTO vmax FROM productos; + SET vrand = f_aleatorio(1, vmax); + SET vrand = vrand-1; + SELECT codigo INTO vresultado FROM productos LIMIT vrand, 1; + RETURN vresultado; +END $$ +DELIMITER ; +``` + +#### Función Vendedor Aleatorio + +```sql +DROP FUNCTION IF EXISTS f_vendedor_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_vendedor_aleatorio() +RETURNS VARCHAR(11) +BEGIN + DECLARE vresultado VARCHAR(11); + DECLARE vmax, vrand INT; + SELECT COUNT(*) INTO vmax FROM vendedores; + SET vrand = f_aleatorio(1, vmax); + SET vrand = vrand-1; + SELECT matricula INTO vresultado FROM vendedores LIMIT vrand, 1; + RETURN vresultado; +END $$ +DELIMITER ; +``` + +### Funciones aleatorias + +```sql +SELECT f_cliente_aleatorio() AS cliente, + f_producto_aleatorio() AS producto, + f_vendedor_aleatorio() AS vendedor; ++-------------+----------+----------+ +| cliente | producto | vendedor | ++-------------+----------+----------+ +| 94387575700 | 243083 | 00235 | ++-------------+----------+----------+ +``` + +```sql +DROP PROCEDURE IF EXISTS sp_venta; +DELIMITER $$ +CREATE PROCEDURE sp_venta(fecha DATE, max_items INT, max_cantidad INT) +BEGIN + DECLARE vcliente VARCHAR(11); + DECLARE vproducto VARCHAR(10); + DECLARE vvendedor VARCHAR(5); + DECLARE vcantidad INT; + DECLARE vprecio FLOAT; + DECLARE vitems INT; + DECLARE vnfactura INT; + DECLARE vcontador INT DEFAULT 1; + SELECT MAX(numero)+1 INTO vnfactura FROM facturas; + SET vcliente = f_cliente_aleatorio(); + SET vvendedor = f_vendedor_aleatorio(); + INSERT INTO facturas (numero, fecha, dni, matricula, impuesto) + VALUES (vnfactura, fecha, vcliente, vvendedor, 0.16); + SET vitems = f_aleatorio(1, max_items); + WHILE vcontador <= vitems DO + SET vproducto = f_producto_aleatorio(); + SET vcantidad = f_aleatorio(1,max_cantidad); + SELECT precio INTO vprecio FROM productos WHERE codigo = vproducto; + INSERT INTO items(numero, codigo, cantidad, precio) + VALUES(vnfactura, vproducto, vcantidad, vprecio); + SET vcontador = vcontador+1; + END WHILE; +END $$ +DELIMITER ; +``` + +- Script [funciones_y_procedimientos](./proyecto_scripts/funcs_sp.sql) + +### Corrigiendo campos numero en tablas `items` y `facturas` + +[re_create_tables](./proyecto_scripts/re_create_tables.sql) + +```sql +CALL sp_venta('20210619', 3, 100); +Query OK, 27 rows affected (0.023 sec) + +select * from facturas +where numero = (select max(numero) from facturas); ++--------+------------+------------+-----------+----------+ +| numero | fecha | dni | matricula | impuesto | ++--------+------------+------------+-----------+----------+ +| 87977 | 2021-06-19 | 5648641702 | 00236 | 0.16 | ++--------+------------+------------+-----------+----------+ +``` + +***Calcular la facturación para la fecha '20210619'*** + +```sql +SELECT F.fecha, SUM(I.cantidad*I.precio) AS Facturacion +FROM facturas F +INNER JOIN + items I + ON F.numero = I.numero +WHERE F.fecha = '20210619' GROUP BY F.fecha; +``` + +***Calcular el valor del impuesto pago por año redondeado al mayor entero*** + +```sql +SELECT YEAR(fecha) AS "AÑO", CEIL(SUM((cantidad*precio)*impuesto))AS RESULTADO +FROM facturas F +INNER JOIN items I ON F.numero = I.numero +GROUP BY YEAR(fecha); ++------+-----------+ +| AÑO | RESULTADO | ++------+-----------+ +| 2015 | 4382250 | +| 2016 | 4656938 | +| 2017 | 4879519 | +| 2018 | 1211812 | +| 2021 | 9228 | ++------+-----------+ +``` + +## Triggers INSERT DELETE UPDATE + +[Triggers.sql](./proyecto_scripts/triggers.sql.old) + +```sql +CREATE TABLE facturacion( + fecha DATE NULL, + venta_total FLOAT +); + +DELIMITER // +CREATE TRIGGER tg_facturacion_insert +AFTER INSERT ON items +FOR EACH ROW BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.FECHA, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.NUMERO = B.NUMERO + GROUP BY A.FECHA; +END // + +DELIMITER // +CREATE TRIGGER tg_facturacion_delete +AFTER DELETE ON items +FOR EACH ROW BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.fecha, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.numero = B.numero + GROUP BY A.fecha; +END // + +DELIMITER // +CREATE TRIGGER tg_facturacion_update +AFTER UPDATE ON items +FOR EACH ROW BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.fecha, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.numero = B.numero + GROUP BY A.fecha; +END // + +DELIMITER ; +``` + +```sql +CALL sp_venta('20210622', 3, 10); +SELECT * FROM facturacion WHERE fecha = '20210622'; ++------------+-------------+ +| fecha | venta_total | ++------------+-------------+ +| 2021-06-22 | 14528.2 | ++------------+-------------+ +``` + +Cambio de rutinas en comun de los triggers por un SP + +```sql +DROP PROCEDURE IF EXISTS sp_triggers; +DELIMITER $$ +CREATE PROCEDURE sp_triggers() +BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.fecha, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.numero = B.numero + GROUP BY A.fecha; +END $$ + + +DROP TRIGGER tg_facturacion_insert $$ +DROP TRIGGER tg_facturacion_delete $$ +DROP TRIGGER tg_facturacion_update $$ + +CREATE TRIGGER tg_facturacion_insert +AFTER INSERT ON items +FOR EACH ROW BEGIN + CALL sp_triggers; +END $$ + +CREATE TRIGGER tg_facturacion_delete +AFTER DELETE ON items +FOR EACH ROW BEGIN + CALL sp_triggers; +END $$ + +CREATE TRIGGER tg_facturacion_update +AFTER UPDATE ON items +FOR EACH ROW BEGIN + CALL sp_triggers; +END $$ + +DELIMITER ; +``` diff --git a/011_mysql/proyecto_scripts/create_tables.sql b/011_mysql/proyecto_scripts/create_tables.sql new file mode 100644 index 0000000..1a83f2b --- /dev/null +++ b/011_mysql/proyecto_scripts/create_tables.sql @@ -0,0 +1,59 @@ +USE empresa; + +CREATE TABLE IF NOT EXISTS clientes ( + dni VARCHAR(11) NOT NULL, + nombre VARCHAR(100) NULL, + direccion VARCHAR(150), + barrio VARCHAR(50), + ciudad VARCHAR(50), + estado VARCHAR(20), + cp VARCHAR(10), + fecha_nacimiento DATE, + edad SMALLINT, + sexo VARCHAR(1), + limite_credito FLOAT, + volumen_compra FLOAT, + primera_compra BIT, + PRIMARY KEY (dni) +); + +CREATE TABLE IF NOT EXISTS vendedores ( + matricula VARCHAR(5) NOT NULL, + nombre VARCHAR(100), + barrio VARCHAR(50), + comision float, + fecha_admision DATE, + vacaciones BIT(1), + PRIMARY KEY (matricula) +); + +CREATE TABLE IF NOT EXISTS productos ( + codigo VARCHAR(10) NOT NULL, + descripcion VARCHAR(100), + sabor VARCHAR(50), + tamano VARCHAR(50), + envase VARCHAR(50), + precio FLOAT, + PRIMARY KEY (codigo) +); + +CREATE TABLE IF NOT EXISTS facturas ( + numero VARCHAR(5) NOT NULL, + fecha DATE, + dni VARCHAR(11) NOT NULL, + matricula VARCHAR(5) NOT NULL, + impuesto FLOAT, + PRIMARY KEY (numero), + FOREIGN KEY (dni) REFERENCES clientes(dni), + FOREIGN KEY (matricula) REFERENCES vendedores(matricula) +); + +CREATE TABLE IF NOT EXISTS items ( + numero VARCHAR(5) NOT NULL, + codigo VARCHAR(10) NOT NULL, + cantidad INT, + precio FLOAT, + PRIMARY KEY (numero, codigo), + FOREIGN KEY (numero) REFERENCES facturas(numero), + FOREIGN KEY (codigo) REFERENCES productos(codigo) +); diff --git a/011_mysql/proyecto_scripts/funcs_sp.sql b/011_mysql/proyecto_scripts/funcs_sp.sql new file mode 100644 index 0000000..9541c57 --- /dev/null +++ b/011_mysql/proyecto_scripts/funcs_sp.sql @@ -0,0 +1,151 @@ +USE empresa; + +/* + MySQL + SET GLOBAL log_bin_trust_function_creators = 1 +*/ + +DROP FUNCTION IF EXISTS f_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_aleatorio(min INT, max INT) +RETURNS INT +BEGIN + DECLARE vresultado INT; + SELECT FLOOR(RAND() * (MAX-MIN+1)+MIN) INTO vresultado; + RETURN vresultado; +END $$ +DELIMITER ; + + +DROP FUNCTION IF EXISTS f_cliente_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_cliente_aleatorio() +RETURNS VARCHAR(11) +BEGIN + DECLARE vresultado VARCHAR(11); + DECLARE vmax, vrand INT; + SELECT COUNT(*) INTO vmax FROM clientes; + SET vrand = f_aleatorio(1, vmax); + SET vrand = vrand-1; + SELECT dni INTO vresultado FROM clientes LIMIT vrand, 1; + RETURN vresultado; +END $$ +DELIMITER ; + + +DROP FUNCTION IF EXISTS f_producto_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_producto_aleatorio() +RETURNS VARCHAR(11) +BEGIN + DECLARE vresultado VARCHAR(11); + DECLARE vmax, vrand INT; + SELECT COUNT(*) INTO vmax FROM productos; + SET vrand = f_aleatorio(1, vmax); + SET vrand = vrand-1; + SELECT codigo INTO vresultado FROM productos LIMIT vrand, 1; + RETURN vresultado; +END $$ +DELIMITER ; + + +DROP FUNCTION IF EXISTS f_vendedor_aleatorio; +DELIMITER $$ +CREATE FUNCTION f_vendedor_aleatorio() +RETURNS VARCHAR(11) +BEGIN + DECLARE vresultado VARCHAR(11); + DECLARE vmax, vrand INT; + SELECT COUNT(*) INTO vmax FROM vendedores; + SET vrand = f_aleatorio(1, vmax); + SET vrand = vrand-1; + SELECT matricula INTO vresultado FROM vendedores LIMIT vrand, 1; + RETURN vresultado; +END $$ +DELIMITER ; + + +SELECT "Test Funciones aleatorias" AS ''; +SELECT f_cliente_aleatorio() AS cliente, + f_producto_aleatorio() AS producto, + f_vendedor_aleatorio() AS vendedor; + + +DROP PROCEDURE IF EXISTS sp_venta; +DELIMITER $$ +CREATE PROCEDURE sp_venta(fecha DATE, max_items INT, max_cantidad INT) +BEGIN + DECLARE vcliente VARCHAR(11); + DECLARE vproducto VARCHAR(10); + DECLARE vvendedor VARCHAR(5); + DECLARE vcantidad INT; + DECLARE vprecio FLOAT; + DECLARE vitems INT; + DECLARE vnfactura INT; + DECLARE vcontador INT DEFAULT 1; + DECLARE vitem_repetido INT; + SELECT MAX(numero)+1 INTO vnfactura FROM facturas; + SET vcliente = f_cliente_aleatorio(); + SET vvendedor = f_vendedor_aleatorio(); + INSERT INTO facturas (numero, fecha, dni, matricula, impuesto) + VALUES (vnfactura, fecha, vcliente, vvendedor, 0.16); + SET vitems = f_aleatorio(1, max_items); + WHILE vcontador <= vitems DO + SET vproducto = f_producto_aleatorio(); + SET vcantidad = f_aleatorio(1,max_cantidad); + SELECT COUNT(*) INTO vitem_repetido FROM items + WHERE codigo = vproducto AND numero = vnfactura; + IF vitem_repetido = 0 THEN + SELECT precio INTO vprecio FROM productos WHERE codigo = vproducto; + INSERT INTO items(numero, codigo, cantidad, precio) + VALUES(vnfactura, vproducto, vcantidad, vprecio); + SET vcontador = vcontador+1; + ELSE + SELECT precio INTO vprecio FROM productos WHERE codigo = vproducto; + UPDATE items SET cantidad = ((SELECT cantidad FROM items + WHERE codigo=vproducto AND numero=vnfactura) + vcantidad) + WHERE codigo=vproducto AND numero=vnfactura; + SET vcontador = vcontador+1; + END IF; + END WHILE; +END $$ +DELIMITER ; + +/* + SP Venta Mentor + +DELIMITER $$ + +CREATE PROCEDURE `sp_venta`(fecha DATE, maxitems INT, maxcantidad INT) +BEGIN + DECLARE vcliente VARCHAR(11); + DECLARE vproducto VARCHAR(10); + DECLARE vvendedor VARCHAR(5); + DECLARE vcantidad INT; + DECLARE vprecio FLOAT; + DECLARE vitens INT; + DECLARE vnfactura INT; + DECLARE vcontador INT DEFAULT 1; + DECLARE vnumitems INT; + SELECT MAX(NUMERO) + 1 INTO vnfactura FROM facturas; + SET vcliente = f_cliente_aleatorio(); + SET vvendedor = f_vendedor_aleatorio(); + INSERT INTO facturas (NUMERO, FECHA, DNI, MATRICULA, IMPUESTO) + VALUES (vnfactura, fecha, vcliente, vvendedor, 0.16); + SET vitens = f_aleatorio(1, maxitems); + WHILE vcontador <= vitens + DO + SET vproducto = f_producto_aleatorio(); + SELECT COUNT(*) INTO vnumitems FROM items + WHERE CODIGO = vproducto AND NUMERO = vnfactura; + IF vnumitems = 0 THEN + SET vcantidad = f_aleatorio(1, maxcantidad); + SELECT PRECIO INTO vprecio FROM productos WHERE CODIGO = vproducto; + INSERT INTO items(NUMERO, CODIGO, CANTIDAD, PRECIO) VALUES(vnfactura, vproducto, vcantidad, vprecio); + END IF; + SET vcontador = vcontador+1; + END WHILE; +END $$ + +DELIMITER ; +*/ diff --git a/011_mysql/proyecto_scripts/import_records.sql b/011_mysql/proyecto_scripts/import_records.sql new file mode 100644 index 0000000..a0b4904 --- /dev/null +++ b/011_mysql/proyecto_scripts/import_records.sql @@ -0,0 +1,9 @@ +USE empresa; + +INSERT INTO facturas +SELECT numero, fecha_venta as fecha, dni, matricula, impuesto +FROM jugos_ventas.facturas; + +INSERT INTO items +SELECT numero, codigo_del_producto AS codigo, cantidad, precio +FROM jugos_ventas.items_facturas; diff --git a/011_mysql/proyecto_scripts/manage_db.sh b/011_mysql/proyecto_scripts/manage_db.sh new file mode 100755 index 0000000..ef6baef --- /dev/null +++ b/011_mysql/proyecto_scripts/manage_db.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +VersionStr='2023-10-29' +BASEDIR=$(dirname $(realpath -s $BASH_SOURCE)) + +while read LINE; do + declare "$LINE" 2>/dev/null +done < $BASEDIR/.env + +connect_db(){ + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} || \ + echo "Ocurrio un error al intentar conectar con la DB" +} + +create_tables(){ + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} < ./create_tables.sql &>/dev/null && \ + echo "DB creada" || \ + echo "Ocurrio un error al intentar crear las tablas" +} + +populate_tables(){ + echo "Poblando tablas: Clientes, Vendedores y Productos" + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} < ./populate_tables.sql &>/dev/null && \ + echo "DB poblada" || \ + echo "Ocurrio un error al intentar poblar la DB" +} + +import_records(){ + echo "Importando registros de jugos_ventas, tablas -> Facturas e Items" + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} < ./import_records.sql &>/dev/null && \ + echo "DB poblada" || \ + echo "Ocurrio un error al intentar poblar la DB" +} + +re_create_tables(){ + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} < ./re_create_tables.sql +} + +create_f_sp(){ + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} < ./funcs_sp.sql +} + +create_triggers(){ + mariadb -u ${DBUSER} \ + -p${DBPASS} \ + -h ${DBADDR%%:*} ${DBNAME} \ + -P ${DBADDR##*:} < ./triggers.sql +} + +deactivate_session(){ + unset DBNAME DBUSER DBPASS DBADDR PEPPER + unset VersionStr BASEDIR + unset connect_db create_populate_tables + unset populate_tables import_records + unset re_create_tables create_f_sp + unset create_triggers deactivate_session +} diff --git a/011_mysql/proyecto_scripts/populate_tables.sql b/011_mysql/proyecto_scripts/populate_tables.sql new file mode 100644 index 0000000..421cbd5 --- /dev/null +++ b/011_mysql/proyecto_scripts/populate_tables.sql @@ -0,0 +1,57 @@ +USE empresa; + +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('9283760794', 'Edson Calisaya', 'Sta Úrsula Xitla', 'Barrio del Niño Jesús', 'Ciudad de México', 'EM', '22002002', '1995-01-07', 25, 'M', 150000, 250000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('7771579779', 'Marcelo Perez', 'F.C. de Cuernavaca 13', 'Carola', 'Ciudad de México', 'EM', '88202912', '1992-01-25', 29, 'M', 120000, 200000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('5576228758', 'Patricia Olivera', 'Pachuca 75', 'Condesa', 'Ciudad de México', 'EM', '88192029', '1995-01-14', 25, 'F', 70000, 160000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('8502682733', 'Luis Silva', 'Prol. 16 de Septiembre 1156', 'Contadero', 'Ciudad de México', 'EM', '82122020', '1995-01-07', 25, 'M', 110000, 190000, 0); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('1471156710', 'Erica Carvajo', 'Heriberto Frías 1107', 'Del Valle', 'Ciudad de México', 'EM', '80012212', '1990-01-01', 30, 'F', 170000, 245000, 0); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('2600586709', 'Raúl Meneses', 'Estudiantes 89', 'Centro', 'Ciudad de México', 'EM', '22002012', '1999-08-13', 21, 'M', 120000, 210000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('3623344710', 'Marcos Rosas', 'Av. Universidad', 'Del Valle', 'Ciudad de México', 'EM', '22002012', '1995-01-13', 26, 'M', 110000, 220000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('50534475787', 'Abel Pintos', 'Carr. México-Toluca 1499', 'Cuajimalpa', 'Ciudad de México', 'EM', '22000212', '1995-01-11', 25, 'M', 170000, 260000, 0); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('5840119709', 'Gabriel Roca', 'Eje Central Lázaro Cárdenas 911', 'Del Valle', 'Ciudad de México', 'EM', '80010221', '1985-01-16', 36, 'M', 140000, 210000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('8719655770', 'Carlos Santivañez', 'Calz. del Hueso 363', 'Floresta Coyoacán', 'Ciudad de México', 'EM', '81192002', '1983-01-20', 37, 'M', 200000, 240000, 0); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('19290992743', 'Rodrigo Villa', 'Libertadores 65', 'Héroes', 'Ciudad de México', 'EM', '21002020', '1998-05-30', 22, 'M', 120000, 220000, 0); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('5648641702', 'Paolo Mendez', 'Martires de Tacubaya 65', 'Héroes de Padierna', 'Ciudad de México', 'EM', '21002020', '1991-01-30', 29, 'M', 120000, 220000, 0); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('492472718', 'Jorge Castro', 'Federal México-Toluca 5690', 'Locaxco', 'Ciudad de México', 'EM', '22012002', '1994-01-19', 26, 'M', 75000, 95000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('9275760794', 'Alberto Rodriguez', 'Circunvalación Oblatos 690', 'Oblatos', 'Guadalajara', 'JC', '44700000', '1991-12-28', 26, 'M', 75000, 95000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('94387575700', 'María Jimenez', 'Av. Libertadores 457', 'Barragán Hernández', 'Guadalajara', 'JC', '44469000', '1995-05-13', 26, 'F', 120000, 300000, 1); +INSERT INTO clientes (DNI, NOMBRE, DIRECCION, BARRIO, CIUDAD, ESTADO, CP, FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_CREDITO, VOLUMEN_COMPRA, PRIMERA_COMPRA) VALUES ('95939180787', 'Ximena Gómez', 'Jaguares 822', 'Alcalde Barranquitas', 'Guadalajara', 'JC', '44270000', '1992-01-05', 16, 'F', 90000, 18000, 0); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('773912', 'Clean', '1 Litro', 'Naranja', 'Botella PET', 8.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('838819', 'Clean', '1,5 Litros', 'Naranja', 'Botella PET', 12.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1037797', 'Clean', '2 Litros', 'Naranja', 'Botella PET', 16.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('812829', 'Clean', '350 ml', 'Naranja', 'Lata', 2.81); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('479745', 'Clean', '470 ml', 'Naranja', 'Botella de Vidrio', 3.77); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('695594', 'Festival de Sabores', '1,5 Litros', 'Asaí', 'Botella PET', 28.51); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('243083', 'Festival de Sabores', '1,5 Litros', 'Maracuyá', 'Botella PET', 10.51); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1022450', 'Festival de Sabores', '2 Litros', 'Asái', 'Botella PET', 38.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('231776', 'Festival de Sabores', '700 ml', 'Asaí', 'Botella de Vidrio', 13.31); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('723457', 'Festival de Sabores', '700 ml', 'Maracuyá', 'Botella de Vidrio', 4.91); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('746596', 'Light', '1,5 Litros', 'Sandía', 'Botella PET', 19.51); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1040107', 'Light', '350 ml', 'Sandía', 'Lata', 4.56); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1002334', 'Línea Citrus', '1 Litro', 'Lima/Limón', 'Botella PET', 7); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1088126', 'Línea Citrus', '1 Litro', 'Limón', 'Botella PET', 7); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1041119', 'Línea Citrus', '700 ml', 'Lima/Limón', 'Botella de Vidrio', 4.9); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1042712', 'Línea Citrus', '700 ml', 'Limón', 'Botella de Vidrio', 4.9); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('520380', 'Pedazos de Frutas', '1 Litro', 'Manzana', 'Botella PET', 12.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('788975', 'Pedazos de Frutas', '1,5 Litros', 'Manzana', 'Botella PET', 18.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('229900', 'Pedazos de Frutas', '350 ml', 'Manzana', 'Lata', 4.21); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1101035', 'Refrescante', '1 Litro', 'Frutilla/Limón', 'Botella PET', 9.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1086543', 'Refrescante', '1 Litro', 'Mango', 'Botella PET', 11.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('326779', 'Refrescante', '1,5 Litros', 'Mango', 'Botella PET', 16.51); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('826490', 'Refrescante', '700 ml', 'Frutilla/Limón', 'Botella de Vidrio', 6.31); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1096818', 'Refrescante', '700 ml', 'Mango', 'Botella de Vidrio', 7.71); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('394479', 'Sabor da Montaña', '700 ml', 'Cereza', 'Botella de Vidrio', 8.41); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('783663', 'Sabor da Montaña', '700 ml', 'Frutilla', 'Botella de Vidrio', 7.71); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1000889', 'Sabor da Montaña', '700 ml', 'Uva', 'Botella de Vidrio', 6.31); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('544931', 'Verano', '350 ml', 'Limón', 'Lata', 2.46); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('235653', 'Verano', '350 ml', 'Mango', 'Lata', 3.86); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1051518', 'Verano', '470 ml', 'Limón', 'Botella de Vidrio', 3.3); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1078680', 'Verano', '470 ml', 'Mango', 'Botella de Vidrio', 5.18); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1004327', 'Vida del Campo', '1,5 Litros', 'Sandía', 'Botella PET', 19.51); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1013793', 'Vida del Campo', '2 Litros', 'Cereza/Manzana', 'Botella PET', 24.01); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('290478', 'Vida del Campo', '350 ml', 'Sandía', 'Lata', 4.56); +INSERT INTO productos (CODIGO, DESCRIPCION, TAMANO, SABOR, ENVASE, PRECIO) VALUES ('1002767', 'Vida del Campo', '700 ml', 'Cereza/Manzana', 'Botella de Vidrio', 8.41); +INSERT vendedores (MATRICULA, NOMBRE, COMISION, FECHA_ADMISION, VACACIONES, BARRIO) VALUES ('00235','Miguel Pavón Silva',0.08,'2014-08-15', 0,'Condesa'); +INSERT vendedores (MATRICULA, NOMBRE, COMISION, FECHA_ADMISION, VACACIONES, BARRIO) VALUES ('00236', 'Claudia Morales',0.08,'2013-09-17', 1,'Del Valle'); +INSERT vendedores (MATRICULA, NOMBRE, COMISION, FECHA_ADMISION, VACACIONES, BARRIO) VALUES ('00237', 'Concepción Martinez',0.11,'2017-03-18', 1,'Contadero'); +INSERT vendedores (MATRICULA, NOMBRE, COMISION, FECHA_ADMISION, VACACIONES, BARRIO) VALUES ('00238', 'Patricia Sánchez',0.11,'2016-08-21', 0,'Oblatos'); diff --git a/011_mysql/proyecto_scripts/re_create_tables.sql b/011_mysql/proyecto_scripts/re_create_tables.sql new file mode 100644 index 0000000..361268b --- /dev/null +++ b/011_mysql/proyecto_scripts/re_create_tables.sql @@ -0,0 +1,33 @@ +USE empresa; + +DROP TABLE IF EXISTS items; +DROP TABLE IF EXISTS facturas; + +CREATE TABLE facturas ( + numero INT NOT NULL, + fecha DATE, + dni VARCHAR(11) NOT NULL, + matricula VARCHAR(5) NOT NULL, + impuesto FLOAT, + PRIMARY KEY (numero), + FOREIGN KEY (dni) REFERENCES clientes(dni), + FOREIGN KEY (matricula) REFERENCES vendedores(matricula) +); + +CREATE TABLE items ( + numero INT NOT NULL, + codigo VARCHAR(10) NOT NULL, + cantidad INT, + precio FLOAT, + PRIMARY KEY (numero, codigo), + FOREIGN KEY (numero) REFERENCES facturas(numero), + FOREIGN KEY (codigo) REFERENCES productos(codigo) +); + +INSERT INTO facturas +SELECT numero, fecha_venta as fecha, dni, matricula, impuesto +FROM jugos_ventas.facturas; + +INSERT INTO items +SELECT numero, codigo_del_producto AS codigo, cantidad, precio +FROM jugos_ventas.items_facturas; diff --git a/011_mysql/proyecto_scripts/triggers.sql b/011_mysql/proyecto_scripts/triggers.sql new file mode 100644 index 0000000..d69cb19 --- /dev/null +++ b/011_mysql/proyecto_scripts/triggers.sql @@ -0,0 +1,38 @@ +DROP PROCEDURE IF EXISTS sp_triggers; + +DELIMITER $$ +CREATE PROCEDURE sp_triggers() +BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.fecha, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.numero = B.numero + GROUP BY A.fecha; +END $$ + +DROP TRIGGER tg_facturacion_insert $$ +DROP TRIGGER tg_facturacion_delete $$ +DROP TRIGGER tg_facturacion_update $$ + +CREATE TRIGGER tg_facturacion_insert +AFTER INSERT ON items +FOR EACH ROW BEGIN + CALL sp_triggers; +END $$ + +CREATE TRIGGER tg_facturacion_delete +AFTER DELETE ON items +FOR EACH ROW BEGIN + CALL sp_triggers; +END $$ + +CREATE TRIGGER tg_facturacion_update +AFTER UPDATE ON items +FOR EACH ROW BEGIN + CALL sp_triggers; +END $$ + +DELIMITER ; diff --git a/011_mysql/proyecto_scripts/triggers.sql.old b/011_mysql/proyecto_scripts/triggers.sql.old new file mode 100644 index 0000000..36b602e --- /dev/null +++ b/011_mysql/proyecto_scripts/triggers.sql.old @@ -0,0 +1,49 @@ + +CREATE TABLE facturacion( + fecha DATE NULL, + venta_total FLOAT +); + +DELIMITER // +CREATE TRIGGER tg_facturacion_insert +AFTER INSERT ON items +FOR EACH ROW BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.FECHA, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.NUMERO = B.NUMERO + GROUP BY A.FECHA; +END // + +DELIMITER // +CREATE TRIGGER tg_facturacion_delete +AFTER DELETE ON items +FOR EACH ROW BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.fecha, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.numero = B.numero + GROUP BY A.fecha; +END // + +DELIMITER // +CREATE TRIGGER tg_facturacion_update +AFTER UPDATE ON items +FOR EACH ROW BEGIN + DELETE FROM facturacion; + INSERT INTO facturacion + SELECT A.fecha, SUM(B.cantidad * B.precio) AS VENTA_TOTAL + FROM facturas A + INNER JOIN + items B + ON A.numero = B.numero + GROUP BY A.fecha; +END // + +DELIMITER ;