Oracle_One-Alura_Latam/011_mysql/dml.md

12 KiB

Data Manipulation Language

Se repasa lo visto en el primer curso sobre bases de datos

Tipos de datos

Diseño de la base de datos

1. Análisis de requerimientos

  • Comprender las reglas del negocio (entrevistas, reuniones)
  • El diseño del modelo debe corresponder con la realidad

2. Modelo Conceptual

  • Diagrama Entidad Relación
  • Establecer la cardinalidad de las entidades (relaciones 1-1, 1-N, N-N)
%%{init: {'theme': 'dark','themeVariables': {'clusterBkg': '#2b2f38'}, 'flowchart': {'curve': 'linear'}}}%%
flowchart LR
V[Vendedor]  ---- R{Realiza}
C[Cliente] ---- I{Involucra}
P[Productos] ---- Co{Contiene}
Ve[Ventas] --- Po{Posee}
IV["Items
Vendidos"]
R --- Ve
I --- Ve
Co --- IV
IV --- Po

3. Establecer atributos de las entidades

Vendedor

Vendedor Cliente Venta Producto Items Vendidos
Matrícula DNI Número Código Número
Nombre Nombre Fecha Sabor Código
Barrio Dirección Matrícula Tamaño Cantidad
Comisión Barrio Impuesto Envase Precio
Fecha Admisión Ciudad DNI Precio Lista
Vacaciones Estado Descripción
CP
Fecha nacimiento
Edad
Sexo
Límite credito
Volumen compra
Primera compra

4. Creación de diagrama entidad relación

erDiagram
    Productos {
        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
    }
    Clientes {
        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
    }
    Ventas {
        NUMERO varchar PK
        FECHA date
        DNI varchar FK
        MATRICULA varchar FK
        IMPUESTO float
    }
    Items_Vendidos {
        NUMERO varchar FK
        CODIGO varchar FK
        CANTIDAD bigint
        PRECIO float
    }
    Vendedor ||--|{ Ventas : realiza
    Clientes ||--|{ Ventas : involucra
    Productos ||--|{ Items_Vendidos : contiene
    Ventas ||--|{ Items_Vendidos : posee

5. Crear base de datos

Se pueden utilizar herramientas para esto. Computer-Aide Software Engineering, Start UML, Astah, ERWin, etc.

Creación

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_options] ...

create_options: [DEFAULT] {
    CHARACTER SET [=] charset_name
    | COLLATE [=] collation_name
    | ENCRYPTION [=] {'Y' | 'N'}
}

Eliminación

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

Creación de tablas

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definitions, ...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definitions, ...)
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definitions, ...)
    { LIKE old_tbl_name | (LIKE old_tbl_name) }

Creación tablas

USE ventas_jugos;

CREATE TABLE tb_vendedor(
    MATRICULA VARCHAR(5) NOT NULL,
    NOMBRE VARCHAR(100) NULL,
    BARRIO VARCHAR(50) NULL,
    COMISION FLOAT NULL,
    FECHA_ADMISION DATE NULL,
    DE_VACACIONES BIT(1) NULL,
    PRIMARY KEY(MATRICULA)
);

CREATE TABLE tb_producto(
    CODIGO VARCHAR(10) NOT NULL,
    DESCRIPCION VARCHAR(100) NULL,
    SABOR VARCHAR(50) NULL,
    TAMANO VARCHAR(50) NULL,
    ENVASE VARCHAR(50) NULL,
    PRECIO_LISTA BIT(1) NULL,
    PRIMARY KEY(CODIGO)
);

...
CREATE TABLE tb_venta(
    NUMERO VARCHAR(5) NOT NULL,
    FECHA DATE NULL,
    DNI VARCHAR(11) NOT NULL,
    MATRICULA VARCHAR(5) NOT NULL,
    IMPUESTO FLOAT,
    PRIMAREY KEY(NUMERO)
);

/* tb_cliente.DNI como llave foranea en tb_venta */
ALTER TABLE tb_venta ADD CONSTRAIN FK_CLIENTE
FOREIGN KEY (DNI) REFERENCES tb_cliente(DNI);

/* tb_vendedor.MATRICULA como llave foranea tb_venta */
ALTER TABLE tb_venta ADD CONSTRAIN FK_VENDEDOR
FOREIGN KEY (MATRICULA) REFERENCES tb_vendedor(MATRICULA);

CREATE TABLE tb_items_facturas
(NUMERO VARCHAR(5) NOT NULL,
CODIGO VARCHAR(10) NOT NULL,
CANTIDAD INT,
PRECIO FLOAT,
PRIMARY KEY (NUMERO, CODIGO));

/* Renombrando tb_venta a tb_factura */
ALTER TABLE tb_venta RENAME tb_factura;

/* tb_factura.MATRICULA como llave foranea tb_factura */
ALTER TABLE tb_items_facturas ADD CONSTRAINT FK_PRODUCTO
FOREIGN KEY (NUMERO) REFERENCES tb_facturas(NUMERO);

/* tb_producto.CODIGO como llave foranea tb_items_facturas */
ALTER TABLE tb_items_facturas ADD CONSTRAINT FK_PRODUCTO
FOREIGN KEY (NUMERO) REFERENCES tb_producto(CODIGO);

Insert

INSET [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    { {VALUES | VALUE} (value_list) [, (value_list)] ...
      |
      VALUES row_constructor_list
    }
    [AS row_alias[(col_alias [, col_alias] ...)]]


INSET [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [AS row_alias[(col_alias [, col_alias] ...)]]
    SET assignment_list
    [ON DUPLICATE KEY UPDATE assignment_list]
INSERT INTO tb_producto (
    CODIGO, DESCRIPCION, SABOR, TAMANO, ENVASE, PRECIO_LISTA
) VALUES
    ('1040107', 'Light', 'Sandía', '350 ml', 'Lata', 4.56),
    ('1040108', 'Light', 'Guanába', '350 ml', 'Lata', 4.56),
    ('1040109', 'Light', 'Asaí', '350 ml', 'Lata', 3.50);
INSERT INTO TABLA_DE_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 Jebús',
    'Ciudad de México', 'EM', '22002002', '1995-01-07', 25, 'M', 150000, 250000, 1),
    ('7771579779', 'Marcelo Perez', 'F.C. de Cuernavaca 13', 'Carola',
    'Ciudad de México', 'EM', '88202912', '1992-01-25', 29, 'M', 120000, 200000, 1),
    ('5576228758', 'Patricia Olivera', 'Pachuca 75',  'Condesa', 'Ciudad de México',
    'EM', '88192029', '1995-01-14', 25, 'F', 70000, 160000, 1);

Insertar datos desde otro schema

USER jugos_ventas;

INSERT INTO tb_producto
SELECT CODIGO_DEL_PRODUCTO AS CODIGO, NOMBRE_DEL_PRODUCTO AS DESCRIPCION,
SABOR, TAMANO, ENVASE, PRECIO_DE_LISTA AS PRECIO_LISTA
FROM jugos.vetnas.tabla_de_productos
WHERE CODIGO_DEL_PRODUCTO NOT IN (SELECT CODIGO FROM tb_producto);

INSERT INTO tb_cliente
SELECT DNI, NOMBRE, DIRECCION_1 AS DIRECCION,
BARRIO, CIUDAD, ESTADO, CP, FECHA_DE_NACIMIENTO 
AS FECHA_NACIMIENTO, EDAD, SEXO, LIMITE_DE_CREDITO
AS LIMITE_CREDITO, VOLUMEN_DE_COMPRA AS VOLUMEN_COMPRA,
PRIMERA_COMPRA FROM jugos_ventas.tabla_de_clientes
WHERE DNI NOT IN (SELECT DNI FROM tb_cliente);

Table Data Import Wizard

img

Update

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

value: {expr | DEFAULT}

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

Actualizar un campo

UPDATE tb_producto SET PRECIO_LISTA = 5
WHERE CODIGO = '1000889';

Actualizar varios campos

UPDATE tb_producto SET
    DESCRIPCION = 'Sabor de la Montaña',
    TAMANO = '1 Litro',
    ENVASE = 'Botella PET'
WHERE CODIGO = '1000889';

UPDATE tb_cliente SET
    DIRECCION = 'Ruben Ramirez 16',
    BARRIO = 'Antonio',
    CIUDAD = 'Guadalajara',
    ESTADO = 'Jalisco',
    CP = '44700000'
WHERE DNI = '5840119709';

Actualizar todos los registros de una columna

UPDATE tb_cliente SET VOLUMEN_COMPRA = VOLUMEN_COMPRA/10;

Update con datos de otro schema

/* Se usa substring ya que el format de matrícula en la tabla B
 es '00???' */
UPDATE tb_vendedor A
    SELECT * FROM tb_vendedor A
    INNER JOIN
        jugos_ventas.tabla_de_vendedores B
    ON A.MATRICULA = SUBSTRING(B.MATRICULA, 3, 3)
SET A.DE_VACACIONES = B.VACACIONES;

Aumentar en 30% el volumen de compra de los clientes cuyos barrios tengan vendedores con domicilio allí

UPDATE tb_clientes A 
INNER JOIN 
    tb_vendedor B
ON A.BARRIO = B.BARRIO
SET A.VOLUMEN_COMPRA = A.VOLUMEN_COMPRA * 1.3;

DELETE

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [ORDER BY ...]
    [LIMIT row_count]
DELETE FROM tb_producto WHERE CODIGO = '1001000';

DELETE FROM tb_producto WHERE TAMANO = '1 Litro';
DELTE FROM tb_producto
WHERE CODIGO NOT IN (
    SELECT CODIGO_DEL_PRODUCTO
    FROM jugos_.tabla_de_productos
);

Eliminar las facturas cuyos clientes tengan menos de 18 años

DELETE A FROM tb_facturas A
INNER JOIN tb_vendedor B
ON A.DNI = B.DNI
WHERE B.EDAD < 18;

COMMIT y ROLLBACK

Confirmar o revertir una transacción

START TRANSACTION

-- TRANSACCIÓN

ROLLBACK
-- o
COMMIT

AUTO_INCREMENT

CREATE TABLE tb_identificacion(
    ID INT AUTO_INCREMENT NOT NULL,
    DESCRIPCION VARCHAR(50) NULL,
    PRIMARY KEY(ID)
);

Campo con valor DEFAULT

CREATE TABLE tb_default(
    ID INT AUTO_INCREMENT,
    DESCRIPCION VARCHAR(50) NOT NULL,
    DIRECCION VARCHAR(100) NULL,
    CIUDAD VARCHAR(50) DEFAULT 'Gaza',
    CREACION TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
    PRIMARY KEY(ID)
);

TRIGGERS

CREATE
    [ DEFINER = user ]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_boddy

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
CREATE TABLE tb_facturacion(
    FECHA DATE NULL,
    VENTA FLOAT
);

DELIMITER //

CREATE TRIGGER TG_FACTURACION_INSERT
AFTER INSERT ON tb_items_facturas
FOR EACH ROW BEGIN

    DELETE FROM tb_facturacion;
    INSERT INTO tb_facturacion
    SELECT A.FECHA, SUM(B. CANTIDAD * B.PRECIO) AS VENTA
    FROM tb_factura A
    INNER JOIN
        tb_items_facturas B
    ON A.NUMERO = B.NUMERO
    GROUP BY A.FECHA;

END //

Crear trigger que actualize la edad de los clientes cada vez que se inserte un nuevo cliente

DELIMITER //
CREATE TRIGGER TG_EDAD_CLIENTES_INSERT 
BEFORE INSERT ON tb_clientes
FOR EACH ROW BEGIN
    SET NEW.EDAD = timestampdiff(YEAR, NEW.FECHA_NACIMIENTO, NOW());
END//

Triggers para DELETE y UPDATE

DELIMITER //

CREATE TRIGGER TG_FACTURACION_DELETE
AFTER DELETE ON tb_items_facturas
FOR EACH ROW BEGIN

    DELETE FROM tb_facturacion;
    INSERT INTO tb_facturacion
    SELECT A.FECHA, SUM(B. CANTIDAD * B.PRECIO) AS VENTA
    FROM tb_factura A
    INNER JOIN
        tb_items_facturas B
    ON A.NUMERO = B.NUMERO
    GROUP BY A.FECHA;

END //

DELIMITER //

CREATE TRIGGER TG_FACTURACION_UPDATE
AFTER UPDATE ON tb_items_facturas
FOR EACH ROW BEGIN

    DELETE FROM tb_facturacion;
    INSERT INTO tb_facturacion
    SELECT A.FECHA, SUM(B. CANTIDAD * B.PRECIO) AS VENTA
    FROM tb_factura A
    INNER JOIN
        tb_items_facturas B
    ON A.NUMERO = B.NUMERO
    GROUP BY A.FECHA;

END //

Manipulación de datos

  • Stored Procedures
  • Herramientas ETL (extract transform load) Pentaho, Power Center, SAP Data Services, SQL Server Information Services, ...
  • Lenguajes Python, Java, PHP, ...