
-- Principales comandos DDL (Data Definition Language): Utilizado para definir estructuras de bases de datos y objetos como tablas, índices, y vistas.

-- CREATE DATABASE: permite crear una base de datos

CREATE DATABASE MiBaseDeDatos
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;


-- CREATE TABLE: Se utiliza para crear una nueva tabla en la base de datos.

USE MiBaseDeDatos; -- indicamos que tabla vamos a usar

CREATE TABLE departamentos (
    id INT PRIMARY KEY,
    nombre VARCHAR(50)
	);


CREATE TABLE Empleados (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50),
	dni VARCHAR(50) UNIQUE,
    salario DECIMAL(10, 2),
    fecha_contratacion DATE,
	departamento_id INT,
    CHECK (salario < 10000),
	CONSTRAINT fk_departamento
        FOREIGN KEY (departamento_id)
        REFERENCES departamentos(id)
);

-- Restricciones
Restricción 	        Descripción
NOT NULL 	    Indica que una columna no puede contener un valor NULL
UNIQUE 	        Indica que cada fila de la columna debe tener un valor único
PRIMARY KEY 	Combinación entre NOT NULL y UNIQUE. Asegura que una o más columnas tienen una identidad única
FOREIGN KEY 	Asegura la integridad referencial de los datos 
CHECK 	        Asegura que el valor de una columna cumple con una condición específica
DEFAULT     	Establece un valor por defecto en una columna



-- ALTER TABLE: Se utiliza para modificar una tabla existente, agregando, modificando o eliminando columnas.

ALTER TABLE Empleados
ADD COLUMN departamento VARCHAR(50), -- Añade
MODIFY COLUMN salario DECIMAL(12, 2), -- Modifica el tipo
DROP COLUMN fecha_contratacion, --Elimina
RENAME TO Empleados2; -- Renombra la tabla


-- Añadir una restricción

ALTER TABLE orders -- Tabla sobre la que actuamos
ADD CONSTRAINT fk_customerNumber -- Nombre restricción
FOREIGN KEY (customerNumber) -- Restricción
REFERENCES customers(customerNumber); -- Tabla de la clave primaria

-- CREATE INDEX: Se utiliza para crear un índice en una tabla para acelerar la búsqueda de registros.
CREATE INDEX idx_nombre ON Empleados(nombre);
-- DROP INDEX: Se utiliza para eliminar un índice existente de la base de datos.
DROP INDEX idx_nombre ON Empleados;

--CREATE VIEW: Se utiliza para crear una vista, que es una tabla virtual basada en los resultados de una consulta
CREATE VIEW VistaEmpleados AS
SELECT id, nombre, salario FROM Empleados WHERE departamento = 'Ventas';
--DROP VIEW VistaEmpleados; para borrarla

--CREATE PROCEDURE: Se utiliza para crear un procedimiento almacenado, que es un conjunto de instrucciones SQL que se pueden ejecutar de forma repetida.

DELIMITER //
CREATE PROCEDURE ObtenerPedidosUsuario(usu_id INT )
BEGIN
    SELECT * FROM pedidos WHERE cliente_id = usu_id;
END//
DELIMITER ;

--Para ejecutarlo
CALL ObtenerPedidosUsuario('ID_DEL_USUARIO');
--Para borrarlo
DROP PROCEDURE ObtenerPedidosUsuario;