├── StorSALES.mwb ├── 0. Léeme-primero.md ├── 6. CASE. Strings, subquerys.sql ├── 4. Script Filtering.sql ├── 5. Joins.sql ├── 3. Script Querys_básicas.sql ├── 1. Script datafriends.sql ├── 2. Base de datos ventas.sql └── 7. Cleaning project.sql /StorSALES.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carolindata/SQL-Tutorials/HEAD/StorSALES.mwb -------------------------------------------------------------------------------- /0. Léeme-primero.md: -------------------------------------------------------------------------------- 1 | # Recomendaciones 2 | 3 | Te recomiendo ver los tutoriales e ir haciendo al mismo tiempo 4 | Tomate tu tiempo, más que completar el tutorial y replicar el script como tal, te recomiendo ir pausando y haciendo, procurando entender la dinámica de una u otra cláusula así como analizar para qué te puede ser útil y qué tipo de situaciones. 5 | 6 | También te animo a crear tus propias bases de datos, ya sea que cuentes con tus propios archivos, de tu negocio, etc, o que los descargues de fuentes externas o las inventes tu mismo. Aquí te dejo dónde puedes encontrar fuentes de libre descarga👉 https://www.youtube.com/watch?v=P89SKzM15wk&ab 7 | 8 | Aprender la herramienta es muy importante, claro, pero más allá de ello, te invito a reflexionar y analizar, cómo el programa o herramienta me ayuda a solucionar determinada situación. 9 | 10 | ## Lo importante no es la herramienta sino lo que puedes lograr con ella. 11 | 12 | Te dejo la lista de tutoriales aquí 👉 https://www.youtube.com/playlist?list=PLq_6OWBdkhjpevODx5l25rEEp4J8dQepE 13 | 14 | **🔴 No olvides apoyar mi canal con tu comentario, tu suscripción y un me gusta, esto le dice a YouTube que encuentras mi contenido de utilidad y lo recomienda a más personas.** 15 | 16 | **El contenido que genero es gratuito, si deseas contribuir a mi trabajo, invítame un café, el dinero recaudado ayudará a pagar mis estudios** 17 | - Paypal: https://paypal.me/carolinacnb 18 | - Otros medios: https://carolinadata.gumroad.com/l/colab 19 | - Nequi: envíame un mensaje a instagram @my.study.days o a carolinaninobeltran@gmail.com para darte más detalles. 20 | -------------------------------------------------------------------------------- /6. CASE. Strings, subquerys.sql: -------------------------------------------------------------------------------- 1 | -- CASE -- 2 | 3 | SELECT producto, vendedor, venta_total_$, 4 | CASE 5 | WHEN venta_total_$ > 600 THEN 'cumplido' 6 | ELSE 'no cumplido' 7 | END AS 'cumplimiento_meta' 8 | FROM ventas; 9 | 10 | SELECT producto, vendedor, tienda, venta_total_$, 11 | CASE 12 | when tienda = 1 then 'sin metrica' 13 | WHEN venta_total_$ > 600 THEN 'cumplido' 14 | ELSE 'no cumplido' 15 | END AS 'cumplimiento_meta' 16 | FROM ventas 17 | order by tienda, cumplimiento_meta; 18 | 19 | -- subquerys 20 | Select avg(costo) from productos; -- sub 21 | Select categoría, producto, (Select avg(costo) from productos) as costoprom 22 | from productos; 23 | 24 | SELECT AVG(Venta_total_$) FROM Ventas; -- sub 25 | SELECT * FROM Ventas 26 | WHERE Venta_total_$ > (SELECT AVG(Venta_total_$) FROM Ventas); 27 | 28 | create table tiendaserr ( 29 | id_tienda int, 30 | país varchar(45), 31 | ciudad varchar(45), 32 | nombre_tienda varchar(45) 33 | ); 34 | 35 | insert into tiendaserr (select * from tiendas); -- insertamos los resultados de tiendas en tiendas err 36 | 37 | update tiendaserr set nombre_tienda = ' Pintuland' where id_tienda = 1; 38 | update tiendaserr set nombre_tienda = 'la casa del pintor' where id_tienda = 2; 39 | update tiendaserr set nombre_tienda = 'Pinturama ' where id_tienda = 3; 40 | 41 | -- STRING 42 | select * from tiendaserr; 43 | 44 | select nombre_tienda, rtrim(nombre_tienda) as'sin_espacios_derecha' from tiendaserr; -- derecha pinturama 45 | select nombre_tienda, ltrim(nombre_tienda) as'sin_espacios_izq' from tiendaserr; -- izquierda pintuland 46 | select nombre_tienda, trim(nombre_tienda) as'sin_espacios_derecha' from tiendaserr; -- izquierda y derecha 47 | select replace (nombre_tienda, ' ', '_') AS 'sin_espacios' from tiendaserr; 48 | select nombre_tienda, substring(nombre_tienda, 1,3) as 'subtexto' from tiendas; -- extraer cierto numero caracteres 49 | select nombre_tienda, upper(nombre_tienda) as 'Mayusc' from tiendas; 50 | select nombre_tienda, lower(nombre_tienda) as 'Minusc' from tiendas; 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /4. Script Filtering.sql: -------------------------------------------------------------------------------- 1 | -- ========================================= -- 2 | -- FILTRAR DATOS -- 3 | -- ========================================= -- 4 | 5 | -- ____________________________________________________________ 6 | -- >> Evaluando condiciones <<-- 7 | 8 | -- where AND (todos los campos deben cumplirs la condición) 9 | select * from productos 10 | Where categoría = 'Accesorios'and costo < 20; 11 | 12 | -- Where OR (al menos una condición debe cumplirse - SQL arroja la que primero se cumpla) 13 | Select * from productos 14 | where categoría = 'herramientas' or producto = 'cinta métrica'; 15 | 16 | -- Se tiene varias condiciones es conveniente usar parentesis 17 | Select * from vendedores 18 | where (nombre = 'Juan' or apellido = 'Pérez') and salario > 1500; 19 | 20 | -- >> Video pasado: algunas condiciones <<-- 21 | -- Igualdades : > , < , = ; Desigualdades: != <> 22 | 23 | -- ______________________________________________________________________________ 24 | -- Rangos: BETWEEN (seleccionar datos entre dos valores numéricos o alfabéticos) 25 | -- BETWEEN (números, fechas, texto) (incluye el limite del rango) 26 | Select * from ventas 27 | where Venta_total_$ between '500' and '1000'; 28 | 29 | Select * from ventas 30 | where Fecha_venta between '2023-01-01' and '2023-01-20'; 31 | 32 | Select * from vendedores 33 | where nombre between 'c' and 'm'; 34 | -- (no toma maría, porque la a está un poco más allá de la m, así que extendemos la consulta a MZ por ejemplo) 35 | Select * from vendedores 36 | where nombre between 'c' and 'mz'; 37 | 38 | Select * from vendedores 39 | where nombre not between 'c' and 'mz'; 40 | 41 | -- "Membresía" (a que varios elementos se reunan según un criterio IN ) 42 | -- Vendedores que trabajen en la tienda 1 o 2) 43 | Select * from vendedores 44 | where tienda in ('1','2'); 45 | 46 | Select * from vendedores 47 | where tienda not in ('1','2'); 48 | 49 | -- ____________________________________________________________ 50 | -- >> Identificar patrones <<-- 51 | -- Wildcards (símbolos que identifican patrones parciales en un campo) 52 | -- para insertar un comodín se usa LIKE 53 | -- "-" Exactamente un caracter 54 | -- "%" Culquier numero de caracteres incluyendo 0 55 | 56 | Select Nombre from vendedores where nombre like '%dro'; 57 | Select Nombre from vendedores where nombre like 'P%'; 58 | Select Nombre from vendedores where nombre like '%dr%'; 59 | Select Nombre from vendedores where nombre like 'P__ro'; 60 | Select Nombre from vendedores where nombre like 'P_d%'; 61 | 62 | Select Nombre from vendedores where nombre like 'l%' or nombre like '%a'; 63 | 64 | -- REGEXP regular expresion (construir expresiones para que SQL realice la búsqueda) 65 | 66 | select nombre, apellido from vendedores where nombre regexp 'an' ; -- (buscar los nombres que tienen an) 67 | select nombre, apellido from vendedores where nombre regexp 'an|dro'; -- (buscar los nombres que tienen an o dro) 68 | Select nombre, apellido from vendedores where nombre regexp '^s'; -- (^ indica que el nombre debe iniciar con s) 69 | Select nombre, apellido from vendedores where nombre regexp 'a$'; -- ($ indica que el nombre debe terminar con n) 70 | select nombre, apellido from vendedores where nombre regexp '[ín]a'; -- ([] combina las letras dentro de los parentesis con la letra siguiente) 71 | select nombre, apellido from vendedores where nombre regexp '[m-n]'; 72 | 73 | -- ^ inicio 74 | -- $ final 75 | -- | or 76 | -- [abcd] caracteres que contengan caracteres 77 | -- [a-f] rango de caracteres 78 | 79 | -- Identificar valores nulos 80 | Select * from vendedores where nombre is null; 81 | Select * from vendedores where nombre is not null; 82 | 83 | -- combinando consultas con valores no nulos 84 | Select * from productos 85 | where categoría is null 86 | or costo not between '5' and '10'; 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /5. Joins.sql: -------------------------------------------------------------------------------- 1 | -- ======================================================================= -- 2 | -- JOINS - Trabajar con multiples tablas -- 3 | -- ======================================================================= -- 4 | 5 | -- Cuando se desea cruzar información de dos o más tablas usamos JOINS 6 | -- Para cruzar los datos se hace uso de las llaves primarias y foráneas 7 | 8 | select count(*) as total_registros from ventas; -- (revisar el numero de registros) 9 | 10 | -- INNER JOINS -- 11 | -- Combina las filas de dos o más tablas solo si tienen coincidencias en las columnas especificadas en la cláusula de unión. 12 | 13 | -- en la tabla de ventas queremos ver el nombre de la tienda 14 | select * from ventas; 15 | select * from tiendas; 16 | select * from vendedores; 17 | select * from productos; 18 | 19 | -- en la tabla de ventas queremos ver el nombre de la tienda 20 | SELECT * -- (todas las columnas de las dos tablas) 21 | FROM ventas v 22 | INNER JOIN tiendas t ON v.Tienda = t.Id_tienda; 23 | 24 | SELECT V.Fecha_venta, V.Unidades, V.Venta_total_$, T.Nombre_tienda 25 | FROM ventas v 26 | INNER JOIN tiendas t ON v.Tienda = t.Id_tienda; 27 | 28 | -- en la tabla de ventas queremos ver el producto, el nombre del vendedor y la fecha de venta 29 | select V.Fecha_venta, V.Unidades, V.Venta_total_$, VS.Nombre 30 | from ventas v 31 | join vendedores vs on v.vendedor = vs.id_vend; 32 | 33 | -- en la tabla de vendedores queremos ver el nombre y apellido del vendedor y el nombre de la tienda 34 | select vs.Nombre, vs.Apellido, t.Nombre_tienda, t.País 35 | from vendedores vs 36 | join tiendas t on vs.tienda = t.id_tienda; 37 | 38 | -- en la tabla de ventas queremos ver el nombre del producto, el nombre y apellido del vendedor, el nombre de la tienda, las unidades y la venta total. 39 | 40 | select * from ventas; 41 | 42 | select v.Fecha_venta , p.producto, vs.nombre, vs. apellido, t.Nombre_tienda, v.unidades, v.Venta_total_$ 43 | from ventas v 44 | join productos p on v.producto = p.id_prod 45 | join vendedores vs on v.vendedor = vs.id_vend 46 | join tiendas t on v.tienda = t.id_tienda 47 | where v.Venta_total_$ > 500; 48 | 49 | -- Conjuntos 50 | -- Crear base de datos 51 | Create database joins; 52 | use joins; 53 | 54 | -- Crear tabla de países 55 | CREATE TABLE Paises ( 56 | id_pais INT PRIMARY KEY, 57 | nombre_pais VARCHAR(50) 58 | ); 59 | 60 | drop table ciudades; 61 | -- Crear tabla de ciudades 62 | 63 | CREATE TABLE Ciudades ( 64 | id_ciudad INT PRIMARY KEY, 65 | nombre_ciudad VARCHAR(50), 66 | id_pais INT, 67 | FOREIGN KEY (id_pais) REFERENCES Paises(id_pais) 68 | ); 69 | 70 | -- Insertar datos de ejemplo en la tabla de países 71 | INSERT INTO Paises (id_pais, nombre_pais) 72 | VALUES (1, 'Estados Unidos'), 73 | (2, 'Canadá'), 74 | (3, 'México'), 75 | (4, 'Perú'), 76 | (5, 'España') ; 77 | 78 | -- Insertar datos de ejemplo en la tabla de ciudades 79 | INSERT INTO ciudades (id_ciudad, nombre_ciudad, id_pais) 80 | VALUES (1, 'Nueva York', 1), 81 | (2, 'Toronto', 2), 82 | (3, 'Ciudad de México', 3), 83 | (4, 'Bogotá',null), 84 | (5, 'Buenos Aires',null); 85 | 86 | -- mostrar la intersección 87 | Select p.nombre_pais, c.nombre_ciudad 88 | from paises p 89 | join ciudades c on p.id_pais = c.id_pais; -- defecto inner joinn o intersección 90 | 91 | -- mostrar todos los datos de la tabla izquierda 92 | Select p.nombre_pais, c.nombre_ciudad 93 | from paises p 94 | left join ciudades c on p.id_pais = c.id_pais; 95 | 96 | -- mostrar todos los datos de la tabla derecha 97 | Select p.nombre_pais, c.nombre_ciudad 98 | from paises p 99 | right join ciudades c on p.id_pais = c.id_pais; 100 | 101 | -- 102 | Select p.nombre_pais, c.nombre_ciudad 103 | from paises p 104 | left join ciudades c on p.id_pais = c.id_pais 105 | UNION -- unir las consultas 106 | Select p.nombre_pais, c.nombre_ciudad 107 | from paises p 108 | right join ciudades c on p.id_pais = c.id_pais; 109 | 110 | -- mostrar todos los datos de las dos tablas - unir las consultas (UNION ALL) 111 | Select p.nombre_pais, c.nombre_ciudad 112 | from paises p 113 | left join ciudades c on p.id_pais = c.id_pais 114 | UNION -- unir las consultas (UNION ALL) 115 | Select p.nombre_pais, c.nombre_ciudad 116 | from paises p 117 | right join ciudades c on p.id_pais = c.id_pais; 118 | -------------------------------------------------------------------------------- /3. Script Querys_básicas.sql: -------------------------------------------------------------------------------- 1 | -- ================================================================ -- 2 | -- CLÁUSULAS BÁSICAS -- 3 | -- ================================================================ -- 4 | 5 | -- >>>> SELECT <<<<-- 6 | 7 | -- Seleccionar columnas -- 8 | Select * From productos; 9 | Select categoría, producto from productos; 10 | 11 | -- Identificar datos únicos 12 | Select distinct Categoría from productos; 13 | 14 | -- Seleccioanr columnas y renombrarlas en la consulta -- 15 | Select categoría, producto as detalle from productos; 16 | 17 | -- Seleccionar columnas y adicionar "modificadores" 18 | -- Averiguar el precio de venta por unidad -- 19 | Select fecha_venta, Unidades, Venta_total_$, (venta_total_$/unidades) as venta_unidad from ventas; 20 | Select avg(Venta_total_$) from ventas; 21 | 22 | -- >>>> FROM <<<<-- 23 | 24 | Select * from productos; 25 | Select p.producto from productos p; -- (útil cuando se trabaja con varias tablas joins) 26 | 27 | -- >>>> WHERE <<<<- (filtro) 28 | -- Orden (Select * FROM nombre_tabla WHERE condición GROUP BY ....') 29 | 30 | -- Operadores de comparación más comunes "=", "<", ">", "<=", ">= , != 31 | Select producto, costo from productos 32 | where costo != 24; 33 | 34 | -- -- Operadores lógicos más comunes "AND", "OR", "IN", "NOT" 35 | 36 | -- AND (múltiples condiciones - Diferentes columnas) 37 | Select * from productos 38 | where categoría = 'herramientas' and producto = 'sierra circular' and costo > 10 ; 39 | 40 | Select * from productos where Categoría = 'herramientas' and Categoría = 'Accesorios'; -- se anula 41 | 42 | -- OR (múltiples condiciones - pero permitiendo que al menos una de las condiciones se cumpla) 43 | Select * from tiendas where ciudad = 'Lima' or país = 'Colombia'; -- (diferentes columnas) 44 | Select * from productos where Categoría = 'herramientas' or Categoría = 'Accesorios'; -- (en la misma columna) 45 | 46 | -- IN ( filtrar los resultados de una consulta basándose en una lista de valores específicos) 47 | Select * from productos where Categoría IN ('herramientas', 'accesorios'); 48 | 49 | -- NOT (selecciona lo contrario a la consulta) sintaxis: WHERE NOT 50 | Select * from productos where NOT Categoría IN ('herramientas', 'accesorios'); 51 | 52 | -- >>>> GROUP BY <<<<- (agrupar filas o registros de una o varias columnas simula las tablas dinámicas) 53 | -- Al agrupar los datos, se pueden realizar operaciones de agregación como SUM, COUNT, AVG, MAX, MIN, entre otras 54 | 55 | -- (debe ir en select las columnas que están agrupando y alguna función agregación) 56 | SELECT Categoría, COUNT(*) 57 | FROM productos 58 | GROUP BY Categoría; 59 | 60 | -- (costo promedio de la categoría) -- 61 | SELECT Categoría, sum(costo) as costo_total 62 | FROM productos 63 | GROUP BY Categoría; 64 | 65 | -- >>>> HAVING <<<<- (Se usa en conjunto con GROUP BY 66 | -- SQL para filtrar los resultados de una consulta que utiliza la cláusula GROUP BY. 67 | -- Mientras que la cláusula WHERE filtra las filas de la tabla de origen antes de que se agrupen y se apliquen las funciones de agregación, 68 | -- la cláusula HAVING filtra los grupos resultantes después de que se hayan aplicado las funciones de agregación. 69 | 70 | -- (agrupar las categorías, calcular la suma del costo, contar el numero de productos que están por encima de 10) 71 | SELECT Categoría, sum(costo) as costo_cat 72 | FROM productos 73 | GROUP BY Categoría 74 | HAVING SUM(costo) > 10; -- (se quiere conocer la cantidad total de costos de los productos en cada categoría que superan los 10 USD) 75 | 76 | -- se está agrupando los productos por categoría y sumando el costo de cada categoría (que viene siendo la suma del costo de cada producto dentro de cada categoría) 77 | -- la cláusula HAVING está filtrando los resultados para mostrar solo aquellas categorías donde la suma total de los costos de los productos en la categoría es mayor a 10. 78 | 79 | -- >>>> ORDER BY (ASC - DESC) <<<<- 80 | 81 | SELECT Categoría, sum(costo) as costo_cat 82 | FROM productos 83 | GROUP BY Categoría 84 | HAVING SUM(costo) > 10 85 | ORDER by Costo_cat; 86 | 87 | SELECT Categoría, sum(costo) as costo_cat 88 | FROM productos 89 | GROUP BY Categoría 90 | HAVING SUM(costo) > 10 91 | ORDER by costo_cat desc; 92 | 93 | -- >>>> LIMIT <<<<- 94 | Select * from productos; 95 | Select count(*) from productos; -- (conocer el numero de registros) 96 | -- Limitar el número de registros 97 | Select * from productos 98 | Limit 5; -------------------------------------------------------------------------------- /1. Script datafriends.sql: -------------------------------------------------------------------------------- 1 | -- ===========================================================-- 2 | -- CREAR, ELIMINAR Y RENOMBRAR LA BASE DE DATOS -- 3 | -- ===========================================================-- 4 | 5 | -- crear base de datos -- 6 | CREATE DATABASE Youtubechan; 7 | DROP DATABASE Youtubechan; 8 | 9 | -- crear base de datos -- 10 | CREATE DATABASE YT; 11 | 12 | 13 | -- mostrar listado de bases de datos -- 14 | show databases; 15 | 16 | -- indicar la base de datos con la que se desea trabajar 17 | use YT; 18 | 19 | -- ===========================================================-- 20 | -- CREAR TABLAS DENTRO DE LA BASE DATOS -- 21 | -- ===========================================================-- 22 | 23 | -- Las tablas deben llevar: 24 | -- Nombre tabla, Id unico (pk), atributos (columnas) y el tipo de dato que va a contener la columna 25 | -- Se debe identificar la propiedad ,la PK y la FK si es el caso: 26 | 27 | -- crear base de datos -- 28 | create table suscriptores ( 29 | id_df int not null auto_increment, 30 | nombrre varchar (255), 31 | email varchar (255), 32 | primary key (id_df) 33 | ); 34 | 35 | -- quiero ver mi tabla -- 36 | select * from suscriptores; 37 | SHOW CREATE TABLE suscriptores; -- copy field -- 38 | 39 | 40 | -- ===========================================================-- 41 | -- MODIFICAR TABLAS DENTRO DE LA BASE DE DATOS -- 42 | -- ===========================================================-- 43 | 44 | -- cambiar el nombre de la tabla -- 45 | ALTER TABLE suscriptores RENAME TO datafriends; 46 | 47 | -- insertar una columna (se olvidó whatsapp) -- 48 | ALTER TABLE datafriends ADD whatsapp int; 49 | 50 | -- cambiar el nombre de una columna -- 51 | ALTER TABLE datafriends RENAME COLUMN nombrre TO nombre; 52 | 53 | -- cambiar el tipo de dato y una propiedad de una columna -- 54 | -- (a pesar que es un número telefónico, lo dejo como caracter por los indicativos o un numero puede iniciar en 0 o +) -- 55 | -- queremos que estos datos siempre sean diligenciados - not null -- 56 | ALTER TABLE datafriends MODIFY whatsapp VARCHAR(30) not null; 57 | 58 | -- Ahora quiero ver el comando ver el código de mi tabla ya creada 59 | Select * from datafriends; 60 | SHOW CREATE TABLE datafriends; -- copy field -- 61 | 62 | -- ===========================================================-- 63 | -- INSERTAR DATOS DENTRO DE LA TABLA -- 64 | -- ===========================================================-- 65 | 66 | -- insertar registro por registro -- 67 | INSERT INTO datafriends (nombre, email, whatsapp ) values ('Kennys Botero', 'kennys@gmail.com', '+57123456789'); 68 | INSERT INTO datafriends (nombre, email, whatsapp ) values ('Luis Ibarra', 'Luis@gmail.com', '+57213456798'); 69 | 70 | -- ver los registros -- 71 | Select * from datafriends; 72 | 73 | -- insertar varios registros en una sola consulta 74 | INSERT INTO datafriends (nombre, email, whatsapp) 75 | values 76 | ('Gastón', 'gastónmiau@gmail.com', '+578734567890'), 77 | ('Crokylol', 'crokylol@gmail.com', '+899876543210'), 78 | ('Mary', 'mary@gmail.com', '+899873443670'); 79 | -- ejecutar x 2 (error a propósito) 80 | 81 | -- ===========================================================-- 82 | -- MODIFICAR REGISTROS DENTRO DE LA TABLA -- 83 | -- ===========================================================-- 84 | 85 | SELECT * FROM Datafriends; 86 | -- borrar un registro -- 87 | DELETE FROM datafriends where id_df = '6'; 88 | DELETE FROM datafriends where id_df between 7 and 8; 89 | 90 | -- actualizar un registro -- 91 | update datafriends set nombre = 'Gastón Miau' where id_df = 3; 92 | 93 | -- ===========================================================-- 94 | -- CREAR OTRA TABLA -- 95 | -- ===========================================================-- 96 | 97 | -- Crear la tabla "compras" 98 | CREATE TABLE compras ( 99 | id_c INT NOT NULL AUTO_INCREMENT, 100 | comprador INT, 101 | producto VARCHAR(50), 102 | cantidad INT, 103 | PRIMARY KEY (id_c), 104 | FOREIGN KEY (comprador) REFERENCES datafriends(id_df) 105 | ); 106 | 107 | -- Insertar algunos datos en la tabla "compras" 108 | INSERT INTO compras (comprador, producto, cantidad) 109 | values 110 | (1, 'sticker', 2), 111 | (4, 'supergracias', 3), 112 | (2, 'supergracias', 1), 113 | (1, 'supergracias', 2), 114 | (3, 'supergracias', 1), 115 | (5, 'paypal', 3); 116 | 117 | -- ver los registros -- 118 | Select * from compras; 119 | SHOW CREATE TABLE compras; -- copy field -- 120 | 121 | -- actualizar un registro 122 | update compras set producto = 'paypal' where id_c = 3 ; 123 | 124 | -- ver registros 125 | select * from compras; 126 | 127 | -- ===========================================================-- 128 | -- Diagrama Entidad relación -- 129 | -- ===========================================================-- 130 | 131 | -- Pestaña database>> reverse eningenier 132 | 133 | -- ===========================================================-- 134 | -- Eliminar tablas y bases de datos -- 135 | -- ===========================================================-- 136 | 137 | Drop table compras; 138 | Drop database yt; 139 | create database yt; -- se debe ejecutar nuevamente la consulta -- -------------------------------------------------------------------------------- /2. Base de datos ventas.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.32, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: storesales 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.32 6 | 7 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 8 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 9 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 10 | /*!50503 SET NAMES utf8 */; 11 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; 12 | /*!40103 SET TIME_ZONE='+00:00' */; 13 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 14 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 15 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 16 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 17 | 18 | -- 19 | -- Table structure for table `productos` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `productos`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `productos` ( 26 | `Id_prod` int NOT NULL AUTO_INCREMENT, 27 | `Categoría` varchar(100) NOT NULL, 28 | `Producto` varchar(100) DEFAULT NULL, 29 | `costo` int DEFAULT NULL, 30 | PRIMARY KEY (`Id_prod`) 31 | ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb3; 32 | /*!40101 SET character_set_client = @saved_cs_client */; 33 | 34 | -- 35 | -- Dumping data for table `productos` 36 | -- 37 | 38 | LOCK TABLES `productos` WRITE; 39 | /*!40000 ALTER TABLE `productos` DISABLE KEYS */; 40 | INSERT INTO `productos` VALUES (1,'Herramientas','Martillo de carpintero',15),(2,'Herramientas','Destornillador Phillips',5),(3,'Herramientas','Sierra circular',45),(4,'Herramientas','Llave inglesa',10),(5,'Accesorios','Cinta métrica',7),(6,'Accesorios','Gafas de seguridad',12),(7,'Accesorios','Guantes de trabajo',8),(8,'Pintura mural','Pintura de pared blanca',20),(9,'Pintura mural','Pintura de pared gris',25),(10,'Pintura mural','Pintura de pared beige',30),(11,'Pintura mural','Pintura de pared amarilla',35),(12,'Pintura mural','Pintura de pared roja',40),(13,'Pintura mural','Pintura de pared azul',45),(14,'Pintura en spray','Pintura en spray negra',10),(15,'Pintura en spray','Pintura en spray blanca',10),(16,'Pintura en spray','Pintura en spray dorada',15),(17,'Pintura en spray','Pintura en spray plateada',15),(18,'Pintura en spray','Pintura en spray verde',10),(19,'Pintura en spray','Pintura en spray roja',10); 41 | /*!40000 ALTER TABLE `productos` ENABLE KEYS */; 42 | UNLOCK TABLES; 43 | 44 | -- 45 | -- Table structure for table `tiendas` 46 | -- 47 | 48 | DROP TABLE IF EXISTS `tiendas`; 49 | /*!40101 SET @saved_cs_client = @@character_set_client */; 50 | /*!50503 SET character_set_client = utf8mb4 */; 51 | CREATE TABLE `tiendas` ( 52 | `Id_tienda` int NOT NULL AUTO_INCREMENT, 53 | `País` varchar(45) DEFAULT NULL, 54 | `Ciudad` varchar(45) DEFAULT NULL, 55 | `Nombre_tienda` varchar(45) DEFAULT NULL, 56 | PRIMARY KEY (`Id_tienda`) 57 | ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3; 58 | /*!40101 SET character_set_client = @saved_cs_client */; 59 | 60 | -- 61 | -- Dumping data for table `tiendas` 62 | -- 63 | 64 | LOCK TABLES `tiendas` WRITE; 65 | /*!40000 ALTER TABLE `tiendas` DISABLE KEYS */; 66 | INSERT INTO `tiendas` VALUES (1,'Argentina','Buenos Aires','Pintuland'),(2,'Perú','Lima','La casa del pintor'),(3,'México','Ciudad de México','Pinturama'),(4,'Colombia','Bogotá','Super Pinturas'); 67 | /*!40000 ALTER TABLE `tiendas` ENABLE KEYS */; 68 | UNLOCK TABLES; 69 | 70 | -- 71 | -- Table structure for table `vendedores` 72 | -- 73 | 74 | DROP TABLE IF EXISTS `vendedores`; 75 | /*!40101 SET @saved_cs_client = @@character_set_client */; 76 | /*!50503 SET character_set_client = utf8mb4 */; 77 | CREATE TABLE `vendedores` ( 78 | `Id_vend` int NOT NULL, 79 | `Nombre` varchar(45) NOT NULL, 80 | `Apellido` varchar(45) DEFAULT NULL, 81 | `Tienda` int DEFAULT NULL, 82 | `Salario` int DEFAULT NULL, 83 | PRIMARY KEY (`Id_vend`), 84 | KEY `Id_vend_idx` (`Tienda`), 85 | CONSTRAINT `Id_vend` FOREIGN KEY (`Tienda`) REFERENCES `tiendas` (`Id_tienda`) 86 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; 87 | /*!40101 SET character_set_client = @saved_cs_client */; 88 | 89 | -- 90 | -- Dumping data for table `vendedores` 91 | -- 92 | 93 | LOCK TABLES `vendedores` WRITE; 94 | /*!40000 ALTER TABLE `vendedores` DISABLE KEYS */; 95 | INSERT INTO `vendedores` VALUES (1,'Juan','Pérez',1,2000),(2,'María','González',2,2500),(3,'Pedro','Sánchez',3,2200),(4,'Ana','López',4,2800),(5,'Luis','Hernández',1,1900),(6,'Lucía','Martínez',2,2700),(7,'Carlos','Ramírez',3,2400),(8,'Sofía','Díaz',4,3000); 96 | /*!40000 ALTER TABLE `vendedores` ENABLE KEYS */; 97 | UNLOCK TABLES; 98 | 99 | -- 100 | -- Table structure for table `ventas` 101 | -- 102 | 103 | DROP TABLE IF EXISTS `ventas`; 104 | /*!40101 SET @saved_cs_client = @@character_set_client */; 105 | /*!50503 SET character_set_client = utf8mb4 */; 106 | CREATE TABLE `ventas` ( 107 | `Id_Vtas` int NOT NULL AUTO_INCREMENT, 108 | `Producto` int NOT NULL, 109 | `Vendedor` int NOT NULL, 110 | `Tienda` int NOT NULL, 111 | `Unidades` int NOT NULL, 112 | `Venta_total_$` int NOT NULL, 113 | `Fecha_venta` date NOT NULL, 114 | PRIMARY KEY (`Id_Vtas`), 115 | KEY `Id_produ_idx` (`Producto`), 116 | KEY `Id_vended_idx` (`Vendedor`), 117 | KEY `Id_Tienda_idx` (`Tienda`), 118 | CONSTRAINT `Id_produ` FOREIGN KEY (`Producto`) REFERENCES `productos` (`Id_prod`), 119 | CONSTRAINT `Id_Tienda` FOREIGN KEY (`Tienda`) REFERENCES `tiendas` (`Id_tienda`), 120 | CONSTRAINT `Id_vended` FOREIGN KEY (`Vendedor`) REFERENCES `vendedores` (`Id_vend`) 121 | ) ENGINE=InnoDB AUTO_INCREMENT=355 DEFAULT CHARSET=utf8mb3; 122 | /*!40101 SET character_set_client = @saved_cs_client */; 123 | 124 | -- 125 | -- Dumping data for table `ventas` 126 | -- 127 | 128 | LOCK TABLES `ventas` WRITE; 129 | /*!40000 ALTER TABLE `ventas` DISABLE KEYS */; 130 | INSERT INTO `ventas` VALUES (268,1,1,1,10,100,'2023-01-01'),(269,2,2,2,20,200,'2023-01-02'),(270,3,3,3,30,300,'2023-01-03'),(271,4,4,4,40,400,'2023-01-04'),(272,5,5,1,50,500,'2023-01-05'),(273,6,6,2,60,600,'2023-01-06'),(274,7,7,3,70,700,'2023-01-07'),(275,8,8,4,80,800,'2023-01-08'),(276,9,1,1,90,900,'2023-01-09'),(277,10,2,2,100,1000,'2023-01-10'),(278,11,3,3,110,1100,'2023-01-11'),(279,12,4,4,120,1200,'2023-01-12'),(280,13,5,1,130,1300,'2023-01-13'),(281,14,6,2,140,1400,'2023-01-14'),(282,15,7,3,150,1500,'2023-01-15'),(283,16,8,4,160,1600,'2023-01-16'),(284,17,1,1,170,1700,'2023-01-17'),(285,18,2,2,180,1800,'2023-01-18'),(286,19,3,3,190,1900,'2023-01-19'),(287,1,4,4,200,2000,'2023-01-20'),(288,2,5,1,210,2100,'2023-01-21'),(289,3,6,2,220,2200,'2023-01-22'),(290,4,7,3,230,2300,'2023-01-23'),(291,5,8,4,240,2400,'2023-01-24'),(292,6,1,1,250,2500,'2023-01-25'),(293,7,2,2,260,2600,'2023-01-26'),(294,8,3,3,270,2700,'2023-01-27'),(295,9,4,4,280,2800,'2023-01-28'),(296,10,5,1,290,2900,'2023-01-29'),(297,12,6,3,50,500,'2023-02-01'),(298,13,7,4,60,600,'2023-02-02'),(299,14,8,1,70,700,'2023-02-03'),(300,15,1,2,80,800,'2023-02-04'),(301,16,2,3,90,900,'2023-02-05'),(302,17,3,4,100,1000,'2023-02-06'),(303,18,4,1,110,1100,'2023-02-07'),(304,19,5,2,120,1200,'2023-02-08'),(305,1,6,3,130,1300,'2023-02-09'),(306,2,7,4,140,1400,'2023-02-10'),(307,3,8,1,150,1500,'2023-02-11'),(308,4,1,2,160,1600,'2023-02-12'),(309,5,2,3,170,1700,'2023-02-13'),(310,6,3,4,180,1800,'2023-02-14'),(311,7,4,1,190,1900,'2023-02-15'),(312,8,5,2,200,2000,'2023-02-16'),(313,9,6,3,210,2100,'2023-02-17'),(314,10,7,4,220,2200,'2023-02-18'),(315,11,8,1,230,2300,'2023-02-19'),(316,12,1,2,240,2400,'2023-02-20'),(317,13,2,3,250,2500,'2023-02-21'),(318,14,3,4,260,2600,'2023-02-22'),(319,15,4,1,270,2700,'2023-02-23'),(320,16,5,2,280,2800,'2023-02-24'),(321,17,6,3,290,2900,'2023-02-25'),(322,18,7,4,300,3000,'2023-02-26'),(323,11,8,1,310,3100,'2023-02-27'),(324,1,1,2,320,3200,'2023-02-28'),(325,2,2,3,330,3300,'2023-03-01'),(326,4,1,1,15,150,'2023-03-02'),(327,7,2,2,24,240,'2023-03-03'),(328,10,3,3,33,330,'2023-03-04'),(329,13,4,4,42,420,'2023-03-05'),(330,16,5,1,51,510,'2023-03-06'),(331,19,6,2,60,600,'2023-03-07'),(332,2,7,3,69,690,'2023-03-08'),(333,5,8,4,78,780,'2023-03-09'),(334,8,1,1,87,870,'2023-03-10'),(335,11,2,2,96,960,'2023-03-11'),(336,14,3,3,105,1050,'2023-03-12'),(337,17,4,4,114,1140,'2023-03-13'),(338,1,5,1,123,1230,'2023-03-14'),(339,4,6,2,132,1320,'2023-03-15'),(340,7,7,3,141,1410,'2023-03-16'),(341,10,8,4,150,1500,'2023-03-17'),(342,13,1,1,159,1590,'2023-03-18'),(343,16,2,2,168,1680,'2023-03-19'),(344,19,3,3,177,1770,'2023-03-20'),(345,2,4,4,186,1860,'2023-03-21'),(346,5,5,1,195,1950,'2023-03-22'),(347,8,6,2,204,2040,'2023-03-23'),(348,11,7,3,213,2130,'2023-03-24'),(349,14,8,4,222,2220,'2023-03-25'),(350,17,1,1,231,2310,'2023-03-26'),(351,1,2,2,240,2400,'2023-03-27'),(352,4,3,3,249,2490,'2023-03-28'),(353,7,4,4,258,2580,'2023-03-29'),(354,10,5,1,267,2670,'2023-03-30'); 131 | /*!40000 ALTER TABLE `ventas` ENABLE KEYS */; 132 | UNLOCK TABLES; 133 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 134 | 135 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 136 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 137 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 138 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 139 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 140 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 141 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 142 | 143 | -- Dump completed on 2023-03-24 23:31:09 144 | -------------------------------------------------------------------------------- /7. Cleaning project.sql: -------------------------------------------------------------------------------- 1 | -- ======================================================================== -- 2 | -- LIMPIEZA DE DATOS SQL 3 | -- ========================================================================= -- 4 | 5 | -- =========== Preparando y explorando los datos ================== -- 6 | 7 | -- ----- Crear una base de datos 8 | CREATE DATABASE IF NOT EXISTS clean; 9 | 10 | -- ----- Importar el archivo csv. 11 | -- ----- Seleccionar la tabla a trabajar 12 | USE clean; 13 | 14 | -- ----- Generar una muestra de los datos 15 | SELECT * FROM LIMPIEZA LIMIT 10; 16 | 17 | -- =========== Store procedure - procedimiento almacenado (macro) ================== -- 18 | 19 | Select * from limpieza; -- se quiere evitar escribirlo repetidamente 20 | 21 | -- ----- crear el procedimiento para consultar sin escribir toda la consulta 22 | DELIMITER // 23 | CREATE PROCEDURE limp() 24 | BEGIN 25 | SELECT * FROM limpieza; 26 | END // 27 | DELIMITER ; 28 | -- ejecutar el procedimiento 29 | CALL limp; 30 | 31 | -- ----- Renombrar los nombres de las columnas con caracteres especiales 32 | ALTER TABLE limpieza CHANGE COLUMN `Id?empleado` Id_emp varchar(20) null; -- `caracteres especiales` -- 33 | 34 | -- =========== Verificar y remover registros duplicados ================== -- 35 | 36 | -- ----- Verificar si hay registros duplicados 37 | SELECT Id_emp, COUNT(*) AS cantidad_duplicados 38 | FROM limpieza 39 | GROUP BY Id_emp 40 | HAVING COUNT(*) > 1; 41 | /* Explicación: 42 | -- Group by: Agrupa los registros por el valor de la columna Id_emp, los registros con el mismo valor en Id_emp se agruparán juntos 43 | -- Having:especifica una condición que se aplicará después del agrupamiento, solo se seleccionarán los grupos que tengan una cantidad (COUNT(*)) mayor a 1 44 | -- se mostrarán los valores de Id_emp que tengan duplicados. 45 | -- En general, muestra los registros duplicados junto con la cantidad de ocurrencias de cada conjunto duplicado. */ 46 | 47 | -- ----- Contar el número de duplicados con Subquery 48 | SELECT COUNT(*) AS cantidad_duplicados 49 | FROM ( 50 | SELECT Id_emp 51 | FROM limpieza 52 | GROUP BY Id_emp 53 | HAVING COUNT(*) > 1 54 | ) AS subquery; 55 | /* Explicación: 56 | SELECT count(*) as (nombre columna) 57 | from (subconsulta) as te 58 | -- Subconsulta: para obtener los valores de Id_emp que están duplicados en la tabla limpieza. 59 | -- Consulta principal: se enfoca en contar la cantidad de registros devueltos por la subconsulta, es decir, la cantidad de duplicados 60 | -- AS 'Subquery' le asigna el alias a la subconsulta, El alias se utiliza para referirse a la subconsulta en la consulta principal. 61 | -- Al asignar un alias a la subconsulta, se puede utilizar ese alias en la consulta principal para referirse a la subconsulta como una tabla temporal. 62 | */ 63 | 64 | -- ----- Crear una tabla temporal con valores unicos y luego hacerla "original" (permanente) 65 | 66 | -- # cambiar el nombre de la tabla 'limpieza' por 'conduplicados' 67 | RENAME TABLE limpieza TO conduplicados; 68 | 69 | -- # crear una tabla temporal (sin datos duplicados) 70 | CREATE TEMPORARY TABLE temp_limpieza AS 71 | SELECT DISTINCT * FROM conduplicados; 72 | /*Explicación: 73 | -- CREATE TEMPORARY TABLE: Una tabla temporal solo existe durante la duración de la sesión de la conexión de la base de datos. 74 | -- AS: se utiliza para indicar que la tabla temporal está siendo definida como el resultado de una consulta SELECT 75 | -- SELECT: seleccionar únicamente los valores únicos(distinct) de las columnas en lugar de todos los registros. */ 76 | 77 | -- # verificar el número de registros 78 | SELECT COUNT(*) AS original FROM conduplicados; 79 | SELECT COUNT(*) AS temporal FROM temp_limpieza; 80 | 81 | -- # convertir la tabla temporal a permanente 82 | CREATE TABLE limpieza AS 83 | SELECT * FROM temp_limpieza; 84 | 85 | -- ----- Verificar nuevamente si aún hay duplicados 86 | SELECT COUNT(*) AS cantidad_duplicados 87 | FROM ( 88 | SELECT Id_emp 89 | FROM conduplicados -- verificar en ambas tablas 90 | GROUP BY Id_emp 91 | HAVING COUNT(*) > 1 92 | ) AS subquery; 93 | 94 | -- ----- Eliminar tabla que contiene los duplicados 95 | DROP TABLE conduplicados; 96 | 97 | -- =========== Verificar y remover registros duplicados ================== -- 98 | 99 | -- ----- Activar/Desactivar modo seguro - (0 desactivar) (1 activar) 100 | SET sql_safe_updates = 0; 101 | 102 | -- ----- Renombrar los nombres de las columnas 103 | ALTER TABLE limpieza CHANGE COLUMN `género` Gender varchar(20) null; 104 | ALTER TABLE limpieza CHANGE COLUMN Apellido Last_name varchar(50) null; 105 | ALTER TABLE limpieza CHANGE COLUMN star_date Start_date varchar(50) null; 106 | 107 | -- ----- Revisar los tipos de datos de la tabla 108 | DESCRIBE limpieza; -- Hay fechas con tipo de dato texto 109 | 110 | -- =========== Trabajando con texto (strings) ================== -- 111 | 112 | -- ----- Identificar nombres con espacios extra 113 | call limp(); 114 | 115 | SELECT Name FROM limpieza WHERE LENGTH(name) - LENGTH(TRIM(name)) > 0; 116 | /* Explicación: 117 | El largo del nombre - nombre del nombre sin caracteres, si es mayor a 0 es porque hay más espacios 118 | Hacer lo mismo con las columnas de texto */ 119 | 120 | -- ----- "Ensayo" del query antes de actualizar la tabla 121 | 122 | -- # Nombres con espacios 123 | SELECT name, TRIM(name) AS Name 124 | FROM limpieza 125 | WHERE LENGTH(name) - LENGTH(TRIM(name)) > 0; 126 | 127 | -- # modificando nombres 128 | UPDATE limpieza 129 | SET name = TRIM(name) 130 | WHERE LENGTH(name) - LENGTH(TRIM(name)) > 0; 131 | 132 | -- # Apellidos con espacios 133 | SELECT last_name, TRIM(Last_name) AS Last_name 134 | FROM limpieza 135 | WHERE LENGTH(last_name) - LENGTH(TRIM(last_name)) > 0; 136 | 137 | -- # modificando apellidos 138 | UPDATE limpieza 139 | SET last_name = TRIM(Last_name) 140 | WHERE LENGTH(Last_name) - LENGTH(TRIM(Last_name)) > 0; 141 | 142 | call limp(); 143 | 144 | -- ------ identificar espacios extra en medio de dos palabras 145 | 146 | -- # adicionar a propósito espacios extra 147 | UPDATE limpieza SET area = REPLACE(area, ' ', ' '); 148 | call limp(); 149 | 150 | -- # Explorar si hay dos o más espacios entre dos palabras 151 | SELECT area FROM limpieza 152 | WHERE area REGEXP '\\s{2,}'; 153 | 154 | -- # Consultar los espacios extra 155 | Select area, TRIM(REGEXP_REPLACE(area, '\\s+', ' ')) as ensayo 156 | FROM limpieza; 157 | /* Explicación: 158 | -- '\\s{2,}' : busca dos o más espacios en blanco consecutivos en una cadena 159 | -- '\\s+' : busca uno o más espacios en blanco consecutivos en una cadena 160 | -- TRIM(): eliminar cualquier espacio en blanco adicional al inicio o al final del valor en la columna 'area' 161 | -- La función REGEXP_REPLACE(area, '\\s+', ' ') busca cualquier secuencia de uno o más espacios en blanco (\\s+) 162 | en la columna 'area' y los reemplaza por un solo espacio en blanco (' '). */ 163 | 164 | UPDATE limpieza SET area = TRIM(REGEXP_REPLACE(area, '\\s+', ' ')); 165 | 166 | -- =========== Buscar y reemplazar (textos) ================== -- 167 | -- ------ Ajustar gender 168 | -- # ensayo 169 | SELECT gender, 170 | CASE 171 | WHEN gender = 'hombre' THEN 'Male' 172 | WHEN gender = 'mujer' THEN 'Female' 173 | ELSE 'Other' 174 | END as gender1 175 | FROM limpieza; 176 | 177 | -- # actualizar tabla 178 | UPDATE Limpieza 179 | SET Gender = CASE 180 | WHEN gender = 'hombre' THEN 'Male' 181 | WHEN gender = 'mujer' THEN 'Female' 182 | ELSE 'Other' 183 | END; 184 | CALL limp(); 185 | 186 | -- =========== Cambiar propiedad y reemplazar datos ================== -- 187 | DESCRIBE limpieza; 188 | 189 | ALTER TABLE limpieza MODIFY COLUMN Type TEXT; 190 | 191 | SELECT type, 192 | CASE 193 | WHEN type = 1 THEN 'Remote' 194 | WHEN type = 0 THEN 'Hybrid' 195 | ELSE 'Other' 196 | END as ejemplo 197 | FROM limpieza; 198 | 199 | UPDATE limpieza 200 | SET Type = CASE 201 | WHEN type = 1 THEN 'Remote' 202 | WHEN type = 0 THEN 'Hybrid' 203 | ELSE 'Other' 204 | END; 205 | -- revisamos cambios 206 | call limp(); 207 | 208 | -- =========== Ajustar formato números ================== -- 209 | call limp(); 210 | 211 | -- ----- consultar :reemplazar $ por un vacío y cambiar el separador de mil por vacío. 212 | SELECT salary, CAST(TRIM(REPLACE(REPLACE(salary, '$', ''), ',', '')) AS DECIMAL(15, 2)) from limpieza; 213 | /* Explicación 214 | -- REPLACE(salary, '$', ''):Se utiliza para eliminar el símbolo de dólar ('$') de la columna 'salary', 215 | y reemplaza cada aparición del símbolo $ con una cadena vacía (''). 216 | -- REPLACE(..., ',', ''): Se utiliza nuevamente para eliminar las comas (',') de la columna 'salary'. 217 | y reemplaza cada aparición de la coma con una cadena vacía (''). 218 | -- TRIM(...): Elimina cualquier espacio en blanco adicional alrededor del valor después de eliminar los símbolos y las comas. 219 | -- CAST(... AS DECIMAL(15, 2)): CAST() se utiliza para convertir el valor resultante en un número decimal con una precisión de 15 dígitos en total y 2 decimales. */ 220 | 221 | UPDATE limpieza SET salary = CAST(TRIM(REPLACE(REPLACE(salary, '$', ''), ',', '')) AS DECIMAL(15, 2)); 222 | 223 | 224 | -- =========== Trabajando con fechas ================== -- 225 | 226 | -- ------ Cambiar el tipo de dato de las columnas de texto (strings) a fechas 227 | DESCRIBE limpieza; -- hay tres fechas a ajustar (birth_day, start_day. finish_day) 228 | 229 | -- # Birth_day # 230 | 231 | -- ----- Identificar como están las fechas de fecha 232 | SELECT birth_date FROM limpieza; -- Orden en SQL AAAA-MM-DD = año, mes, día 233 | call limp(); -- está en mes, día, año. 234 | 235 | -- ----- "ensayo" - dar formato a la fecha 236 | SELECT birth_date, CASE 237 | WHEN birth_date LIKE '%/%' THEN DATE_FORMAT(STR_TO_DATE(birth_date, '%m/%d/%Y'), '%Y-%m-%d') 238 | WHEN birth_date LIKE '%-%' THEN DATE_FORMAT(STR_TO_DATE(birth_date, '%m-%d-%Y'), '%Y-%m-%d') 239 | ELSE NULL 240 | END AS new_birth_date 241 | FROM limpieza; 242 | /* Explicación 243 | -- CASE: evalua y reemplaza según condicion (similar al "si" en excel) 244 | -- WHEN birth_date LIKE '%/%': verifica si la columna birth_date contiene una barra diagonal o guión 245 | (indicando un formato de fecha mes/día/año); (si esto es una fecha, entonces) 246 | -- str_to_date(birth_date, '%m/%d/%Y'): Convierte el valor de birth_date de una cadena en formato mes/día/año a un objeto de fecha (MySQL). 247 | (se convierte el texto en objeto de fecha) 248 | -- date_format(, '%Y-%m-%d'): Formatea el objeto de fecha resultante en una cadena con el formato AAAA-MM-DD. 249 | (pasa la fecha a año, mes día) */ 250 | 251 | -- ----- Actualizar la tabla 252 | UPDATE limpieza 253 | SET birth_date = CASE 254 | WHEN birth_date LIKE '%/%' THEN date_format(str_to_date(birth_date, '%m/%d/%Y'),'%Y-%m-%d') 255 | WHEN birth_date LIKE '%-%' THEN date_format(str_to_date(birth_date, '%m-%d-%Y'),'%Y-%m-%d') 256 | ELSE NULL 257 | END; 258 | 259 | -- Cambiar el tipo de dato de la columna 260 | ALTER TABLE limpieza MODIFY COLUMN birth_date date; 261 | DESCRIBE limpieza; -- comprobar el cambio 262 | 263 | -- # Start_date (Se repite el proceso) 264 | -- ----- Identificar como están las fechas de fecha 265 | SELECT start_date FROM limpieza; -- Orden en SQL AAAA-MM-DD = año, mes, día 266 | call limp(); -- está en mes, día, año. 267 | 268 | -- ----- "ensayo" - dar formato a la fecha 269 | SELECT start_date, CASE 270 | WHEN start_date LIKE '%/%' THEN date_format(str_to_date(start_date, '%m/%d/%Y'),'%Y-%m-%d') 271 | WHEN start_date LIKE '%-%' THEN date_format(str_to_date(start_date, '%m-%d-%Y'),'%Y-%m-%d') 272 | ELSE NULL 273 | END AS new_start_date 274 | FROM limpieza; 275 | 276 | -- ----- Actualizar la tabla 277 | UPDATE limpieza 278 | SET start_date = CASE 279 | WHEN start_date LIKE '%/%' THEN date_format(str_to_date(start_date, '%m/%d/%Y'),'%Y-%m-%d') 280 | WHEN start_date LIKE '%-%' THEN date_format(str_to_date(start_date, '%m-%d-%Y'),'%Y-%m-%d') 281 | ELSE NULL 282 | END; 283 | 284 | -- Cambiar el tipo de dato de la columna 285 | ALTER TABLE limpieza MODIFY COLUMN start_date DATE; 286 | DESCRIBE limpieza; 287 | 288 | 289 | -- =========== Explorando funciones de fecha ================== -- 290 | 291 | -- usaremos finish_date para explorar 292 | SELECT finish_date FROM limpieza; 293 | CALL limp(); 294 | 295 | -- # "ensayos" hacer consultas de como quedarían los datos si queremos ensayar diversos cambios. 296 | SELECT finish_date, str_to_date(finish_date, '%Y-%m-%d %H:%i:%s') AS fecha FROM limpieza; -- convierte el valor en objeto de fecha (timestamp) 297 | SELECT finish_date, date_format(str_to_date(finish_date, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d') AS fecha FROM limpieza; -- objeto en formato de fecha, luego da formato en el deseado '%Y-%m-%d %H:' 298 | SELECT finish_date, str_to_date(finish_date, '%Y-%m-%d') AS fd FROM limpieza; -- separar solo la fecha 299 | SELECT finish_date, str_to_date(finish_date, '%H:%i:%s') AS hour_stamp FROM limpieza; -- separar solo la hora no funciona 300 | SELECT finish_date, date_format(finish_date, '%H:%i:%s') AS hour_stamp FROM limpieza; -- separar solo la hora(marca de tiempo) 301 | 302 | -- # Diviendo los elementos de la hora 303 | SELECT finish_date, 304 | date_format(finish_date, '%H') AS hora, 305 | date_format(finish_date, '%i') AS minutos, 306 | date_format(finish_date, '%s') AS segundos, 307 | date_format(finish_date, '%H:%i:%s') AS hour_stamp 308 | FROM limpieza; 309 | 310 | -- =========== Actualizaciones de fecha en la tabla ================== -- 311 | 312 | -- ----- Copia de seguridad de la columna finish_date 313 | call limp(); 314 | ALTER TABLE limpieza ADD COLUMN date_backup TEXT; -- Agregar columna respaldo 315 | UPDATE limpieza SET date_backup = finish_date; -- Copiar los datos de finish_date a a la columna respaldo 316 | 317 | -- # Actualizar la fecha a marca de tiempo: (TIMESTAMP ; DATETIME) 318 | Select finish_date, str_to_date(finish_date, '%Y-%m-%d %H:%i:%s UTC') as formato from limpieza; -- (UTC) 319 | /* Diferencia entre timestamp y datetime 320 | -- timestamp (YYYY-MM-DD HH:MM:SS) - desde: 01 enero 1970 a las 00:00:00 UTC , hasta milesimas de segundo 321 | -- datetime desde año 1000 a 9999 - no tiene en cuenta la zona horaria , hasta segundos. */ 322 | 323 | UPDATE limpieza 324 | SET finish_date = str_to_date(finish_date, '%Y-%m-%d %H:%i:%s UTC') 325 | WHERE finish_date <> ''; 326 | 327 | call limp(); 328 | 329 | -- --------- Dividir la finish_date en fecha y hora 330 | 331 | -- # Crear las columnas que albergarán los nuevos datos 332 | ALTER TABLE limpieza 333 | ADD COLUMN fecha DATE, 334 | ADD COLUMN hora TIME; 335 | 336 | -- # actualizar los valores de dichas columnas 337 | UPDATE limpieza 338 | SET fecha = DATE(finish_date), 339 | hora = TIME(finish_date) 340 | WHERE finish_date IS NOT NULL AND finish_date <> ''; 341 | 342 | -- # Valores en blanco a nulos 343 | UPDATE limpieza SET finish_date = NULL WHERE finish_date = ''; 344 | 345 | -- # Actualizar la propiedad 346 | ALTER TABLE limpieza MODIFY COLUMN finish_date DATETIME; 347 | 348 | -- # Revisar los datos 349 | SELECT * FROM limpieza; 350 | CALL limp(); 351 | DESCRIBE limpieza; 352 | 353 | -- ========= Cálculos con fechas ====== -- 354 | 355 | -- # Agregar columna para albergar la edad 356 | ALTER TABLE limpieza ADD COLUMN age INT; 357 | call limp(); 358 | 359 | SELECT name,birth_date, start_date, TIMESTAMPDIFF(YEAR, birth_date, start_date) AS edad_de_ingreso 360 | FROM limpieza; 361 | 362 | 363 | -- # Actualizar los datos en la columna edad 364 | UPDATE limpieza 365 | SET age = timestampdiff(YEAR, birth_date, CURDATE()); 366 | -- esta función diferencia en años entre dos fechas (diferencia en años YEAR "year_month", birth_date y fecha actual CURDATE) 367 | /* Calcular diferencias 368 | SECOND: Diferencia en segundos. 369 | MINUTE: Diferencia en minutos. 370 | HOUR: Diferencia en horas. 371 | DAY: Diferencia en días. 372 | WEEK: Diferencia en semanas. 373 | MONTH: Diferencia en meses. 374 | QUARTER: Diferencia en trimestres. 375 | DAY_HOUR: Diferencia en días y horas. 376 | YEAR_MONTH: Diferencia en años y meses. */ 377 | call limp; 378 | 379 | -- ============ creando columnas adicionales ================= -- 380 | 381 | select CONCAT(SUBSTRING_INDEX(Name, ' ', 1),'_', SUBSTRING(Last_name, 1, 4), '.',SUBSTRING(Type, 1, 1), '@consulting.com') as email from limpieza; 382 | -- correo: primer nombre, _ , dos letras del apellido, @consulting.com 383 | -- SUBSTRING_INDEX(cadena, delimitador, ocurrencia) 384 | /* Ocurrencia 385 | Ocurrencia: es el número de ocurrencia del delimitador a partir del cual se extraerá la parte de la cadena 386 | Si se especifica un número positivo, la función devolverá todos los caracteres antes del enésimo delimitador. 387 | Si se especifica un número negativo, la función devolverá todos los caracteres después del enésimo delimitador.*/ 388 | -- SUBSTRING(Last_name, inicio, longitud) 389 | 390 | ALTER TABLE limpieza 391 | ADD COLUMN email VARCHAR(100); 392 | 393 | UPDATE limpieza 394 | SET email = CONCAT(SUBSTRING_INDEX(Name, ' ', 1),'_', SUBSTRING(Last_name, 1, 4), '.',SUBSTRING(Type, 1, 1), '@consulting.com'); 395 | 396 | CALL limp(); 397 | 398 | -- ============ creando y exportando mi set de datos definitivo ================= -- 399 | 400 | SELECT * FROM limpieza 401 | WHERE finish_date <= CURDATE() OR finish_date IS NULL 402 | ORDER BY area, Name; 403 | 404 | SELECT area, COUNT(*) AS cantidad_empleados FROM limpieza 405 | GROUP BY area 406 | ORDER BY cantidad_empleados DESC; 407 | 408 | --------------------------------------------------------------------------------