├── clase_07 ├── cmd │ ├── alumnos.json │ ├── alumnos.csv │ └── alumnos2.csv ├── alumnos.csv ├── SQL_Clase_07.sql ├── teoria │ ├── importar.md │ ├── diapositivas.md │ └── teoria.md ├── ejercicios │ └── ejercicios.md └── alumnos.json ├── clase_06 ├── ER.mwb ├── ejercicios │ ├── ejercicios.md │ └── soluciones.sql └── README_SQL_DML_Subconsultas.md ├── clase_04 ├── Modelo ER.mwb ├── Modelo ER.mwb.bak ├── Query_Clase_04.sql └── ejercicios │ └── ejercicios.md ├── clase_01 ├── ejercitacion_extra │ └── ejercicios-sql.docx ├── query_01.sql └── resumen.md ├── LICENSE ├── clase_10 ├── backup │ ├── coderhouse_categoria.sql │ ├── coderhouse_cursos_inscripciones_count.sql │ ├── coderhouse_log_inscripciones.sql │ ├── coderhouse_notas.sql │ ├── coderhouse_cursos.sql │ ├── coderhouse_alumnos.sql │ └── coderhouse_inscripciones.sql ├── SQL_Clase_10.sql └── ejercicios │ └── ejercicios.md ├── clase_09 ├── ejercicios │ ├── ejercicios.md │ └── soluciones.md ├── SQL_Clase_09.sql └── teoria │ └── teoria.md ├── clase_05 ├── ejercicios │ ├── ejercicios_sql_sin_resolver.md │ ├── ejercicios_sql_sin_resolver2.md │ └── ejercicios_sql_completos.md ├── teoria │ ├── vistas_sql_clase.md │ └── teoria.md └── Query_Clase_05.sql ├── clase_03 ├── ejercicios │ ├── Ejercicios_extra.md │ └── ejercicios.md ├── SQL_Query_03.sql └── teoria │ └── teoria1.md ├── clase_02 ├── teoria │ ├── temas.md │ └── teoria.md ├── ejercicios │ └── ejercicios.md └── query_clase_02.sql ├── clase_11 ├── ejercicios.md └── teoria.md ├── README.md └── clase_08 ├── ejercicios └── ejercicios.md └── SQL_Clase_08.sql /clase_07/cmd/alumnos.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /clase_06/ER.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_06/ER.mwb -------------------------------------------------------------------------------- /clase_07/alumnos.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_07/alumnos.csv -------------------------------------------------------------------------------- /clase_04/Modelo ER.mwb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_04/Modelo ER.mwb -------------------------------------------------------------------------------- /clase_07/cmd/alumnos.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_07/cmd/alumnos.csv -------------------------------------------------------------------------------- /clase_04/Modelo ER.mwb.bak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_04/Modelo ER.mwb.bak -------------------------------------------------------------------------------- /clase_07/cmd/alumnos2.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_07/cmd/alumnos2.csv -------------------------------------------------------------------------------- /clase_01/ejercitacion_extra/ejercicios-sql.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Drako01/SQL_Flex---75965/HEAD/clase_01/ejercitacion_extra/ejercicios-sql.docx -------------------------------------------------------------------------------- /clase_01/query_01.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE IF NOT EXISTS coderhouse; 2 | USE coderhouse; 3 | 4 | CREATE TABLE alumnos ( 5 | id_alumno INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 6 | nombre VARCHAR(30) NOT NULL, 7 | apellido VARCHAR(40) NOT NULL, 8 | email VARCHAR (100) UNIQUE DEFAULT NULL, 9 | dni INT UNIQUE NOT NULL, 10 | telefono VARCHAR (20) UNIQUE DEFAULT NULL, 11 | nacionalidad VARCHAR (30) DEFAULT "Argentina" 12 | ); 13 | 14 | DROP TABLE alumnos; 15 | 16 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono) 17 | VALUES 18 | ("Alejandro", "Di Stefano", "alejandro@mail.com", 22233355, "115555666"); 19 | 20 | SELECT * FROM alumnos; -------------------------------------------------------------------------------- /clase_07/SQL_Clase_07.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE IF NOT EXISTS coderhouse3; 2 | USE coderhouse2; 3 | 4 | CREATE TABLE alumnos ( 5 | id_alumno INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 6 | nombre VARCHAR(30) NOT NULL, 7 | apellido VARCHAR(40) NOT NULL, 8 | email VARCHAR (100) UNIQUE DEFAULT NULL, 9 | dni INT UNIQUE NOT NULL, 10 | telefono VARCHAR (20) UNIQUE DEFAULT NULL, 11 | nacionalidad VARCHAR (30) DEFAULT "Argentina", 12 | fecha_inscripcion TIMESTAMP, 13 | instituto VARCHAR (100) DEFAULT NULL, 14 | edad INT NOT NULL 15 | )DEFAULT CHARSET=utf8mb4; 16 | 17 | SET GLOBAL local_infile = 1; 18 | SHOW GLOBAL VARIABLES LIKE "local_infile"; 19 | SHOW VARIABLES LIKE 'secure_file_priv'; 20 | 21 | 22 | LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/alumnos.csv' 23 | INTO TABLE alumnos 24 | CHARACTER SET utf8mb4 25 | FIELDS TERMINATED BY ',' 26 | OPTIONALLY ENCLOSED BY '"' 27 | LINES TERMINATED BY '\n' 28 | IGNORE 1 LINES; 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Alejandro Daniel Di Stefano 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /clase_10/backup/coderhouse_categoria.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: coderhouse 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.41 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 `categoria` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `categoria`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `categoria` ( 26 | `id_categoria` int NOT NULL AUTO_INCREMENT, 27 | `nombre_categoria` varchar(100) NOT NULL, 28 | PRIMARY KEY (`id_categoria`) 29 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 30 | /*!40101 SET character_set_client = @saved_cs_client */; 31 | 32 | -- 33 | -- Dumping data for table `categoria` 34 | -- 35 | 36 | LOCK TABLES `categoria` WRITE; 37 | /*!40000 ALTER TABLE `categoria` DISABLE KEYS */; 38 | INSERT INTO `categoria` VALUES (1,'Base de Datos'),(2,'Programacion'); 39 | /*!40000 ALTER TABLE `categoria` ENABLE KEYS */; 40 | UNLOCK TABLES; 41 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 42 | 43 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 44 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 45 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 46 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 47 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 48 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 49 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 50 | 51 | -- Dump completed on 2025-05-24 12:48:48 52 | -------------------------------------------------------------------------------- /clase_09/ejercicios/ejercicios.md: -------------------------------------------------------------------------------- 1 | # Guía de Ejercicios: Triggers y DCL en MySQL 2 | 3 | ## Parte 1: Triggers 4 | 5 | ### Ejercicio 1 6 | 7 | Cree una tabla llamada `log_estudiantes` para registrar inserciones en la tabla `estudiantes`. 8 | 9 | * Campos: `id_log`, `id_estudiante`, `accion`, `fecha_accion` 10 | * Cree un trigger `AFTER INSERT` que registre en `log_estudiantes` cada vez que se inserta un nuevo estudiante. 11 | 12 | --- 13 | 14 | ### Ejercicio 2 15 | 16 | Cree un trigger `BEFORE DELETE` sobre la tabla `inscripciones` que impida eliminar registros si la fecha de inscripción es anterior al día actual. 17 | 18 | --- 19 | 20 | ### Ejercicio 3 21 | 22 | Implemente un trigger `BEFORE UPDATE` en la tabla `cursos` que registre los cambios de nombre del curso en una tabla `historial_cambios_curso` con los siguientes campos: 23 | 24 | * `id_curso`, `nombre_anterior`, `nombre_nuevo`, `fecha_cambio` 25 | 26 | --- 27 | 28 | ### Ejercicio 4 29 | 30 | Cree un trigger que se dispare `AFTER DELETE` en la tabla `estudiantes` y registre el evento en una tabla de auditoría llamada `auditoria_estudiantes`. 31 | 32 | --- 33 | 34 | ## Parte 2: DCL 35 | 36 | ### Ejercicio 5 37 | 38 | Cree un nuevo usuario `profesor@localhost` con contraseña `educacion123`. 39 | 40 | --- 41 | 42 | ### Ejercicio 6 43 | 44 | Asigne al usuario `profesor` los siguientes permisos sobre la base de datos `institucion`: 45 | 46 | * Permisos de `SELECT` e `INSERT` sobre la tabla `inscripciones` 47 | 48 | --- 49 | 50 | ### Ejercicio 7 51 | 52 | Cree un usuario `auditor@localhost` con permisos sólo de lectura (`SELECT`) sobre todas las tablas de la base de datos `institucion`. 53 | 54 | --- 55 | 56 | ### Ejercicio 8 57 | 58 | Revoque del usuario `profesor` el permiso de insertar en la tabla `cursos`. 59 | 60 | --- 61 | 62 | ### Ejercicio 9 63 | 64 | Utilizando MySQL Workbench, revise los permisos actuales del usuario `profesor` y documente lo que observa. 65 | 66 | --- 67 | 68 | ### Ejercicio 10 69 | 70 | Elimine el usuario `auditor` de la base de datos. 71 | 72 | --- 73 | 74 | ## 🧑🏫 Profesor 75 | 76 | 👨💻 **Alejandro Daniel Di Stefano** 77 | 📌 **Desarrollador Full Stack** 78 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 79 | -------------------------------------------------------------------------------- /clase_05/ejercicios/ejercicios_sql_sin_resolver.md: -------------------------------------------------------------------------------- 1 | 2 | # 🧠 Ejercicios Propuestos de SQL 3 | 4 | 5 | --- 6 | 7 | ## 📌 PARTE 1: Consultas Básicas 8 | 9 | 1. Mostrar todos los datos de la tabla `alumnos`. 10 | 2. Listar todos los cursos ordenados por duración de mayor a menor. 11 | 3. Buscar los alumnos cuyo nombre comience con la letra "A". 12 | 4. Mostrar los primeros 5 cursos más largos. 13 | 5. Obtener los emails únicos de los alumnos. 14 | 15 | --- 16 | 17 | ## 📌 PARTE 2: Funciones de Agregado y Agrupaciones 18 | 19 | 6. Contar cuántos alumnos hay en total. 20 | 7. Calcular la duración promedio de todos los cursos. 21 | 8. Mostrar la cantidad de inscriptos por curso. 22 | 23 | --- 24 | 25 | ## 📌 PARTE 3: Joins y Relaciones 26 | 27 | 9. Obtener el nombre y apellido del alumno junto con el nombre del curso en el que está inscripto. 28 | 10. Listar todos los alumnos que no están inscriptos en ningún curso. 29 | 30 | --- 31 | 32 | ## 📌 PARTE 4: Subconsultas 33 | 34 | 11. Mostrar los cursos que tienen más inscriptos que el promedio general. 35 | 36 | --- 37 | 38 | ## 📌 PARTE 5: Vistas 39 | 40 | 12. Crear una vista que muestre el nombre completo del alumno y el nombre del curso al que está inscripto. 41 | 13. Crear una vista que muestre los alumnos que están inscriptos en más de un curso. 42 | 43 | --- 44 | 45 | ## 📌 PARTE 6: Stored Procedures 46 | 47 | 14. Crear un procedimiento almacenado que devuelva la cantidad de inscripciones por día. 48 | 15. Crear un procedimiento que reciba un `id_curso` y devuelva cuántos alumnos están inscriptos. 49 | 50 | --- 51 | 52 | ## 📌 PARTE 7: Triggers 53 | 54 | 16. Crear un trigger que evite inscripciones duplicadas a un mismo curso por parte del mismo alumno. 55 | 17. Crear un trigger que actualice una tabla con el contador de inscripciones por curso cada vez que se inserta una nueva inscripción. 56 | 57 | --- 58 | 59 | ✏️ **Recomendación**: Intentá resolver cada uno de estos ejercicios antes de ver las posibles soluciones. Consultá la documentación si lo necesitás. ¡La práctica constante es clave para aprender SQL! 60 | 61 | 62 | --- 63 | 64 | 65 | ## 🧑🏫 Profesor 66 | 67 | 👨💻 **Alejandro Daniel Di Stefano** 68 | 📌 **Desarrollador Full Stack** 69 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 70 | -------------------------------------------------------------------------------- /clase_10/backup/coderhouse_cursos_inscripciones_count.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: coderhouse 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.41 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 `cursos_inscripciones_count` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `cursos_inscripciones_count`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `cursos_inscripciones_count` ( 26 | `id_curso` int NOT NULL, 27 | `cantidad_inscripciones` int DEFAULT '0', 28 | PRIMARY KEY (`id_curso`), 29 | CONSTRAINT `cursos_inscripciones_count_ibfk_1` FOREIGN KEY (`id_curso`) REFERENCES `cursos` (`id_curso`) 30 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 31 | /*!40101 SET character_set_client = @saved_cs_client */; 32 | 33 | -- 34 | -- Dumping data for table `cursos_inscripciones_count` 35 | -- 36 | 37 | LOCK TABLES `cursos_inscripciones_count` WRITE; 38 | /*!40000 ALTER TABLE `cursos_inscripciones_count` DISABLE KEYS */; 39 | INSERT INTO `cursos_inscripciones_count` VALUES (2,2),(3,1),(7,1),(12,1); 40 | /*!40000 ALTER TABLE `cursos_inscripciones_count` ENABLE KEYS */; 41 | UNLOCK TABLES; 42 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 43 | 44 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 45 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 46 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 47 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 48 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 49 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 50 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 51 | 52 | -- Dump completed on 2025-05-24 12:48:48 53 | -------------------------------------------------------------------------------- /clase_10/backup/coderhouse_log_inscripciones.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: coderhouse 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.41 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 `log_inscripciones` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `log_inscripciones`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `log_inscripciones` ( 26 | `id_log` int NOT NULL AUTO_INCREMENT, 27 | `id_alumno` int DEFAULT NULL, 28 | `id_curso` int DEFAULT NULL, 29 | `fecha_inscripcion` datetime DEFAULT NULL, 30 | `log_timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP, 31 | PRIMARY KEY (`id_log`) 32 | ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 33 | /*!40101 SET character_set_client = @saved_cs_client */; 34 | 35 | -- 36 | -- Dumping data for table `log_inscripciones` 37 | -- 38 | 39 | LOCK TABLES `log_inscripciones` WRITE; 40 | /*!40000 ALTER TABLE `log_inscripciones` DISABLE KEYS */; 41 | INSERT INTO `log_inscripciones` VALUES (1,4,12,'2025-04-05 13:22:02','2025-04-05 16:22:02'),(2,4,7,'2025-04-05 13:22:02','2025-04-05 16:22:02'); 42 | /*!40000 ALTER TABLE `log_inscripciones` ENABLE KEYS */; 43 | UNLOCK TABLES; 44 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 45 | 46 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 47 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 48 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 49 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 50 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 51 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 52 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 53 | 54 | -- Dump completed on 2025-05-24 12:48:48 55 | -------------------------------------------------------------------------------- /clase_10/backup/coderhouse_notas.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: coderhouse 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.41 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 `notas` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `notas`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `notas` ( 26 | `id` int NOT NULL AUTO_INCREMENT, 27 | `alumno_id` int DEFAULT NULL, 28 | `parcial1` decimal(5,2) DEFAULT NULL, 29 | `parcial2` decimal(5,2) DEFAULT NULL, 30 | `final` decimal(5,2) DEFAULT NULL, 31 | `materia` varchar(50) DEFAULT NULL, 32 | PRIMARY KEY (`id`) 33 | ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 34 | /*!40101 SET character_set_client = @saved_cs_client */; 35 | 36 | -- 37 | -- Dumping data for table `notas` 38 | -- 39 | 40 | LOCK TABLES `notas` WRITE; 41 | /*!40000 ALTER TABLE `notas` DISABLE KEYS */; 42 | INSERT INTO `notas` VALUES (1,1,7.50,8.00,9.00,NULL),(2,2,5.00,6.50,7.00,NULL),(3,3,9.00,10.00,9.50,NULL),(4,1,7.50,8.00,9.00,NULL),(5,2,5.00,6.50,7.00,NULL),(6,3,9.00,10.00,9.50,NULL),(7,7,7.50,8.00,9.00,'SQL'),(8,8,8.50,8.50,10.00,'SQL'); 43 | /*!40000 ALTER TABLE `notas` ENABLE KEYS */; 44 | UNLOCK TABLES; 45 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 46 | 47 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 48 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 49 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 50 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 51 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 52 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 53 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 54 | 55 | -- Dump completed on 2025-05-24 12:48:48 56 | -------------------------------------------------------------------------------- /clase_10/backup/coderhouse_cursos.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: coderhouse 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.41 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 `cursos` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `cursos`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `cursos` ( 26 | `id_curso` int NOT NULL AUTO_INCREMENT, 27 | `nombre_curso` varchar(50) NOT NULL, 28 | `duracion_curso` int DEFAULT '20', 29 | `id_categoria` int DEFAULT NULL, 30 | PRIMARY KEY (`id_curso`), 31 | KEY `fk_curso_categoria` (`id_categoria`), 32 | CONSTRAINT `fk_curso_categoria` FOREIGN KEY (`id_categoria`) REFERENCES `categoria` (`id_categoria`) 33 | ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 34 | /*!40101 SET character_set_client = @saved_cs_client */; 35 | 36 | -- 37 | -- Dumping data for table `cursos` 38 | -- 39 | 40 | LOCK TABLES `cursos` WRITE; 41 | /*!40000 ALTER TABLE `cursos` DISABLE KEYS */; 42 | INSERT INTO `cursos` VALUES (1,'SQL',20,1),(2,'JavaScript',20,2),(3,'Java',60,2),(4,'HTML',20,2),(5,'Data Analytics',120,1),(6,'React',60,2),(7,'Angular',80,2),(8,'Python',120,2),(9,'SQL nivel Basico',80,1),(10,'SQL nivel Intermedio',60,1),(11,'SQL nivel Avanzado',80,1),(12,'SQL Server',180,1); 43 | /*!40000 ALTER TABLE `cursos` ENABLE KEYS */; 44 | UNLOCK TABLES; 45 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 46 | 47 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 48 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 49 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 50 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 51 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 52 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 53 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 54 | 55 | -- Dump completed on 2025-05-24 12:48:48 56 | -------------------------------------------------------------------------------- /clase_04/Query_Clase_04.sql: -------------------------------------------------------------------------------- 1 | USE coderhouse; 2 | 3 | 4 | CREATE INDEX idx_apellido ON alumnos(apellido); 5 | 6 | -- VISTAS 7 | CREATE VIEW view_inscripciones_alumnos AS 8 | SELECT 9 | a.id_alumno, 10 | CONCAT(a.nombre, ' ', a.apellido) AS nombre_completo, 11 | a.email, 12 | c.id_curso, 13 | c.nombre_curso, 14 | i.inscription_at 15 | FROM inscripciones i 16 | JOIN alumnos a ON i.id_alumno = a.id_alumno 17 | JOIN cursos c ON i.id_curso = c.id_curso; 18 | 19 | -- Stored Procedures 20 | DELIMITER // 21 | 22 | CREATE PROCEDURE ObtenerInscripcionesPorDia() 23 | BEGIN 24 | SELECT DATE(inscription_at) AS fecha, 25 | COUNT(*) AS cantidad_inscripciones 26 | FROM inscripciones 27 | GROUP BY fecha 28 | ORDER BY fecha; 29 | END // 30 | 31 | DELIMITER ; 32 | 33 | 34 | CALL ObtenerInscripcionesPorDia(); 35 | 36 | -- Triggers 37 | CREATE TABLE cursos_inscripciones_count ( 38 | id_curso INT PRIMARY KEY, 39 | cantidad_inscripciones INT DEFAULT 0, 40 | FOREIGN KEY (id_curso) REFERENCES cursos(id_curso) 41 | ); 42 | 43 | DELIMITER // 44 | 45 | CREATE TRIGGER after_inscription_insert 46 | AFTER INSERT ON inscripciones 47 | FOR EACH ROW 48 | BEGIN 49 | DECLARE curso_count INT; 50 | SELECT cantidad_inscripciones INTO curso_count 51 | FROM cursos_inscripciones_count 52 | WHERE id_curso = NEW.id_curso; 53 | 54 | -- Validamos si existen los valores 55 | IF curso_count IS NULL THEN 56 | INSERT INTO cursos_inscripciones_count (id_curso, cantidad_inscripciones) 57 | VALUES (NEW.id_curso, 1); 58 | ELSE 59 | UPDATE cursos_inscripciones_count 60 | SET cantidad_inscripciones = cantidad_inscripciones + 1 61 | WHERE id_curso = NEW.id_curso; 62 | END IF; 63 | END // 64 | 65 | DELIMITER ; 66 | 67 | -- Avisar que el Alumno ya se inscribio a un Curso 68 | DELIMITER // 69 | 70 | CREATE TRIGGER before_inscription_insert 71 | BEFORE INSERT ON inscripciones 72 | FOR EACH ROW 73 | BEGIN 74 | DECLARE existe INT; 75 | 76 | SELECT COUNT(*) INTO existe 77 | FROM inscripciones 78 | WHERE id_alumno = NEW.id_alumno AND id_curso = NEW.id_curso; 79 | 80 | -- Si ya existe 81 | IF existe > 0 THEN 82 | SIGNAL SQLSTATE '45000' 83 | SET MESSAGE_TEXT = 'El Alumno ya esta inscripto a este curso'; 84 | END IF; 85 | END // 86 | 87 | DELIMITER ; 88 | 89 | 90 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES 91 | (22,2); 92 | 93 | -- Funciones 94 | DELIMITER // 95 | 96 | CREATE FUNCTION CantidadDeInscriptosCurso(idCurso INT) RETURNS INT 97 | DETERMINISTIC 98 | BEGIN 99 | DECLARE cantidad INT; 100 | 101 | SELECT COUNT(*) INTO cantidad 102 | FROM inscripciones 103 | WHERE id_curso = idCurso; 104 | 105 | RETURN cantidad; 106 | END // 107 | 108 | DELIMITER ; 109 | 110 | -- Llamar a la Funcion 111 | SELECT CantidadDeInscriptosCurso(4); -------------------------------------------------------------------------------- /clase_10/SQL_Clase_10.sql: -------------------------------------------------------------------------------- 1 | -- Transacciones 2 | 3 | -- Podemos hacer esto 4 | 5 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES (4,1); 6 | 7 | DELIMITER // 8 | 9 | CREATE PROCEDURE inscribir_alumnos_seguro(IN p_id_alumno INT, IN p_id_curso INT) 10 | BEGIN 11 | DECLARE existe_alumno INT DEFAULT 0; 12 | DECLARE existe_curso INT DEFAULT 0; 13 | DECLARE existe_inscripcion INT DEFAULT 0; 14 | 15 | -- Validar si existe el Alumno 16 | SELECT COUNT(*) INTO existe_alumno 17 | FROM alumnos 18 | WHERE id_alumno = p_id_alumno; 19 | 20 | -- Validar si existe el Curso 21 | SELECT COUNT(*) INTO existe_curso 22 | FROM cursos 23 | WHERE id_curso = p_id_curso; 24 | 25 | -- Si no existe el Alumno o el Curso, mostramos un mensaje de Error 26 | IF existe_alumno = 0 THEN 27 | SELECT '❌ El Alumno no existe.' AS message; 28 | ELSEIF existe_curso = 0 THEN 29 | SELECT '❌ El Curso no existe.' AS message; 30 | ELSE 31 | SELECT COUNT(*) INTO existe_inscripcion 32 | FROM inscripciones 33 | WHERE id_alumno = p_id_alumno AND id_curso = p_id_curso; 34 | 35 | IF existe_inscripcion > 0 THEN 36 | SELECT '⚠️ El Alumno ya esta Inscripto en este Curso.' AS message; 37 | ELSE 38 | INSERT INTO inscripciones (id_alumno, id_curso) 39 | VALUES (p_id_alumno, p_id_curso); 40 | SELECT '✅ El Alumno esta Inscripto al Curso Correctamente.' AS message; 41 | END IF; 42 | END IF; 43 | END; 44 | // 45 | 46 | DELIMITER ; 47 | /* 48 | START TRANSACTION; 49 | 50 | CALL inscribir_alumnos_seguro(4,3); 51 | CALL inscribir_alumnos_seguro(5,3); 52 | CALL inscribir_alumnos_seguro(7,3); 53 | CALL inscribir_alumnos_seguro(8,3); 54 | CALL inscribir_alumnos_seguro(26,2); 55 | CALL inscribir_alumnos_seguro(28,1); 56 | CALL inscribir_alumnos_seguro(1,1); 57 | 58 | COMMIT; 59 | */ 60 | 61 | SHOW CREATE TABLE inscripciones; 62 | 63 | START TRANSACTION; 64 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES (4,1); 65 | SAVEPOINT paso_1; 66 | 67 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES (20, 1); 68 | SAVEPOINT paso_2; 69 | 70 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES (21,1); 71 | SAVEPOINT paso_3; 72 | 73 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES (23,1); 74 | SAVEPOINT paso_4; 75 | 76 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES (23,99); 77 | ROLLBACK TO paso_4; 78 | 79 | COMMIT; 80 | 81 | -- BackUp (Copia de Seguridad) 82 | 83 | 84 | /* 85 | Comandos por consola 86 | 87 | mysqldump -u usuario -p nombre_base_de_datos > respaldo.sql 88 | 89 | Para Exportar 90 | mysqldump -u root -p coderhouse2 > respaldo_coderhouse2.sql 91 | 92 | Para Importar 93 | mysql -u root -p coderhouse3 < backup.dump.sql 94 | 95 | */ 96 | 97 | /* 98 | Crear archivo .bat para Automatizar Tarea 99 | 100 | Que se llame backup.bat 101 | 102 | 103 | @echo off 104 | set fecha=%date:~10 105 | mysqldump -u root -p coderhouse2 > "C:\backup\respaldo_coderhouse2.sql" 106 | 107 | */ 108 | -------------------------------------------------------------------------------- /clase_09/ejercicios/soluciones.md: -------------------------------------------------------------------------------- 1 | # Soluciones: Triggers y DCL en MySQL 2 | 3 | ## Parte 1: Triggers 4 | 5 | ### Ejercicio 1 6 | 7 | ```sql 8 | CREATE TABLE log_estudiantes ( 9 | id_log INT AUTO_INCREMENT PRIMARY KEY, 10 | id_estudiante INT, 11 | accion VARCHAR(20), 12 | fecha_accion DATETIME 13 | ); 14 | 15 | DELIMITER // 16 | CREATE TRIGGER after_insert_estudiante 17 | AFTER INSERT ON estudiantes 18 | FOR EACH ROW 19 | BEGIN 20 | INSERT INTO log_estudiantes (id_estudiante, accion, fecha_accion) 21 | VALUES (NEW.id_estudiante, 'INSERT', NOW()); 22 | END;// 23 | DELIMITER ; 24 | ``` 25 | 26 | ### Ejercicio 2 27 | 28 | ```sql 29 | DELIMITER // 30 | CREATE TRIGGER before_delete_inscripcion 31 | BEFORE DELETE ON inscripciones 32 | FOR EACH ROW 33 | BEGIN 34 | IF OLD.fecha_inscripcion < CURDATE() THEN 35 | SIGNAL SQLSTATE '45000' 36 | SET MESSAGE_TEXT = 'No se puede eliminar una inscripción anterior a hoy'; 37 | END IF; 38 | END;// 39 | DELIMITER ; 40 | ``` 41 | 42 | ### Ejercicio 3 43 | 44 | ```sql 45 | CREATE TABLE historial_cambios_curso ( 46 | id_curso INT, 47 | nombre_anterior VARCHAR(100), 48 | nombre_nuevo VARCHAR(100), 49 | fecha_cambio DATETIME 50 | ); 51 | 52 | DELIMITER // 53 | CREATE TRIGGER before_update_nombre_curso 54 | BEFORE UPDATE ON cursos 55 | FOR EACH ROW 56 | BEGIN 57 | IF OLD.nombre_curso <> NEW.nombre_curso THEN 58 | INSERT INTO historial_cambios_curso (id_curso, nombre_anterior, nombre_nuevo, fecha_cambio) 59 | VALUES (OLD.id_curso, OLD.nombre_curso, NEW.nombre_curso, NOW()); 60 | END IF; 61 | END;// 62 | DELIMITER ; 63 | ``` 64 | 65 | ### Ejercicio 4 66 | 67 | ```sql 68 | CREATE TABLE auditoria_estudiantes ( 69 | id_auditoria INT AUTO_INCREMENT PRIMARY KEY, 70 | id_estudiante INT, 71 | accion VARCHAR(10), 72 | fecha_accion DATETIME 73 | ); 74 | 75 | DELIMITER // 76 | CREATE TRIGGER after_delete_estudiante 77 | AFTER DELETE ON estudiantes 78 | FOR EACH ROW 79 | BEGIN 80 | INSERT INTO auditoria_estudiantes (id_estudiante, accion, fecha_accion) 81 | VALUES (OLD.id_estudiante, 'DELETE', NOW()); 82 | END;// 83 | DELIMITER ; 84 | ``` 85 | 86 | ## Parte 2: DCL 87 | 88 | ### Ejercicio 5 89 | 90 | ```sql 91 | CREATE USER 'profesor'@'localhost' IDENTIFIED BY 'educacion123'; 92 | ``` 93 | 94 | ### Ejercicio 6 95 | 96 | ```sql 97 | GRANT SELECT, INSERT ON institucion.inscripciones TO 'profesor'@'localhost'; 98 | ``` 99 | 100 | ### Ejercicio 7 101 | 102 | ```sql 103 | CREATE USER 'auditor'@'localhost' IDENTIFIED BY 'auditorpass'; 104 | GRANT SELECT ON institucion.* TO 'auditor'@'localhost'; 105 | ``` 106 | 107 | ### Ejercicio 8 108 | 109 | ```sql 110 | REVOKE INSERT ON institucion.cursos FROM 'profesor'@'localhost'; 111 | ``` 112 | 113 | ### Ejercicio 9 114 | 115 | ```sql 116 | SHOW GRANTS FOR 'profesor'@'localhost'; 117 | ``` 118 | 119 | Esto mostrará una lista de los privilegios asignados al usuario `profesor`. 120 | 121 | ### Ejercicio 10 122 | 123 | ```sql 124 | DROP USER 'auditor'@'localhost'; 125 | ``` 126 | 127 | --- 128 | 129 | ## 🧑🏫 Profesor 130 | 131 | 👨💻 **Alejandro Daniel Di Stefano** 132 | 📌 **Desarrollador Full Stack** 133 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 134 | -------------------------------------------------------------------------------- /clase_03/ejercicios/Ejercicios_extra.md: -------------------------------------------------------------------------------- 1 | # **📌 Ejercicios de SQL - MySQL** 2 | --- 3 | 4 | ## **📌 1. Ejercicios de `JOIN`** 5 | 1️⃣ Obtén una lista de **todos los alumnos con el nombre del curso en el que están inscritos**. 6 | 2️⃣ Muestra **todos los alumnos**, incluyendo aquellos que **no están inscritos en ningún curso**. 7 | 3️⃣ Lista **todos los cursos**, incluyendo aquellos que **no tienen alumnos inscritos**. 8 | 4️⃣ Encuentra **el número total de alumnos en cada curso**. 9 | 5️⃣ Muestra el **nombre del curso y la cantidad de alumnos inscritos**, ordenando de mayor a menor. 10 | 11 | --- 12 | 13 | ## **📌 2. Ejercicios de `LIKE` y `REGEXP`** 14 | 6️⃣ Encuentra **todos los alumnos cuyos nombres comiencen con "J"**. 15 | 7️⃣ Busca los **alumnos cuyo apellido termine en "ez"**. 16 | 8️⃣ Encuentra los **alumnos con un email que termine en "@gmail.com"**. 17 | 9️⃣ Muestra los alumnos **cuyo nombre tiene exactamente 5 letras**. 18 | 🔟 Encuentra los alumnos **cuyo nombre empieza con "A" o "M" y contiene "del" en cualquier parte** usando `REGEXP`. 19 | 1️⃣1️⃣ Busca los alumnos **cuyo nombre NO empiece con "D" o "V"** usando `REGEXP`. 20 | 21 | --- 22 | 23 | ## **📌 3. Ejercicios de Subconsultas (`IN`, `EXISTS`, `NOT IN`)** 24 | 1️⃣2️⃣ Encuentra los alumnos **inscritos en algún curso** utilizando una subconsulta. 25 | 1️⃣3️⃣ Lista los alumnos **que NO están inscritos en ningún curso** usando `NOT IN`. 26 | 1️⃣4️⃣ Encuentra los cursos donde hay **más de 3 alumnos inscritos** usando una subconsulta. 27 | 1️⃣5️⃣ Obtén el **nombre y apellido del alumno más joven**. 28 | 1️⃣6️⃣ Lista los alumnos **que tienen más edad que el promedio de todos los alumnos**. 29 | 30 | --- 31 | 32 | ## **📌 4. Ejercicios de Funciones Escalares** 33 | 1️⃣7️⃣ Convierte **todos los nombres de los alumnos a mayúsculas**. 34 | 1️⃣8️⃣ Muestra la **longitud (cantidad de caracteres) de cada apellido**. 35 | 1️⃣9️⃣ Muestra el **nombre completo del alumno concatenando "nombre" y "apellido"**. 36 | 2️⃣0️⃣ Encuentra el **valor absoluto de la diferencia entre la edad más alta y la más baja**. 37 | 2️⃣1️⃣ Muestra el **promedio de edades de los alumnos**. 38 | 2️⃣2️⃣ Muestra el **año en el que cada alumno se inscribió**. 39 | 40 | --- 41 | 42 | ## **📌 5. Ejercicios de Funciones de Fecha (`NOW()`, `DATEDIFF()`, `DATE_SUB()`)** 43 | 2️⃣3️⃣ Muestra los alumnos que **se inscribieron hace más de 1 año**. 44 | 2️⃣4️⃣ Obtén el **número de días transcurridos desde la inscripción de cada alumno**. 45 | 2️⃣5️⃣ Encuentra los alumnos que **se inscribieron en el último mes**. 46 | 2️⃣6️⃣ Muestra la fecha de inscripción **formateada como "Día/Mes/Año"**. 47 | 2️⃣7️⃣ Encuentra los alumnos que **se inscribieron en 2023**. 48 | 49 | --- 50 | 51 | ## **📌 6. Ejercicios de `ALTER`, `DROP`, `TRUNCATE`, `RENAME`** 52 | 2️⃣8️⃣ Agrega una columna `edad` a la tabla `alumnos`. 53 | 2️⃣9️⃣ Cambia el nombre de la columna `telefono` a `celular`. 54 | 3️⃣0️⃣ Borra la columna `email` de la tabla `alumnos`. 55 | 3️⃣1️⃣ Elimina todos los datos de la tabla `inscripciones`, pero manteniendo su estructura. 56 | 3️⃣2️⃣ Renombra la tabla `alumnos` a `estudiantes`. 57 | 3️⃣3️⃣ Borra completamente la tabla `cursos` de la base de datos. 58 | 59 | --- 60 | 61 | ### 🚀 **¡A practicar SQL!** 62 | Una vez que completes estos ejercicios, intenta aplicarlos en una base de datos real. 63 | 64 | --- 65 | 66 | ## 🧑🏫 Profesor 67 | 68 | 👨💻 **Alejandro Daniel Di Stefano** 69 | 📌 **Desarrollador Full Stack** 70 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 71 | -------------------------------------------------------------------------------- /clase_02/teoria/temas.md: -------------------------------------------------------------------------------- 1 | # Clase 02 - SQL 2 | 3 | 4 | # **📌 Clase #2 - Sentencias y Sublenguajes** 5 | 6 | ## **⏳ Temas a Abordar** 7 | | Sección | Tema| 8 | |---------|------| 9 | | 1 | Introducción a SQL y Sublenguajes | 10 | | 2 | Sentencia `SELECT` | 11 | | 3 | Operadores en SQL | 12 | | 4 | Sentencias complementarias (`INSERT`, `UPDATE`, `DELETE`) | 13 | | 5 | Funciones en SQL | 14 | | 6 | Tipos de intersección en tablas SQL (`JOIN`, `UNION`, etc.) | 15 | | 7 | Ejercicio práctico y dudas | 16 | 17 | --- 18 | 19 | ## **📌 Contenido de la clase** 20 | 21 | ### **1️⃣ Introducción a SQL y Sublenguajes** 22 | 📌 SQL se divide en 4 sublenguajes: 23 | ✅ **DDL (Data Definition Language)** → `CREATE`, `ALTER`, `DROP` 24 | ✅ **DML (Data Manipulation Language)** → `SELECT`, `INSERT`, `UPDATE`, `DELETE` 25 | ✅ **DCL (Data Control Language)** → `GRANT`, `REVOKE` 26 | ✅ **TCL (Transaction Control Language)** → `COMMIT`, `ROLLBACK` 27 | 28 | --- 29 | 30 | ### **2️⃣ Sentencia `SELECT`** 31 | 📌 **Sintaxis básica:** 32 | ```sql 33 | SELECT columna1, columna2 FROM tabla WHERE condición; 34 | ``` 35 | 📌 **Ejemplo:** Obtener todos los alumnos de la tabla `alumnos`: 36 | ```sql 37 | SELECT * FROM alumnos; 38 | ``` 39 | 📌 **Cláusulas importantes:** 40 | ✅ `WHERE` → Filtrar datos 41 | ✅ `ORDER BY` → Ordenar resultados 42 | ✅ `LIMIT` → Limitar cantidad de registros 43 | 44 | --- 45 | 46 | ### **3️⃣ Operadores en SQL** 47 | 📌 **Tipos de operadores:** 48 | ✅ **Aritméticos** (`+`, `-`, `*`, `/`, `%`) 49 | ✅ **Comparación** (`=`, `!=`, `>`, `<`, `>=`, `<=`) 50 | ✅ **Lógicos** (`AND`, `OR`, `NOT`) 51 | 52 | 📌 **Ejemplo:** 53 | ```sql 54 | SELECT * FROM alumnos WHERE nacionalidad = 'Argentina' AND edad >= 18; 55 | ``` 56 | 57 | --- 58 | 59 | ### **4️⃣ Sentencias complementarias (`INSERT`, `UPDATE`, `DELETE`) (20 min)** 60 | 📌 **`INSERT` - Agregar datos:** 61 | ```sql 62 | INSERT INTO alumnos (nombre, apellido, email) VALUES ('Juan', 'Pérez', 'juan@gmail.com'); 63 | ``` 64 | 📌 **`UPDATE` - Modificar datos:** 65 | ```sql 66 | UPDATE alumnos SET email = 'juan.perez@gmail.com' WHERE nombre = 'Juan'; 67 | ``` 68 | 📌 **`DELETE` - Eliminar datos:** 69 | ```sql 70 | DELETE FROM alumnos WHERE nombre = 'Juan'; 71 | ``` 72 | 73 | --- 74 | 75 | ### **5️⃣ Funciones en SQL** 76 | 📌 **Funciones de agregación:** 77 | ✅ `COUNT()` → Cuenta registros 78 | ✅ `SUM()` → Suma valores 79 | ✅ `AVG()` → Promedio 80 | ✅ `MIN()` / `MAX()` → Valor mínimo y máximo 81 | 82 | 📌 **Ejemplo:** 83 | ```sql 84 | SELECT COUNT(*) FROM alumnos WHERE nacionalidad = 'Argentina'; 85 | ``` 86 | 87 | --- 88 | 89 | ### **6️⃣ Tipos de intersección en tablas SQL** 90 | 📌 **Tipos de `JOIN`:** 91 | ✅ `INNER JOIN` → Coincidencias exactas en ambas tablas 92 | ✅ `LEFT JOIN` → Todo de la tabla izquierda + coincidencias 93 | ✅ `RIGHT JOIN` → Todo de la tabla derecha + coincidencias 94 | ✅ `FULL JOIN` → Todos los registros de ambas tablas 95 | 96 | 📌 **Ejemplo:** 97 | ```sql 98 | SELECT alumnos.nombre, pedidos.producto 99 | FROM alumnos 100 | INNER JOIN pedidos ON alumnos.id_alumno = pedidos.id_alumno; 101 | ``` 102 | 103 | --- 104 | 105 | ### **7️⃣ Ejercicio práctico y dudas** 106 | 📌 **Desafíos:** 107 | 1️⃣ Seleccionar todos los alumnos mayores de 20 años. 108 | 2️⃣ Insertar un nuevo pedido en la tabla `pedidos`. 109 | 3️⃣ Hacer un `JOIN` entre `alumnos` y `pedidos`. 110 | 111 | 112 | --- 113 | 114 | ## 🧑🏫 Profesor 115 | 116 | 👨💻 **Alejandro Daniel Di Stefano** 117 | 📌 **Desarrollador Full Stack** 118 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) -------------------------------------------------------------------------------- /clase_07/teoria/importar.md: -------------------------------------------------------------------------------- 1 | # 📚 Tutorial: Cómo importar un archivo `.csv` en MySQL Workbench usando `LOAD DATA INFILE` 2 | 3 | --- 4 | 5 | ## 1. Crear la base de datos y la tabla 6 | 7 | Primero, creamos la base de datos (si no existe) y una tabla donde vamos a importar los datos. 8 | 9 | ```sql 10 | CREATE DATABASE IF NOT EXISTS coderhouse2; 11 | USE coderhouse2; 12 | 13 | CREATE TABLE alumnos ( 14 | id_alumno INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 15 | nombre VARCHAR(30) NOT NULL, 16 | apellido VARCHAR(40) NOT NULL, 17 | email VARCHAR(100) UNIQUE DEFAULT NULL, 18 | dni INT UNIQUE NOT NULL, 19 | telefono VARCHAR(20) UNIQUE DEFAULT NULL, 20 | nacionalidad VARCHAR(30) DEFAULT "Argentina", 21 | fecha_inscripcion TIMESTAMP, 22 | instituto VARCHAR(100) DEFAULT NULL, 23 | edad INT NOT NULL 24 | ) DEFAULT CHARSET=utf8mb4; 25 | ``` 26 | 27 | ✅ **Nota:** Siempre usar `DEFAULT CHARSET=utf8mb4` para evitar problemas de caracteres especiales como "ñ", "á", "é", etc. 28 | 29 | --- 30 | 31 | ## 2. Preparar correctamente el archivo `.csv` 32 | 33 | Muy importante: 34 | 35 | - El archivo `.csv` debe estar **codificado en UTF-8** (no ANSI). 36 | - Para verificarlo o convertirlo: 37 | 38 | ### En **Notepad++** 39 | 40 | 1. Abrí el archivo `.csv`. 41 | 2. Ir a menú `Codificación`. 42 | 3. Si dice `ANSI`, hacer clic en: 43 | - `Codificación > Convertir a UTF-8 (sin BOM)`. 44 | 4. Guardar (`Ctrl + S`). 45 | 46 | ✅ Ahora sí tu archivo tiene una codificación correcta. 47 | 48 | --- 49 | 50 | ## 3. Mover el archivo `.csv` a la carpeta correcta 51 | 52 | Por temas de seguridad, **MySQL solo permite importar archivos desde una carpeta especial**. 53 | 54 | Mover el archivo `.csv` a: 55 | 56 | ``` 57 | C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/ 58 | ``` 59 | 60 | ✅ **Importante:** Esta carpeta existe siempre que tengas instalado MySQL Server en Windows. 61 | 62 | --- 63 | 64 | ## 4. Ejecutar el comando `LOAD DATA INFILE` 65 | 66 | Ahora que todo está listo, ejecutamos este comando: 67 | 68 | ```sql 69 | LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/alumnos.csv' 70 | INTO TABLE alumnos 71 | CHARACTER SET utf8mb4 72 | FIELDS TERMINATED BY ',' 73 | OPTIONALLY ENCLOSED BY '"' 74 | LINES TERMINATED BY '\n' 75 | IGNORE 1 LINES; 76 | ``` 77 | 78 | ✅ **Qué hace cada parte:** 79 | 80 | - `CHARACTER SET utf8mb4`: Le dice a MySQL que los datos vienen en UTF-8 real. 81 | - `FIELDS TERMINATED BY ','`: Cada dato está separado por comas. 82 | - `OPTIONALLY ENCLOSED BY '"'`: Los campos pueden estar entre comillas `"`. 83 | - `LINES TERMINATED BY '\n'`: Cada fila nueva es un salto de línea. 84 | - `IGNORE 1 LINES`: Ignora la primera línea (los encabezados del archivo). 85 | 86 | --- 87 | 88 | ## 5. ¿Errores comunes y cómo solucionarlos? 89 | 90 | | Error | Causa | Solución | 91 | |:---|:---|:---| 92 | | `Error Code: 2068 LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.` | No usar `LOCAL` o configuración de servidor. | Usar `LOAD DATA INFILE` normal y mover archivo a `/Uploads/`. | 93 | | `Error Code: 1290 secure-file-priv` | MySQL no permite importar desde cualquier carpeta. | Mover archivo a `C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/`. | 94 | | `Error Code: 1366 Incorrect string value '\xF1oz'` | Archivo `.csv` en ANSI o mal convertido. | Convertir archivo a UTF-8 real usando Notepad++. | 95 | | `Error Code: 1300 Invalid utf8mb3 character string` | `CHARACTER SET` incorrecto en el comando. | Usar `CHARACTER SET utf8mb4` en el `LOAD DATA INFILE`. | 96 | 97 | --- 98 | 99 | # 🎉 ¡Listo 100 | 101 | --- 102 | 103 | ## 🧑🏫 Profesor 104 | 105 | 👨💻 **Alejandro Daniel Di Stefano** 106 | 📌 **Desarrollador Full Stack** 107 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 108 | -------------------------------------------------------------------------------- /clase_02/teoria/teoria.md: -------------------------------------------------------------------------------- 1 | # 📚 Teoría -Clase 02: Sentencias y Sublenguajes en SQL 2 | 3 | ## **📌 1️⃣ ¿Qué es SQL y sus Sublenguajes?** 4 | SQL (Structured Query Language) es el lenguaje utilizado para manejar bases de datos relacionales. 5 | Se divide en **cuatro sublenguajes principales**: 6 | 7 | ✅ **DDL (Data Definition Language)** → Definir estructuras de datos (`CREATE`, `ALTER`, `DROP`). 8 | ✅ **DML (Data Manipulation Language)** → Manipular datos (`SELECT`, `INSERT`, `UPDATE`, `DELETE`). 9 | ✅ **DCL (Data Control Language)** → Controlar permisos (`GRANT`, `REVOKE`). 10 | ✅ **TCL (Transaction Control Language)** → Manejar transacciones (`COMMIT`, `ROLLBACK`). 11 | 12 | --- 13 | 14 | ## **📌 2️⃣ Sentencia `SELECT`: Cómo consultar datos** 15 | La sentencia `SELECT` permite recuperar información de una base de datos. 16 | 17 | 📌 **Ejemplo básico:** 18 | ```sql 19 | SELECT * FROM alumnos; 20 | ``` 21 | 📌 **Cláusulas más usadas:** 22 | ✅ `WHERE` → Filtrar registros 23 | ✅ `ORDER BY` → Ordenar resultados 24 | ✅ `LIMIT` → Limitar cantidad de registros 25 | 26 | 📌 **Ejemplo filtrando datos:** 27 | ```sql 28 | SELECT nombre, apellido FROM alumnos WHERE nacionalidad = 'Argentina'; 29 | ``` 30 | 31 | --- 32 | 33 | ## **📌 3️⃣ Operadores en SQL** 34 | SQL tiene **tres tipos principales de operadores**: 35 | 36 | ### **🔹 Aritméticos** (`+`, `-`, `*`, `/`, `%`) 37 | 📌 **Ejemplo:** 38 | ```sql 39 | SELECT precio * 1.21 AS precio_con_IVA FROM productos; 40 | ``` 41 | 42 | ### **🔹 Comparación** (`=`, `!=`, `>`, `<`, `>=`, `<=`) 43 | 📌 **Ejemplo:** 44 | ```sql 45 | SELECT * FROM alumnos WHERE edad >= 18; 46 | ``` 47 | 48 | ### **🔹 Lógicos** (`AND`, `OR`, `NOT`) 49 | 📌 **Ejemplo:** 50 | ```sql 51 | SELECT * FROM alumnos WHERE nacionalidad = 'Argentina' AND edad > 18; 52 | ``` 53 | 54 | --- 55 | 56 | ## **📌 4️⃣ Sentencias Complementarias (`INSERT`, `UPDATE`, `DELETE`)** 57 | 58 | ### **🔹 `INSERT` → Agregar datos** 59 | 📌 **Ejemplo:** 60 | ```sql 61 | INSERT INTO alumnos (nombre, apellido, email, dni, telefono, nacionalidad) 62 | VALUES ('Carlos', 'López', 'carlos.lopez@gmail.com', 37845612, '1122334455', 'Chile'); 63 | ``` 64 | 65 | ### **🔹 `UPDATE` → Modificar datos** 66 | 📌 **Ejemplo:** 67 | ```sql 68 | UPDATE alumnos SET email = 'nuevoemail@gmail.com' WHERE nombre = 'Carlos'; 69 | ``` 70 | 71 | ### **🔹 `DELETE` → Eliminar datos** 72 | 📌 **Ejemplo:** 73 | ```sql 74 | DELETE FROM alumnos WHERE nombre = 'Carlos'; 75 | ``` 76 | 77 | --- 78 | 79 | ## **📌 5️⃣ Funciones en SQL** 80 | Las funciones permiten realizar cálculos en los datos. 81 | 82 | ### **🔹 Funciones de Agregación** 83 | ✅ `COUNT()` → Contar registros 84 | ✅ `SUM()` → Sumar valores 85 | ✅ `AVG()` → Promedio 86 | ✅ `MIN()` / `MAX()` → Valor mínimo y máximo 87 | 88 | 📌 **Ejemplo:** 89 | ```sql 90 | SELECT COUNT(*) FROM alumnos WHERE nacionalidad = 'Argentina'; 91 | ``` 92 | 93 | --- 94 | 95 | ## **📌 6️⃣ Tipos de Intersección en Tablas SQL** 96 | Para trabajar con varias tablas, usamos `JOIN`, `UNION` y otras herramientas. 97 | 98 | ### **🔹 Tipos de `JOIN`** 99 | ✅ **`INNER JOIN`** → Coincidencias exactas en ambas tablas 100 | ✅ **`LEFT JOIN`** → Todo de la tabla izquierda + coincidencias 101 | ✅ **`RIGHT JOIN`** → Todo de la tabla derecha + coincidencias 102 | ✅ **`FULL JOIN`** → Todos los registros de ambas tablas 103 | 104 | 📌 **Ejemplo con `INNER JOIN`:** 105 | ```sql 106 | SELECT alumnos.nombre, pedidos.producto 107 | FROM alumnos 108 | INNER JOIN pedidos ON alumnos.id_alumno = pedidos.id_alumno; 109 | ``` 110 | 111 | ### **🔹 `UNION` y `INTERSECT`** 112 | ✅ **`UNION`** → Une los resultados de dos consultas eliminando duplicados. 113 | ✅ **`UNION ALL`** → Une los resultados sin eliminar duplicados. 114 | ✅ **`INTERSECT`** → Muestra solo los datos que están en ambas consultas. 115 | 116 | 📌 **Ejemplo de `UNION`:** 117 | ```sql 118 | SELECT nombre FROM alumnos 119 | UNION 120 | SELECT nombre FROM profesores; 121 | ``` 122 | 123 | --- 124 | 125 | ## 🧑🏫 Profesor 126 | 127 | 👨💻 **Alejandro Daniel Di Stefano** 128 | 📌 **Desarrollador Full Stack** 129 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 130 | -------------------------------------------------------------------------------- /clase_07/teoria/diapositivas.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # Diapositiva 1: Título 4 | **Importación, Exportación e Integridad Referencial en MySQL** 5 | Clase Práctica - 2 horas 6 | 7 | --- 8 | 9 | # Diapositiva 2: Objetivos 10 | 11 | - Importar y exportar datos. 12 | - Trabajar con CSV y JSON. 13 | - Entender la integridad referencial. 14 | - Usar DELETE CASCADE y UPDATE CASCADE. 15 | 16 | --- 17 | 18 | # Diapositiva 3: Exportar Datos 19 | 20 | **Desde Workbench:** 21 | 22 | - Click derecho en base de datos → Export Data. 23 | - Seleccionar "Export to Self-Contained File". 24 | - Guardar `.sql`. 25 | 26 | **Desde consola:** 27 | 28 | ```bash 29 | mysqldump -u usuario -p basededatos > backup.sql 30 | ``` 31 | 32 | --- 33 | 34 | # Diapositiva 4: Importar Datos 35 | 36 | **Desde Workbench:** 37 | 38 | - File → Open SQL Script. 39 | - Ejecutar el archivo `.sql`. 40 | 41 | **Desde consola:** 42 | 43 | ```bash 44 | mysql -u usuario -p basededatos < backup.sql 45 | ``` 46 | 47 | --- 48 | 49 | # Diapositiva 5: Importar CSV en MySQL 50 | 51 | **Desde Workbench:** 52 | 53 | - Table Data Import Wizard. 54 | - Seleccionar archivo CSV. 55 | - Mapear columnas. 56 | 57 | **Importar manualmente:** 58 | 59 | ```sql 60 | LOAD DATA INFILE 'ruta/archivo.csv' 61 | INTO TABLE tabla 62 | FIELDS TERMINATED BY ',' 63 | LINES TERMINATED BY '\n' 64 | IGNORE 1 ROWS; 65 | ``` 66 | 67 | --- 68 | 69 | # Diapositiva 6: Exportar a CSV o JSON 70 | 71 | **Exportar CSV:** 72 | 73 | - Resultado de consulta → Export Resultset → CSV File. 74 | 75 | **Exportar JSON:** 76 | 77 | - Resultado de consulta → Export Resultset → JSON File. 78 | 79 | **Desde consola:** (menos usado) 80 | 81 | --- 82 | 83 | # Diapositiva 7: Integridad Referencial 84 | 85 | **¿Qué es?** 86 | 87 | - Mantener la coherencia entre tablas relacionadas. 88 | - Evitar datos huérfanos (ej: facturas sin cliente). 89 | 90 | **Clave Foránea:** 91 | 92 | ```sql 93 | FOREIGN KEY (campo_hijo) REFERENCES tabla_padre(campo_padre) 94 | ``` 95 | 96 | --- 97 | 98 | # Diapositiva 8: Restricciones de Integridad 99 | 100 | - No permitir valores sin correspondencia. 101 | - Error si insertas un valor que no existe en la tabla padre. 102 | - Protege la base de datos de errores humanos. 103 | 104 | --- 105 | 106 | # Diapositiva 9: ON DELETE CASCADE 107 | 108 | **Definición:** 109 | 110 | - Si eliminas un registro padre, se eliminan los hijos automáticamente. 111 | 112 | **Ejemplo:** 113 | 114 | ```sql 115 | ON DELETE CASCADE 116 | ``` 117 | 118 | **Uso típico:** 119 | 120 | - Eliminar un cliente → eliminar todas sus órdenes. 121 | 122 | --- 123 | 124 | # Diapositiva 10: ON UPDATE CASCADE 125 | 126 | **Definición:** 127 | 128 | - Si cambias el ID en la tabla padre, el cambio se refleja automáticamente en los hijos. 129 | 130 | **Ejemplo:** 131 | 132 | ```sql 133 | ON UPDATE CASCADE 134 | ``` 135 | 136 | **Uso típico:** 137 | 138 | - Actualizar el ID de un producto → actualizar todas las ventas. 139 | 140 | --- 141 | 142 | # Diapositiva 11: Ejemplo Completo 143 | 144 | **Tablas:** 145 | 146 | - `autores` (id_autor, nombre) 147 | - `libros` (id_libro, titulo, id_autor FK) 148 | 149 | **Relación:** 150 | 151 | ```sql 152 | FOREIGN KEY (id_autor) REFERENCES autores(id_autor) 153 | ON DELETE CASCADE 154 | ON UPDATE CASCADE; 155 | ``` 156 | 157 | **Acciones:** 158 | 159 | - Borrar autor = borrar libros. 160 | - Cambiar ID autor = cambiar ID en libros. 161 | 162 | --- 163 | 164 | # Diapositiva 12: Exportación / Importación: Buenas Prácticas 165 | 166 | - Hacer backup antes de cambios grandes. 167 | - Verificar datos después de importar. 168 | - Validar integridad con SELECT. 169 | - Usar nombres claros para archivos. 170 | 171 | --- 172 | 173 | # Diapositiva 13: Ejercicios Prácticos 174 | 175 | - Exportar base completa. 176 | - Crear CSV de productos y cargarlo. 177 | - Crear tablas relacionadas. 178 | - Aplicar DELETE CASCADE y UPDATE CASCADE. 179 | - Hacer backup e importarlo en otra base. 180 | 181 | --- 182 | 183 | # Diapositiva 14: Cierre 184 | 185 | **📊 Hoy aprendimos:** 186 | 187 | - Importar/exportar. 188 | - Manejar CSV/JSON. 189 | - Respetar integridad referencial. 190 | - Trabajar con CASCADE. 191 | 192 | **📢 A practicar mucho!** 193 | ## 🧑🏫 Profesor 194 | 195 | 👨💻 **Alejandro Daniel Di Stefano** 196 | 📌 **Desarrollador Full Stack** 197 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 198 | --- 199 | -------------------------------------------------------------------------------- /clase_07/ejercicios/ejercicios.md: -------------------------------------------------------------------------------- 1 | # Ejercicios de Importación, Exportación e Integridad Referencial en MySQL 2 | 3 | ## 👉 Importación y Exportación de Datos 4 | 5 | 1. Exportar una base de datos completa a un archivo `.sql` usando Workbench. 6 | 2. Exportar solo una tabla específica a un archivo `.sql`. 7 | 3. Importar un archivo `.sql` a una nueva base de datos vacía. 8 | 4. Importar un archivo `.sql` en una base de datos existente. 9 | 5. Exportar datos de una tabla a un archivo CSV usando Workbench. 10 | 6. Importar datos desde un archivo CSV en una tabla vacía. 11 | 7. Corregir errores comunes al importar CSV (ej: delimitadores incorrectos). 12 | 8. Exportar datos de una consulta (resultado) a CSV. 13 | 9. Exportar datos de una tabla a un archivo JSON manualmente. 14 | 10. Crear un archivo JSON de datos y simular su carga en MySQL (parsearlo). 15 | 16 | ## 👉 Trabajo con Archivos CSV y JSON 17 | 18 | 11. Crear un archivo CSV de productos (id, nombre, precio) y cargarlo en MySQL. 19 | 12. Crear un archivo JSON de clientes (id, nombre, email) para usar en simulaciones. 20 | 13. Convertir un archivo Excel a CSV para importarlo en MySQL. 21 | 14. Corregir un CSV que tenga encabezados incorrectos antes de importar. 22 | 15. Importar un CSV que tiene valores NULL representados como `""` (vacío). 23 | 16. Crear un CSV de alumnos con errores (campos mezclados) y corregirlo antes de importar. 24 | 17. Generar un archivo CSV desde datos exportados de MySQL. 25 | 18. Generar un archivo JSON desde datos exportados de MySQL. 26 | 19. Crear y cargar una planilla de pagos de sueldos en CSV en una tabla MySQL. 27 | 20. Crear y cargar una planilla de asistencia de alumnos en CSV en una tabla MySQL. 28 | 29 | ## 👉 Integridad Referencial 30 | 31 | 21. Crear dos tablas relacionadas: autores y libros. 32 | 22. Insertar autores y luego libros asociados correctamente. 33 | 23. Intentar insertar un libro sin autor válido (ver error de integridad referencial). 34 | 24. Crear tablas con claves foráneas correctamente declaradas. 35 | 25. Romper intencionalmente una relación para analizar el error. 36 | 26. Eliminar un autor y ver qué pasa con sus libros (sin CASCADE). 37 | 27. Actualizar el ID de un autor y ver qué pasa en la tabla libros (sin CASCADE). 38 | 39 | ## 👉 Delete Cascade 40 | 41 | 28. Crear tablas `categorias` y `productos` con ON DELETE CASCADE. 42 | 29. Insertar varias categorías y productos asociados. 43 | 30. Borrar una categoría y verificar que los productos se borran automáticamente. 44 | 31. Crear tablas `departamentos` y `empleados` con ON DELETE CASCADE. 45 | 32. Insertar departamentos y empleados. 46 | 33. Eliminar un departamento y observar el comportamiento en empleados. 47 | 34. Crear una restricción de clave foránea con CASCADE manualmente en una tabla ya existente. 48 | 35. Revertir un cambio: eliminar la restricción CASCADE. 49 | 50 | ## 👉 Update Cascade 51 | 52 | 36. Crear tablas `clientes` y `facturas` con ON UPDATE CASCADE. 53 | 37. Insertar clientes y facturas. 54 | 38. Actualizar el ID de un cliente y verificar el cambio automático en facturas. 55 | 39. Modificar una tabla existente para agregar ON UPDATE CASCADE a una clave foránea. 56 | 40. Realizar una prueba de actualización en cascada en un sistema de órdenes y usuarios. 57 | 58 | ## 👉 Ejercicios Combinados 59 | 60 | 41. Exportar una base de datos con tablas relacionadas. 61 | 42. Importar esa base en otra PC o servidor. 62 | 43. Crear una base nueva y restaurar un backup. 63 | 44. Crear CSVs de "inscriptos", "cursos" y "inscripciones" e importarlos. 64 | 45. Crear una tabla `inscripciones` que relacione alumnos y cursos. 65 | 46. Borrar un alumno y verificar que se borran sus inscripciones (DELETE CASCADE). 66 | 47. Actualizar el ID de un curso y verificar que se actualicen las inscripciones (UPDATE CASCADE). 67 | 48. Crear una planilla en CSV con datos erróneos, detectar y corregir antes de importar. 68 | 49. Diseñar una base de datos pequeña que use integridad referencial y realizar pruebas de CASCADE. 69 | 50. Hacer backup de una base de datos y restaurarla en un ambiente nuevo desde consola. 70 | 71 | --- 72 | 73 | # 📚 Recomendación Final 74 | 75 | - Realizar los ejercicios primero en Workbench para familiarizarse. 76 | - Luego repetir en consola para reforzar el manejo básico de terminal. 77 | - Siempre validar los datos importados con `SELECT * FROM tabla;` luego de la carga. 78 | - Usar `SHOW CREATE TABLE tabla;` para confirmar las restricciones y cascadas. 79 | 80 | --- 81 | 82 | ## 🧑🏫 Profesor 83 | 84 | 👨💻 **Alejandro Daniel Di Stefano** 85 | 📌 **Desarrollador Full Stack** 86 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 87 | -------------------------------------------------------------------------------- /clase_02/ejercicios/ejercicios.md: -------------------------------------------------------------------------------- 1 | 2 | # 📝 Ejercicios de SQL - Clase 2 3 | 4 | ## **📌 1️⃣ Sentencia `SELECT`** 5 | 1. Seleccionar todos los registros de la tabla `alumnos`. 6 | ```sql 7 | SELECT * FROM alumnos; 8 | ``` 9 | 2. Seleccionar solo los nombres y apellidos de la tabla `alumnos`. 10 | 3. Seleccionar los alumnos que sean de Argentina. 11 | 4. Seleccionar los alumnos que tengan un `email` registrado (no `NULL`). 12 | 5. Seleccionar los alumnos mayores de 18 años. 13 | 14 | ## **📌 2️⃣ Uso de `WHERE` y Operadores** 15 | 6. Seleccionar los alumnos cuyo nombre comience con "J". 16 | 7. Seleccionar los alumnos cuyo `dni` sea mayor a 30.000.000. 17 | 8. Seleccionar los alumnos que no tengan `telefono` registrado. 18 | 9. Seleccionar los alumnos que sean de Argentina o Uruguay. 19 | 10. Seleccionar los alumnos que no sean de Argentina ni de Uruguay. 20 | 21 | ## **📌 3️⃣ Uso de `ORDER BY` y `LIMIT`** 22 | 11. Seleccionar los alumnos y ordenarlos por apellido en orden ascendente. 23 | 12. Seleccionar los alumnos y ordenarlos por `dni` en orden descendente. 24 | 13. Seleccionar los 5 primeros alumnos registrados en la tabla. 25 | 14. Seleccionar el alumno con el `dni` más alto. 26 | 15. Seleccionar los últimos 3 alumnos registrados. 27 | 28 | ## **📌 4️⃣ Uso de `INSERT`** 29 | 16. Insertar un nuevo alumno en la tabla `alumnos`. 30 | ```sql 31 | INSERT INTO alumnos (nombre, apellido, email, dni, telefono, nacionalidad) 32 | VALUES ('Carlos', 'López', 'carlos.lopez@gmail.com', 37845612, '1122334455', 'Chile'); 33 | ``` 34 | 17. Insertar dos alumnos nuevos en la misma consulta. 35 | 18. Insertar un alumno sin especificar `telefono`. 36 | 19. Insertar un alumno sin especificar `email`. 37 | 20. Insertar un alumno con `nacionalidad` diferente a Argentina. 38 | 39 | ## **📌 5️⃣ Uso de `UPDATE`** 40 | 21. Cambiar el `email` de un alumno con `id_alumno = 2`. 41 | 22. Modificar la `nacionalidad` de todos los alumnos de Chile a Perú. 42 | 23. Cambiar el `telefono` de un alumno específico. 43 | 24. Modificar el `apellido` de un alumno cuyo nombre sea "María". 44 | 25. Aumentar en 1 el `dni` de todos los alumnos que sean de Argentina. 45 | 46 | ## **📌 6️⃣ Uso de `DELETE`** 47 | 26. Eliminar un alumno cuyo `id_alumno = 5`. 48 | 27. Eliminar todos los alumnos de Uruguay. 49 | 28. Eliminar a los alumnos que no tengan `email` registrado. 50 | 29. Eliminar todos los alumnos cuyo `telefono` sea `NULL`. 51 | 30. Eliminar un alumno con `dni` menor a 30.000.000. 52 | 53 | ## **📌 7️⃣ Funciones de Agregación (`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`)** 54 | 31. Contar cuántos alumnos hay en la tabla. 55 | 32. Contar cuántos alumnos tienen `telefono` registrado. 56 | 33. Obtener el `dni` más alto registrado en la tabla. 57 | 34. Obtener el `dni` más bajo registrado en la tabla. 58 | 35. Obtener la cantidad de alumnos por cada `nacionalidad`. 59 | 60 | ## **📌 8️⃣ Uso de `GROUP BY` y `HAVING`** 61 | 36. Obtener el número de alumnos por nacionalidad. 62 | 37. Contar cuántos alumnos tienen el mismo `apellido`. 63 | 38. Obtener la cantidad de alumnos con `email` registrado y agrupar por nacionalidad. 64 | 39. Seleccionar nacionalidades con más de 2 alumnos registrados. 65 | 40. Obtener el promedio de `dni` de los alumnos por nacionalidad. 66 | 67 | ## **📌 9️⃣ Uso de `JOIN`** 68 | 41. Seleccionar todos los pedidos y los nombres de los alumnos que los hicieron. 69 | ```sql 70 | SELECT alumnos.nombre, pedidos.producto 71 | FROM alumnos 72 | INNER JOIN pedidos ON alumnos.id_alumno = pedidos.id_alumno; 73 | ``` 74 | 42. Hacer un `LEFT JOIN` entre `alumnos` y `pedidos`. 75 | 43. Hacer un `RIGHT JOIN` entre `alumnos` y `pedidos`. 76 | 44. Seleccionar solo los alumnos que no han hecho pedidos (`LEFT JOIN` con `NULL`). 77 | 45. Contar cuántos pedidos ha hecho cada alumno. 78 | 79 | ## **📌 🔟 Uso de `UNION` y `INTERSECT`** 80 | 46. Unir los resultados de `alumnos` y `profesores` en una sola consulta. 81 | 47. Obtener los `email` que aparecen tanto en `alumnos` como en `profesores`. 82 | 48. Obtener los `dni` que aparecen en ambas tablas. 83 | 49. Unir los alumnos de Argentina y Uruguay en una misma consulta. 84 | 50. Seleccionar solo los alumnos que han hecho pedidos y unirlo con una lista de profesores que también han hecho pedidos. 85 | 86 | --- 87 | 88 | 📌 **¡Practiquen estos ejercicios para fortalecer sus conocimientos en SQL! 🚀** 89 | 90 | 91 | --- 92 | 93 | ## 🧑🏫 Profesor 94 | 95 | 👨💻 **Alejandro Daniel Di Stefano** 96 | 📌 **Desarrollador Full Stack** 97 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 98 | 99 | -------------------------------------------------------------------------------- /clase_05/teoria/vistas_sql_clase.md: -------------------------------------------------------------------------------- 1 | 2 | # 📘 Ejemplos de Vistas en SQL 3 | 4 | A continuación te muestro varios ejemplos prácticos de cómo crear vistas en SQL usando un sistema de cursos con tablas como `alumnos`, `cursos` e `inscripciones`. 5 | 6 | --- 7 | 8 | ## 1. 🧾 Vista básica de Alumnos 9 | 10 | Muestra los datos más importantes de cada alumno. 11 | 12 | ```sql 13 | CREATE VIEW vista_alumnos_basico AS 14 | SELECT 15 | id_alumno, 16 | nombre, 17 | apellido, 18 | email 19 | FROM alumnos; 20 | ``` 21 | 22 | --- 23 | 24 | ## 2. 👨🎓 Vista Alumnos + Cursos 25 | 26 | Relaciona cada alumno con el curso en el que está inscripto. 27 | 28 | ```sql 29 | CREATE VIEW vista_alumnos_cursos AS 30 | SELECT 31 | a.id_alumno, 32 | CONCAT(a.nombre, ' ', a.apellido) AS nombre_completo, 33 | c.nombre_curso 34 | FROM inscripciones i 35 | JOIN alumnos a ON i.id_alumno = a.id_alumno 36 | JOIN cursos c ON i.id_curso = c.id_curso; 37 | ``` 38 | 39 | --- 40 | 41 | ## 3. 🎯 Vista con Filtro - Curso "SQL Avanzado" 42 | 43 | Muestra solo los alumnos inscriptos al curso "SQL Avanzado". 44 | 45 | ```sql 46 | CREATE VIEW vista_inscriptos_sql AS 47 | SELECT 48 | a.nombre, 49 | a.apellido, 50 | c.nombre_curso 51 | FROM inscripciones i 52 | JOIN alumnos a ON i.id_alumno = a.id_alumno 53 | JOIN cursos c ON i.id_curso = c.id_curso 54 | WHERE c.nombre_curso = 'SQL Avanzado'; 55 | ``` 56 | 57 | --- 58 | 59 | ## 4. 📊 Vista con Agregado - Cantidad de inscriptos por curso 60 | 61 | Cuenta cuántos alumnos hay por curso. 62 | 63 | ```sql 64 | CREATE VIEW vista_cantidad_inscripciones AS 65 | SELECT 66 | c.id_curso, 67 | c.nombre_curso, 68 | COUNT(i.id_alumno) AS cantidad_inscriptos 69 | FROM cursos c 70 | LEFT JOIN inscripciones i ON c.id_curso = i.id_curso 71 | GROUP BY c.id_curso, c.nombre_curso; 72 | ``` 73 | 74 | --- 75 | 76 | ## 5. 🕒 Vista de Inscripciones recientes (últimos 7 días) 77 | 78 | Muestra las inscripciones que ocurrieron en la última semana. 79 | 80 | ```sql 81 | CREATE VIEW vista_inscripciones_recientes AS 82 | SELECT 83 | a.nombre, 84 | a.apellido, 85 | c.nombre_curso, 86 | i.inscription_at 87 | FROM inscripciones i 88 | JOIN alumnos a ON i.id_alumno = a.id_alumno 89 | JOIN cursos c ON i.id_curso = c.id_curso 90 | WHERE i.inscription_at >= CURDATE() - INTERVAL 7 DAY; 91 | ``` 92 | 93 | --- 94 | 95 | ## 6. 📑 Vista de Detalle completo (ordenado por fecha) 96 | 97 | Incluye todos los datos relevantes de la inscripción, ordenados por fecha. 98 | 99 | ```sql 100 | CREATE VIEW vista_detalle_inscripciones AS 101 | SELECT 102 | i.id_inscripcion, 103 | a.nombre, 104 | a.apellido, 105 | a.email, 106 | c.nombre_curso, 107 | c.duracion, 108 | i.inscription_at 109 | FROM inscripciones i 110 | JOIN alumnos a ON i.id_alumno = a.id_alumno 111 | JOIN cursos c ON i.id_curso = c.id_curso 112 | ORDER BY i.inscription_at DESC; 113 | ``` 114 | 115 | --- 116 | 117 | ## 7. 🕵️ Vista anonimizada (sin mostrar email) 118 | 119 | Muestra solo el nombre inicial y apellido, ocultando el email. 120 | 121 | ```sql 122 | CREATE VIEW vista_anonima_alumnos AS 123 | SELECT 124 | id_alumno, 125 | CONCAT(SUBSTRING(nombre,1,1), '. ', apellido) AS nombre_visible 126 | FROM alumnos; 127 | ``` 128 | 129 | --- 130 | 131 | ## 8. 🎓 Vista de alumnos en más de un curso 132 | 133 | Muestra alumnos que están inscriptos en **más de un curso**. 134 | 135 | ```sql 136 | CREATE VIEW vista_alumnos_multicurso AS 137 | SELECT 138 | a.id_alumno, 139 | CONCAT(a.nombre, ' ', a.apellido) AS nombre_completo, 140 | COUNT(i.id_curso) AS cantidad_cursos 141 | FROM alumnos a 142 | JOIN inscripciones i ON a.id_alumno = i.id_alumno 143 | GROUP BY a.id_alumno 144 | HAVING cantidad_cursos > 1; 145 | ``` 146 | 147 | --- 148 | 149 | ## ♻️ Reemplazar una vista con `OR REPLACE` 150 | 151 | Permite actualizar el contenido de una vista sin eliminarla previamente. 152 | 153 | ```sql 154 | CREATE OR REPLACE VIEW vista_alumnos_basico AS 155 | SELECT 156 | id_alumno, 157 | nombre, 158 | apellido, 159 | email 160 | FROM alumnos; 161 | ``` 162 | 163 | --- 164 | 165 | ## ❌ Eliminar una vista 166 | 167 | ```sql 168 | DROP VIEW vista_alumnos_cursos; 169 | ``` 170 | 171 | --- 172 | 173 | ✅ **TIP**: Las vistas se pueden usar como tablas normales. Por ejemplo: 174 | 175 | ```sql 176 | SELECT * FROM vista_cantidad_inscripciones; 177 | ``` 178 | 179 | --- 180 | 181 | 182 | ## 🧑🏫 Profesor 183 | 184 | 👨💻 **Alejandro Daniel Di Stefano** 185 | 📌 **Desarrollador Full Stack** 186 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 187 | -------------------------------------------------------------------------------- /clase_05/ejercicios/ejercicios_sql_sin_resolver2.md: -------------------------------------------------------------------------------- 1 | # 📘 Ejercicios Adicionales de SQL (Lote 2 - sin resolución) 2 | 3 | A continuación se presentan 50 nuevos ejercicios prácticos para reforzar conceptos clave de SQL. 4 | 5 | --- 6 | 7 | ## 🔹 Consultas Básicas y WHERE 8 | 9 | 1. Mostrar todos los cursos que duren más de 20 horas. 10 | 2. Listar los alumnos cuyo apellido contenga la letra “z”. 11 | 3. Mostrar todos los cursos cuyo nombre termine en “SQL”. 12 | 4. Listar los alumnos con emails que pertenezcan al dominio “gmail.com”. 13 | 5. Mostrar los primeros 3 cursos en orden alfabético. 14 | 6. Listar los alumnos cuyo nombre tenga exactamente 5 letras. 15 | 7. Mostrar los cursos cuya duración sea entre 10 y 30 horas. 16 | 8. Mostrar los alumnos que no tienen apellido registrado. 17 | 9. Contar cuántos cursos tienen una duración menor al promedio general. 18 | 10. Mostrar los cursos donde el nombre incluya la palabra “avanzado”. 19 | 20 | --- 21 | 22 | ## 🔹 Funciones de Agregado y Agrupamiento 23 | 24 | 11. Obtener el promedio de duración de los cursos por categoría. 25 | 12. Mostrar la cantidad de alumnos por apellido. 26 | 13. Mostrar la categoría con más cursos asociados. 27 | 14. Listar los cursos agrupados por duración. 28 | 15. Calcular el total de inscripciones por mes. 29 | 30 | --- 31 | 32 | ## 🔹 JOIN y relaciones entre tablas 33 | 34 | 16. Mostrar el nombre del curso y los nombres de alumnos inscriptos. 35 | 17. Listar las fechas de inscripción de los alumnos junto con el nombre del curso. 36 | 18. Mostrar los cursos que no tienen inscripciones. 37 | 19. Listar todos los alumnos y sus respectivos cursos (aunque no estén inscriptos). 38 | 20. Mostrar los nombres completos de los alumnos y la duración del curso al que se inscribieron. 39 | 40 | --- 41 | 42 | ## 🔹 Subconsultas y expresiones 43 | 44 | 21. Mostrar los cursos que tengan más inscriptos que el curso “MySQL Básico”. 45 | 22. Listar los alumnos con más inscripciones que el promedio. 46 | 23. Mostrar los cursos que tienen la misma duración que el curso con más duración. 47 | 24. Listar los emails de los alumnos inscriptos en más de un curso. 48 | 25. Mostrar los cursos que no aparecen en la tabla de inscripciones. 49 | 50 | --- 51 | 52 | ## 🔹 Vistas 53 | 54 | 26. Crear una vista que contenga el nombre completo del alumno y el nombre del curso. 55 | 27. Crear una vista que muestre alumnos que cursan más de 2 cursos. 56 | 28. Crear una vista que muestre las últimas 10 inscripciones ordenadas por fecha. 57 | 29. Crear una vista con los cursos que tienen más de 5 alumnos. 58 | 30. Crear una vista que oculte los emails de los alumnos (anonimización). 59 | 60 | --- 61 | 62 | ## 🔹 Stored Procedures 63 | 64 | 31. Crear un procedimiento que reciba un ID de curso y devuelva todos los alumnos inscriptos. 65 | 32. Crear un procedimiento que inserte una nueva inscripción (recibiendo alumno y curso). 66 | 33. Crear un procedimiento que borre todas las inscripciones de un alumno específico. 67 | 34. Crear un procedimiento que devuelva la duración total de todos los cursos que cursa un alumno. 68 | 35. Crear un procedimiento que muestre las inscripciones del día actual. 69 | 70 | --- 71 | 72 | ## 🔹 Triggers 73 | 74 | 36. Crear un trigger que impida inscribir a un alumno dos veces en el mismo curso. 75 | 37. Crear un trigger que registre en un log cada vez que un alumno se inscribe. 76 | 38. Crear un trigger que actualice un contador de inscriptos por curso. 77 | 39. Crear un trigger que evite borrar un curso si tiene alumnos inscriptos. 78 | 40. Crear un trigger que registre la fecha de modificación de una inscripción. 79 | 80 | --- 81 | 82 | ## 🔹 Bonus: Consultas avanzadas y combinadas 83 | 84 | 41. Listar los cursos junto con la cantidad de alumnos, ordenado de mayor a menor. 85 | 42. Mostrar los cursos con la menor cantidad de inscriptos. 86 | 43. Mostrar qué alumnos comparten curso con un alumno específico. 87 | 44. Crear una vista que contenga alumnos, curso e institución. 88 | 45. Listar los alumnos que no cursan en ninguna institución. 89 | 46. Mostrar la institución con más alumnos inscriptos. 90 | 47. Crear un procedimiento que devuelva inscripciones por institución. 91 | 48. Mostrar el porcentaje de alumnos que cursan más de un curso. 92 | 49. Crear una vista que combine alumnos, cursos y categorías. 93 | 50. Crear un trigger que impida registrar un curso con nombre duplicado. 94 | 95 | --- 96 | 97 | 📚 Estos ejercicios te ayudarán a reforzar todo lo aprendido. ¡No te olvides de probarlos en un entorno real! 98 | """ 99 | 100 | --- 101 | 102 | ## 🧑🏫 Profesor 103 | 104 | 👨💻 **Alejandro Daniel Di Stefano** 105 | 📌 **Desarrollador Full Stack** 106 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 107 | -------------------------------------------------------------------------------- /clase_10/backup/coderhouse_alumnos.sql: -------------------------------------------------------------------------------- 1 | -- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) 2 | -- 3 | -- Host: 127.0.0.1 Database: coderhouse 4 | -- ------------------------------------------------------ 5 | -- Server version 8.0.41 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 `alumnos` 20 | -- 21 | 22 | DROP TABLE IF EXISTS `alumnos`; 23 | /*!40101 SET @saved_cs_client = @@character_set_client */; 24 | /*!50503 SET character_set_client = utf8mb4 */; 25 | CREATE TABLE `alumnos` ( 26 | `id_alumno` int NOT NULL AUTO_INCREMENT, 27 | `nombre` varchar(30) NOT NULL, 28 | `apellido` varchar(40) NOT NULL, 29 | `email` varchar(100) DEFAULT NULL, 30 | `dni` int NOT NULL, 31 | `telefono` varchar(20) DEFAULT NULL, 32 | `nacionalidad` varchar(30) DEFAULT 'Argentina', 33 | `fecha_inscripcion` datetime DEFAULT CURRENT_TIMESTAMP, 34 | `instituto` varchar(60) DEFAULT 'CoderHouse', 35 | `edad` int DEFAULT NULL, 36 | PRIMARY KEY (`id_alumno`), 37 | UNIQUE KEY `dni` (`dni`), 38 | UNIQUE KEY `email` (`email`), 39 | UNIQUE KEY `telefono` (`telefono`), 40 | KEY `idx_apellido` (`apellido`) 41 | ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 42 | /*!40101 SET character_set_client = @saved_cs_client */; 43 | 44 | -- 45 | -- Dumping data for table `alumnos` 46 | -- 47 | 48 | LOCK TABLES `alumnos` WRITE; 49 | /*!40000 ALTER TABLE `alumnos` DISABLE KEYS */; 50 | INSERT INTO `alumnos` VALUES (4,'Alejandro','Di Stefano','nuevoemaildealejandro@mail.com',22233355,'115555666','Argentina','2025-03-15 12:43:04','CoderHouse',49),(5,'Juan','Perez','perez@mail.com',113333666,'1166667777','Argentina','2025-03-15 12:43:04','CoderHouse',30),(7,'Marcela','Muñoz','ivana@mail.com',33555888,'1166333777','Argentina','2025-03-15 12:52:35','CoderHouse',20),(8,'Marcela','Perez','marce@mail.com',22686777,'12555666','Uruguaya','2025-03-15 12:53:52','CoderHouse',26),(15,'Marcelo','Perez','marcelo@gmail.com',55666677,'1254654','Uruguaya','2025-03-15 13:28:56','CoderHouse',29),(16,'Enzo','Godoy','enzo@mail.com',55996677,'1253354','Brasilero','2025-03-15 13:28:56','CoderHouse',22),(17,'Julian','Alvarez','julian@mail.com',55688677,'1251124','Peruano','2025-03-15 13:28:56','CoderHouse',33),(18,'Cristian','Diaz','cris@gmail.com',55222677,'1111654','Chileno','2025-03-15 13:28:56','CoderHouse',21),(19,'Raul','Leiva','raul@mail.com',55446677,'1251654','Chileno','2025-03-15 13:28:56','CoderHouse',31),(20,'Wanda','Nara','wandaylgante@mail.com',22444488,'4545454','Argentina','2025-03-15 13:28:56','CoderHouse',31),(21,'Romina','Baron','romy@mail.com',53333677,'1254154','Peruano','2025-03-15 13:28:56','CoderHouse',27),(22,'China','Suarez','chinaicardi@gmail.com',22686677,'19955666','Argentina','2025-03-15 13:29:43','CoderHouse',35),(23,'Adrian','Perez','Adrian@mail.com',55669997,'12154654','Uruguaya','2025-03-22 12:41:18','CoderHouse',29),(24,'Andres','Perez','Andres@mail.com',57866677,'12541654','Uruguaya','2025-03-22 12:41:18','CoderHouse',29),(25,'Adrian','Perez','Adrian@gmail.com',556699947,'121454654','Uruguaya','2025-03-22 12:42:18','CoderHouse',29),(26,'Andres','Perez','Andres@gmail.com',574866677,'125414654','Uruguaya','2025-03-22 12:42:18','CoderHouse',29),(27,'Juan','Perez','juanperez@mail.com',12345678,'1166665555','Argentina','2025-05-10 12:35:14','CoderHouse',20),(28,'Pedro','Lopez','pedrito@mail.com',23232323,'1155554444','Argentina','2025-05-10 13:01:37','CoderHouse',30),(29,'Romina','Etchegaray','romina@mail.com',66555444,'222555444','Argentina','2025-05-10 13:02:32','CoderHouse',25),(31,'Romina Lorena','Garcia','romina2@mail.com',55666333,'335555666','Ururguay','2025-05-10 13:03:40','Mi Instituto',25); 51 | /*!40000 ALTER TABLE `alumnos` ENABLE KEYS */; 52 | UNLOCK TABLES; 53 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; 54 | 55 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 56 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 57 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 58 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 59 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 60 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 61 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 62 | 63 | -- Dump completed on 2025-05-24 12:48:48 64 | -------------------------------------------------------------------------------- /clase_11/ejercicios.md: -------------------------------------------------------------------------------- 1 | # Repaso general 2 | 3 | ## 🧠 Ejercicios de Práctica por Tema 4 | 5 | ### 1. **Consultas Básicas (SELECT, WHERE, ORDER BY)** 6 | 7 | * **Objetivo:** Practicar la selección y filtrado de datos en una sola tabla. 8 | * **Ejemplo de ejercicio:** Obtener todos los productos con un precio mayor a \$100, ordenados de mayor a menor precio. 9 | * **Recurso recomendado:** [10 Ejercicios de Práctica SQL para Principiantes con Soluciones](https://learnsql.es/blog/10-ejercicios-de-practica-sql-para-principiantes-con-soluciones/)([mode.com][1], [learnsql.es][2]) 10 | 11 | ### 2. **Joins (INNER, LEFT, RIGHT)** 12 | 13 | * **Objetivo:** Aprender a combinar datos de múltiples tablas relacionadas. 14 | * **Ejemplo de ejercicio:** Listar todos los productos junto con el nombre de su fabricante. 15 | * **Recurso recomendado:** [7 Ejemplos de SQL JOIN con explicaciones detalladas](https://learnsql.es/blog/7-ejemplos-de-sql-join-con-explicaciones-detalladas/)([udb.edu.sv][3], [Studocu][4], [learnsql.es][5]) 16 | 17 | ### 3. **Funciones de Agregación y Agrupamiento (GROUP BY, HAVING)** 18 | 19 | * **Objetivo:** Utilizar funciones como COUNT, SUM, AVG para resumir datos. 20 | * **Ejemplo de ejercicio:** Calcular el precio promedio de los productos por fabricante. 21 | * **Recurso recomendado:** [Ejercicios. Realización de consultas SQL](https://josejuansanchez.org/bd/ejercicios-consultas-sql/index.html)([josejuansanchez.org][6]) 22 | 23 | ### 4. **Subconsultas (Subqueries)** 24 | 25 | * **Objetivo:** Realizar consultas anidadas para resolver problemas más complejos. 26 | * **Ejemplo de ejercicio:** Encontrar los productos que tienen un precio superior al promedio de todos los productos. 27 | * **Recurso recomendado:** [Ejercicios SubQuerys](https://es.scribd.com/document/219914360/Ejercicios-SubQuerys)([Scribd][7], [udb.edu.sv][3]) 28 | 29 | ### 5. **Consultas Avanzadas y Casos Prácticos** 30 | 31 | * **Objetivo:** Aplicar conocimientos en escenarios más realistas y complejos. 32 | * **Ejemplo de ejercicio:** Listar los productos que no han sido vendidos en el último mes. 33 | * **Recurso recomendado:** [Guía de ejercicios SQL para Sistemas de Bases de Datos I - UCAB](https://biblioteca2.ucab.edu.ve/anexos/biblioteca/marc/texto/AAU4531.pdf)([biblioteca2.ucab.edu.ve][8]) 34 | 35 | --- 36 | 37 | ## 📚 Recursos Adicionales 38 | 39 | * **Curso interactivo:** [LearnSQL.es](https://learnsql.es/) ofrece cursos con ejercicios prácticos para diferentes niveles. 40 | * **Repositorio GitHub:** [FabianNorbertoEscobar/sql-ejercicios](https://github.com/FabianNorbertoEscobar/sql-ejercicios) contiene una variedad de ejercicios prácticos.([learnsql.es][9], [GitHub][10]) 41 | 42 | --- 43 | 44 | ## 📘 Recomendaciones de Libros 45 | 46 | Para profundizar aún más, aca tienen algunas opciones de libros que podrían interesarles: 47 | 48 | ### [SQL: Guía Completa Para Principiantes De La Programación SQL]() 49 | 50 | ### [SQL: Guía Para Principiantes Para Aprender SQL]() 51 | 52 | ### [Curso De SQL de Martínez Cruz, Carmen]() 53 | 54 | --- 55 | 56 | ## 🧑🏫 Profesor 57 | 58 | 👨💻 **Alejandro Daniel Di Stefano** 59 | 📌 **Desarrollador Full Stack** 60 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 61 | 62 | [1]: https://mode.com/sql-tutorial/sql-joins-where-vs-on/?utm_source=chatgpt.com "SQL Joins Using WHERE or ON - Mode Analytics" 63 | [2]: https://learnsql.es/blog/10-ejercicios-de-practica-sql-para-principiantes-con-soluciones/?utm_source=chatgpt.com "10 Ejercicios de Práctica SQL para Principiantes con Soluciones" 64 | [3]: https://www.udb.edu.sv/udb_files/recursos_guias/informatica-ingenieria/modelamiento-y-diseno-de-base-de-datos/2019/ii/guia-6.pdf?utm_source=chatgpt.com "[PDF] Guía N° 6 Tema: Combinación de tablas" 65 | [4]: https://www.studocu.com/cl/document/centro-de-formacion-tecnica-estatal-tarapaca/taller-de-base-de-datos/guia-ejercicios-sql-join-resuelta/37727533?utm_source=chatgpt.com "Guía Ejercicios SQL JOIN - resuelta - Carrera TNS en Informática y ..." 66 | [5]: https://learnsql.es/blog/7-ejemplos-de-sql-join-con-explicaciones-detalladas/?utm_source=chatgpt.com "7 Ejemplos de SQL JOIN con explicaciones detalladas | LearnSQL.es" 67 | [6]: https://josejuansanchez.org/bd/ejercicios-consultas-sql/index.html?utm_source=chatgpt.com "Ejercicios. Realización de consultas SQL" 68 | [7]: https://es.scribd.com/document/219914360/Ejercicios-SubQuerys?utm_source=chatgpt.com "Ejercicios SubQuerys | PDF | SQL | Gestión de datos - Scribd" 69 | [8]: https://biblioteca2.ucab.edu.ve/anexos/biblioteca/marc/texto/AAU4531.pdf?utm_source=chatgpt.com "[PDF] Guía de ejercicios SQL para Sistemas de Bases de Datos I - UCAB" 70 | [9]: https://learnsql.es/blog/22-ejercicios-para-practicar-comandos-sql/?utm_source=chatgpt.com "22 Ejercicios para Practicar Comandos SQL | LearnSQL.es" 71 | [10]: https://github.com/FabianNorbertoEscobar/sql-ejercicios?utm_source=chatgpt.com "FabianNorbertoEscobar/sql-ejercicios: Ejercicios de SQL ... - GitHub" 72 | -------------------------------------------------------------------------------- /clase_05/teoria/teoria.md: -------------------------------------------------------------------------------- 1 | # Clase: Vistas en SQL 2 | 3 | ## ¿Qué es una Vista? 4 | 5 | Una **vista** es una tabla virtual basada en el resultado de una consulta SQL. Aunque se comporta como una tabla, no almacena los datos por sí misma, sino que muestra los datos de una o varias tablas subyacentes. 6 | 7 | ### Ejemplo: 8 | ```sql 9 | CREATE VIEW vista_alumnos AS 10 | SELECT nombre, apellido FROM alumno; 11 | ``` 12 | 13 | Esta vista muestra solamente el nombre y apellido de los alumnos. 14 | 15 | --- 16 | 17 | ## Tipos de Vistas 18 | 19 | ### 1. Vistas Simples 20 | Basadas en una sola tabla, sin funciones agregadas ni uniones. 21 | 22 | ```sql 23 | CREATE VIEW vista_cursos AS 24 | SELECT nombre_curso, duracion FROM curso; 25 | ``` 26 | 27 | ### 2. Vistas Complejas 28 | Pueden incluir JOINs, funciones agregadas, subconsultas, etc. 29 | 30 | ```sql 31 | CREATE VIEW vista_alumnos_cursos AS 32 | SELECT a.nombre, c.nombre_curso 33 | FROM alumno a 34 | JOIN curso c ON a.id_curso = c.id_curso; 35 | ``` 36 | 37 | --- 38 | 39 | ## Objetivos de una Vista 40 | 41 | - **Simplificar consultas**: Facilita el acceso a datos complejos. 42 | - **Seguridad**: Se pueden ocultar columnas sensibles. 43 | - **Abstracción**: Se puede modificar la estructura de las tablas sin afectar a las aplicaciones que usan las vistas. 44 | - **Reutilización**: Usar una misma consulta en varios lugares. 45 | 46 | --- 47 | 48 | ## Creación y Actualización de Vistas 49 | 50 | ### Crear una Vista 51 | ```sql 52 | CREATE VIEW vista_instituciones AS 53 | SELECT nombre, ciudad FROM institucion; 54 | ``` 55 | 56 | ### Actualizar una Vista con OR REPLACE 57 | ```sql 58 | CREATE OR REPLACE VIEW vista_instituciones AS 59 | SELECT nombre, ciudad, provincia FROM institucion; 60 | ``` 61 | 62 | Esto reemplaza la vista anterior con la nueva definición. 63 | 64 | --- 65 | 66 | ## Eliminación de una Vista 67 | 68 | ```sql 69 | DROP VIEW vista_instituciones; 70 | ``` 71 | 72 | --- 73 | 74 | ## Crear Vistas ya existentes (cuando las tablas ya existen) 75 | 76 | Si ya tenemos las siguientes tablas: 77 | - `alumno(id_alumno, nombre, apellido, id_curso)` 78 | - `curso(id_curso, nombre_curso, id_categoria)` 79 | - `categoria(id_categoria, nombre_categoria)` 80 | 81 | Podemos crear una vista que relacione esta información: 82 | 83 | ```sql 84 | CREATE VIEW vista_alumnos_detalle AS 85 | SELECT a.nombre, a.apellido, c.nombre_curso, cat.nombre_categoria 86 | FROM alumno a 87 | JOIN curso c ON a.id_curso = c.id_curso 88 | JOIN categoria cat ON c.id_categoria = cat.id_categoria; 89 | ``` 90 | 91 | --- 92 | 93 | ## Aplicar Filtros a una Vista 94 | 95 | Se pueden aplicar filtros directamente en la definición: 96 | 97 | ```sql 98 | CREATE VIEW vista_alumnos_matematica AS 99 | SELECT a.nombre, a.apellido 100 | FROM alumno a 101 | JOIN curso c ON a.id_curso = c.id_curso 102 | WHERE c.nombre_curso = 'Matemática'; 103 | ``` 104 | 105 | O bien aplicar filtros al consultar la vista: 106 | 107 | ```sql 108 | SELECT * FROM vista_alumnos_detalle WHERE nombre_categoria = 'Ciencias'; 109 | ``` 110 | 111 | --- 112 | 113 | ## Crear una Vista con Más de una Tabla (JOINs) 114 | 115 | ### Ejemplo completo: 116 | Tablas involucradas: 117 | - **alumno**: (id_alumno, nombre, apellido, id_curso) 118 | - **curso**: (id_curso, nombre_curso, duracion, id_categoria) 119 | - **categoria**: (id_categoria, nombre_categoria) 120 | - **institucion**: (id_institucion, nombre, ciudad) 121 | 122 | Queremos una vista que muestre: 123 | - Nombre del alumno 124 | - Curso que está cursando 125 | - Categoría del curso 126 | - Ciudad de la institución 127 | 128 | ```sql 129 | CREATE VIEW vista_completa_alumnos AS 130 | SELECT a.nombre AS nombre_alumno, a.apellido, 131 | c.nombre_curso, cat.nombre_categoria, 132 | i.ciudad 133 | FROM alumno a 134 | JOIN curso c ON a.id_curso = c.id_curso 135 | JOIN categoria cat ON c.id_categoria = cat.id_categoria 136 | JOIN institucion i ON c.id_institucion = i.id_institucion; 137 | ``` 138 | 139 | Esto permite tener una vista global de la información para consultas más rápidas y ordenadas. 140 | 141 | --- 142 | 143 | ## Consideraciones Finales 144 | - Una vista **no almacena datos**, solo la consulta. 145 | - Se pueden consultar como si fueran tablas. 146 | - Algunas vistas pueden no ser actualizables (por ejemplo si usan funciones agregadas o GROUP BY). 147 | - Muy útiles en reportes, dashboards, y para ocultar detalles internos. 148 | 149 | 150 | 151 | --- 152 | 153 | ## Recursos Adicionales 154 | - [Documentación oficial de MySQL sobre Vistas](https://dev.mysql.com/doc/refman/8.0/en/create-view.html) 155 | - [W3Schools - SQL Views](https://www.w3schools.com/sql/sql_view.asp) 156 | 157 | 158 | 159 | ## 🧑🏫 Profesor 160 | 161 | 👨💻 **Alejandro Daniel Di Stefano** 162 | 📌 **Desarrollador Full Stack** 163 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 164 | -------------------------------------------------------------------------------- /clase_03/SQL_Query_03.sql: -------------------------------------------------------------------------------- 1 | USE coderhouse; 2 | 3 | CREATE TABLE alumnos ( 4 | id_alumno INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 5 | nombre VARCHAR(30) NOT NULL, 6 | apellido VARCHAR(40) NOT NULL, 7 | email VARCHAR (100) UNIQUE DEFAULT NULL, 8 | dni INT UNIQUE NOT NULL, 9 | telefono VARCHAR (20) UNIQUE DEFAULT NULL, 10 | nacionalidad VARCHAR (30) DEFAULT "Argentina" 11 | ); 12 | 13 | CREATE TABLE cursos ( 14 | id_curso INT PRIMARY KEY AUTO_INCREMENT, 15 | nombre_curso VARCHAR(50) NOT NULL 16 | ); 17 | 18 | CREATE TABLE inscripciones ( 19 | id_alumno INT, 20 | id_curso INT, 21 | inscription_at DATETIME DEFAULT CURRENT_TIMESTAMP, 22 | PRIMARY KEY (id_alumno, id_curso), 23 | FOREIGN KEY (id_alumno) REFERENCES alumnos(id_alumno), 24 | FOREIGN KEY (id_curso) REFERENCES cursos(id_curso) 25 | ); 26 | 27 | 28 | INSERT INTO cursos (nombre_curso) VALUES 29 | ("SQL"), 30 | ("JavaScript"), 31 | ("Java"), 32 | ("HTML"); 33 | 34 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES 35 | (4,1), 36 | (4,3), 37 | (8,1), 38 | (8,2), 39 | (22,1), 40 | (21,1), 41 | (21,4), 42 | (19,1); 43 | 44 | 45 | -- UNION de Tablas 46 | 47 | -- INNER JOIN 48 | SELECT a.nombre, a.apellido, a.dni, c.nombre_curso 49 | FROM alumnos a 50 | INNER JOIN inscripciones i ON a.id_alumno = i.id_alumno 51 | INNER JOIN cursos c ON i.id_curso = c.id_curso; 52 | 53 | -- LEFT JOIN 54 | SELECT a.nombre, a.apellido, a.dni, c.nombre_curso 55 | FROM alumnos a 56 | LEFT JOIN inscripciones i ON a.id_alumno = i.id_alumno 57 | LEFT JOIN cursos c ON i.id_curso = c.id_curso; 58 | 59 | -- RIGHT JOIN 60 | SELECT a.nombre, a.apellido, a.dni, c.nombre_curso 61 | FROM alumnos a 62 | RIGHT JOIN inscripciones i ON a.id_alumno = i.id_alumno 63 | RIGHT JOIN cursos c ON i.id_curso = c.id_curso; 64 | 65 | -- UNION 66 | -- LEFT JOIN 67 | SELECT a.nombre, a.apellido, a.dni, c.nombre_curso 68 | FROM alumnos a 69 | LEFT JOIN inscripciones i ON a.id_alumno = i.id_alumno 70 | LEFT JOIN cursos c ON i.id_curso = c.id_curso 71 | 72 | UNION 73 | 74 | SELECT a.nombre, a.apellido, a.dni, c.nombre_curso 75 | FROM alumnos a 76 | RIGHT JOIN inscripciones i ON a.id_alumno = i.id_alumno 77 | RIGHT JOIN cursos c ON i.id_curso = c.id_curso; 78 | 79 | -- SELF JOIN 80 | -- SELECT a1.nombre AS alumno, a2.nombre AS tutor 81 | -- FROM alumnos a1 82 | -- JOIN alumnos a2 ON a1.tutor_id = a2.id_alumno; 83 | 84 | 85 | -- Uso de LIKE y Comodines + REGEX 86 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono, nacionalidad, edad) 87 | VALUES 88 | ("Adrian", "Perez", "Adrian@mail.com", 55669997, "12154654", 'Uruguaya', 29), 89 | ("Andres", "Perez", "Andres@mail.com", 57866677, "12541654", 'Uruguaya', 29); 90 | 91 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono, nacionalidad, edad) 92 | VALUES 93 | ("Adrian", "Perez", "Adrian@gmail.com", 556699947, "121454654", 'Uruguaya', 29), 94 | ("Andres", "Perez", "Andres@gmail.com", 574866677, "125414654", 'Uruguaya', 29); 95 | 96 | 97 | SELECT nombre, apellido, dni, telefono, edad 98 | FROM alumnos 99 | WHERE nombre LIKE "A%" 100 | ORDER BY nombre ASC; 101 | 102 | SELECT nombre, apellido, dni, telefono, edad , email 103 | FROM alumnos 104 | WHERE email LIKE "%gmail.com" 105 | ORDER BY nombre ASC; 106 | 107 | SELECT nombre, apellido, dni, telefono, edad 108 | FROM alumnos 109 | WHERE nombre REGEXP "^[A-C]" 110 | ORDER BY nombre ASC; 111 | 112 | SELECT nombre, apellido, dni, telefono, edad 113 | FROM alumnos 114 | WHERE nombre LIKE "A%" 115 | OR nombre LIKE "C%" 116 | ORDER BY nombre ASC; 117 | 118 | 119 | SELECT nombre, apellido, dni, telefono, edad , email FROM alumnos WHERE email REGEXP '^[a-z]+@[a-z]+\\.(com|net)$'; 120 | 121 | 122 | 123 | -- Subconsultas de SQL 124 | 125 | SELECT nombre, edad 126 | FROM alumnos 127 | WHERE edad = (SELECT MAX(edad) FROM alumnos); 128 | 129 | SELECT nombre, edad 130 | FROM alumnos 131 | WHERE edad = (SELECT MIN(edad) FROM alumnos); 132 | 133 | SELECT nombre, edad, nacionalidad 134 | FROM alumnos 135 | WHERE (nacionalidad, edad) IN ( 136 | SELECT nacionalidad, MIN(edad) 137 | FROM alumnos 138 | GROUP BY nacionalidad 139 | ); 140 | 141 | -- Funciones de Texto 142 | SELECT UPPER(email) AS email_mayuscula, nombre, LOWER(apellido) AS Apellido, edad 143 | FROM alumnos 144 | WHERE edad > (SELECT AVG(edad) FROM alumnos); 145 | 146 | 147 | SELECT a.nombre, a.apellido, i.inscription_at AS fecha_inscripcion 148 | FROM alumnos a 149 | INNER JOIN inscripciones i ON a.id_alumno = i.id_alumno 150 | WHERE i.inscription_at < DATE_SUB(NOW(), INTERVAL 1 YEAR); 151 | 152 | -- DDL 153 | TRUNCATE inscripciones; 154 | 155 | -- No es recomendable porque puede ser Destructivo 156 | RENAME TABLE alumnos TO estudiantes; 157 | RENAME TABLE estudiantes TO alumnos; 158 | -------------------------------------------------------------------------------- /clase_05/ejercicios/ejercicios_sql_completos.md: -------------------------------------------------------------------------------- 1 | 2 | # 🧠 Ejercicios Prácticos de SQL 3 | 4 | 5 | --- 6 | 7 | ## 📌 PARTE 1: Consultas Básicas 8 | 9 | ### 1. Mostrar todos los alumnos 10 | 11 | ```sql 12 | SELECT * FROM alumnos; 13 | ``` 14 | 15 | ### 2. Listar todos los cursos ordenados por duración descendente 16 | 17 | ```sql 18 | SELECT * FROM cursos 19 | ORDER BY duracion DESC; 20 | ``` 21 | 22 | ### 3. Buscar alumnos cuyo nombre comience con "A" 23 | 24 | ```sql 25 | SELECT * FROM alumnos 26 | WHERE nombre LIKE 'A%'; 27 | ``` 28 | 29 | ### 4. Mostrar los 5 cursos más largos 30 | 31 | ```sql 32 | SELECT * FROM cursos 33 | ORDER BY duracion DESC 34 | LIMIT 5; 35 | ``` 36 | 37 | ### 5. Obtener los emails de los alumnos únicos 38 | 39 | ```sql 40 | SELECT DISTINCT email FROM alumnos; 41 | ``` 42 | 43 | --- 44 | 45 | ## 📌 PARTE 2: Funciones de Agregado y Agrupaciones 46 | 47 | ### 6. Cantidad total de alumnos 48 | 49 | ```sql 50 | SELECT COUNT(*) AS total_alumnos FROM alumnos; 51 | ``` 52 | 53 | ### 7. Duración promedio de los cursos 54 | 55 | ```sql 56 | SELECT AVG(duracion) AS promedio_duracion FROM cursos; 57 | ``` 58 | 59 | ### 8. Cantidad de inscriptos por curso 60 | 61 | ```sql 62 | SELECT id_curso, COUNT(id_alumno) AS cantidad 63 | FROM inscripciones 64 | GROUP BY id_curso; 65 | ``` 66 | 67 | --- 68 | 69 | ## 📌 PARTE 3: Joins y Relaciones 70 | 71 | ### 9. Obtener el nombre del alumno y el nombre del curso en el que está inscripto 72 | 73 | ```sql 74 | SELECT a.nombre, a.apellido, c.nombre_curso 75 | FROM inscripciones i 76 | JOIN alumnos a ON i.id_alumno = a.id_alumno 77 | JOIN cursos c ON i.id_curso = c.id_curso; 78 | ``` 79 | 80 | ### 10. Alumnos sin inscripción 81 | 82 | ```sql 83 | SELECT a.* 84 | FROM alumnos a 85 | LEFT JOIN inscripciones i ON a.id_alumno = i.id_alumno 86 | WHERE i.id_alumno IS NULL; 87 | ``` 88 | 89 | --- 90 | 91 | ## 📌 PARTE 4: Subconsultas 92 | 93 | ### 11. Mostrar los cursos con más inscriptos que el promedio 94 | 95 | ```sql 96 | SELECT id_curso, COUNT(*) AS total 97 | FROM inscripciones 98 | GROUP BY id_curso 99 | HAVING total > (SELECT AVG(cantidad) 100 | FROM (SELECT COUNT(*) AS cantidad 101 | FROM inscripciones 102 | GROUP BY id_curso) subquery); 103 | ``` 104 | 105 | --- 106 | 107 | ## 📌 PARTE 5: Vistas 108 | 109 | ### 12. Crear una vista con alumnos y su curso 110 | 111 | ```sql 112 | CREATE VIEW vista_alumnos_cursos AS 113 | SELECT a.nombre, a.apellido, c.nombre_curso 114 | FROM inscripciones i 115 | JOIN alumnos a ON i.id_alumno = a.id_alumno 116 | JOIN cursos c ON i.id_curso = c.id_curso; 117 | ``` 118 | 119 | ### 13. Vista de alumnos inscriptos en más de un curso 120 | 121 | ```sql 122 | CREATE VIEW vista_multicurso AS 123 | SELECT id_alumno, COUNT(*) AS cantidad 124 | FROM inscripciones 125 | GROUP BY id_alumno 126 | HAVING cantidad > 1; 127 | ``` 128 | 129 | --- 130 | 131 | ## 📌 PARTE 6: Stored Procedures 132 | 133 | ### 14. Procedimiento para contar inscripciones por día 134 | 135 | ```sql 136 | DELIMITER // 137 | 138 | CREATE PROCEDURE ObtenerInscripcionesPorDia() 139 | BEGIN 140 | SELECT DATE(inscription_at) AS fecha, COUNT(*) AS cantidad 141 | FROM inscripciones 142 | GROUP BY fecha; 143 | END // 144 | 145 | DELIMITER ; 146 | 147 | CALL ObtenerInscripcionesPorDia(); 148 | ``` 149 | 150 | --- 151 | 152 | ## 📌 PARTE 7: Triggers 153 | 154 | ### 15. Trigger para evitar inscripciones duplicadas 155 | 156 | ```sql 157 | DELIMITER // 158 | 159 | CREATE TRIGGER before_inscription_insert 160 | BEFORE INSERT ON inscripciones 161 | FOR EACH ROW 162 | BEGIN 163 | DECLARE existe INT; 164 | SELECT COUNT(*) INTO existe 165 | FROM inscripciones 166 | WHERE id_alumno = NEW.id_alumno AND id_curso = NEW.id_curso; 167 | 168 | IF existe > 0 THEN 169 | SIGNAL SQLSTATE '45000' 170 | SET MESSAGE_TEXT = 'El Alumno ya está inscripto en este curso'; 171 | END IF; 172 | END // 173 | 174 | DELIMITER ; 175 | ``` 176 | 177 | ### 16. Trigger para actualizar contador de inscripciones 178 | 179 | ```sql 180 | DELIMITER // 181 | 182 | CREATE TRIGGER after_inscription_insert 183 | AFTER INSERT ON inscripciones 184 | FOR EACH ROW 185 | BEGIN 186 | DECLARE curso_count INT; 187 | 188 | SELECT cantidad_inscripciones INTO curso_count 189 | FROM cursos_inscripciones_count 190 | WHERE id_curso = NEW.id_curso; 191 | 192 | IF curso_count IS NULL THEN 193 | INSERT INTO cursos_inscripciones_count (id_curso, cantidad_inscripciones) 194 | VALUES (NEW.id_curso, 1); 195 | ELSE 196 | UPDATE cursos_inscripciones_count 197 | SET cantidad_inscripciones = cantidad_inscripciones + 1 198 | WHERE id_curso = NEW.id_curso; 199 | END IF; 200 | END // 201 | 202 | DELIMITER ; 203 | ``` 204 | 205 | --- 206 | 207 | 208 | 209 | ## 🧑🏫 Profesor 210 | 211 | 👨💻 **Alejandro Daniel Di Stefano** 212 | 📌 **Desarrollador Full Stack** 213 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 214 | -------------------------------------------------------------------------------- /clase_02/query_clase_02.sql: -------------------------------------------------------------------------------- 1 | USE coderhouse; 2 | 3 | -- Sublenguages SQL 4 | -- DDL Data Definition Language 5 | -- DML Data Manipulatin Language 6 | -- DCL (Data Control Language) -- Controlar Permisos 7 | -- TCL (Transaction Control Language) -- Controlar Transacciones 8 | 9 | -- ------------------------------------------------------ 10 | 11 | -- DDL Data Definition Language 12 | CREATE DATABASE IF NOT EXISTS coderhouse; 13 | CREATE TABLE coderhouse.alumnos ( 14 | id_alumno INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 15 | nombre VARCHAR(30) NOT NULL, 16 | apellido VARCHAR(40) NOT NULL, 17 | email VARCHAR (100) UNIQUE DEFAULT NULL, 18 | dni INT UNIQUE NOT NULL, 19 | telefono VARCHAR (20) UNIQUE DEFAULT NULL, 20 | nacionalidad VARCHAR (30) DEFAULT "Argentina" 21 | ); 22 | 23 | -- DROP TABLE coderhouse.alumnos; 24 | ALTER TABLE coderhouse.alumnos ADD COLUMN fecha_inscripcion DATETIME DEFAULT CURRENT_TIMESTAMP; 25 | ALTER TABLE coderhouse.alumnos ADD COLUMN instituto VARCHAR(60); 26 | ALTER TABLE coderhouse.alumnos ADD COLUMN edad INT DEFAULT NULL; 27 | ALTER TABLE coderhouse.alumnos MODIFY COLUMN instituto VARCHAR(60) DEFAULT 'CoderHouse'; 28 | 29 | -- DML Data Manipulatin Language 30 | 31 | -- INSERT INTO alumnos(nombre, apellido, email, dni, telefono) 32 | -- VALUES 33 | -- ("Alejandro", "Di Stefano", "alejandro@mail.com", 22233355, "115555666"); 34 | 35 | -- INSERT INTO alumnos(nombre, apellido, email, dni, telefono) 36 | -- VALUES 37 | -- ("Juan", "Perez", "perez@mail.com", 113333666, "1166667777"); 38 | -- INSERT INTO alumnos(nombre, apellido, email, dni, telefono) 39 | -- VALUES 40 | -- ("Ivanna", "Muñoz", "ivana@mail.com", 33555888, "1166333777"); 41 | 42 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono) 43 | VALUES 44 | ("Alejandro", "Di Stefano", "alejandro@mail.com", 22233355, "115555666"), 45 | ("Juan", "Perez", "perez@mail.com", 113333666, "1166667777"), 46 | ("Ivanna", "Muñoz", "ivana@mail.com", 33555888, "1166333777"); 47 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono, edad) 48 | VALUES 49 | ("Marcela", "Muñoz", "ivana@mail.com", 33555888, "1166333777", 20); 50 | 51 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono, nacionalidad, edad) 52 | VALUES 53 | ("Marcela", "Perez", "marce@mail.com", 22686777, "12555666", 'Uruguaya', 20); 54 | 55 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono, nacionalidad, edad) 56 | VALUES 57 | ("Marcelo", "Perez", "marcelo@mail.com", 55666677, "1254654", 'Uruguaya', 29), 58 | ("Enzo", "Godoy", "enzo@mail.com", 55996677, "1253354", 'Brasilero', 22), 59 | ("Julian", "Alvarez", "julian@mail.com", 55688677, "1251124", 'Peruano', 33), 60 | ("Cristian", "Diaz", "cris@mail.com", 55222677, "1111654", 'Chileno', 21), 61 | ("Raul", "Leiva", "raul@mail.com", 55446677, "1251654", 'Chileno', 31), 62 | ("Wanda", "Nara", "wandaylgante@mail.com", 22444488, "4545454", 'Argentina', 31), 63 | ("Romina", "Baron", "romy@mail.com", 53333677, "1254154", 'Peruano', 27); 64 | 65 | INSERT INTO alumnos(nombre, apellido, email, dni, telefono, nacionalidad, edad) 66 | VALUES 67 | ("China", "Suarez", "chinaicardi@mail.com", 22686677, "19955666", 'Argentina', 35); 68 | 69 | 70 | SELECT * FROM alumnos; 71 | 72 | UPDATE coderhouse.alumnos SET instituto = 'CoderHouse', nacionalidad = 'Argentina'; 73 | 74 | SET SQL_SAFE_UPDATES = 0; 75 | SET SQL_SAFE_UPDATES = 1; 76 | 77 | DELETE FROM coderhouse.alumnos; 78 | UPDATE coderhouse.alumnos SET edad = 49 WHERE dni = '22233355'; 79 | UPDATE coderhouse.alumnos SET edad = 30 WHERE dni = '113333666'; 80 | UPDATE coderhouse.alumnos SET edad = 16 WHERE dni = '33555888'; 81 | 82 | SELECT nombre, apellido FROM alumnos WHERE edad >= 18; 83 | 84 | DELETE FROM coderhouse.alumnos WHERE edad < 18; 85 | 86 | SELECT COUNT(*) AS alumnos_uruguayos FROM alumnos WHERE nacionalidad = 'Uruguaya'; 87 | SELECT COUNT(*) AS alumnos_argentinos FROM alumnos WHERE nacionalidad = 'Argentina'; 88 | 89 | SELECT SUM(edad) AS suma_total_de_edades_alumnos_argentinos FROM alumnos WHERE nacionalidad = 'Argentina'; 90 | SELECT AVG(edad) AS promedio_de_edades_alumnos_argentinos FROM alumnos WHERE nacionalidad = 'Argentina'; 91 | 92 | SELECT 93 | COUNT(*) AS cantidad_alumnos, 94 | SUM(edad) AS suma_de_edades, 95 | AVG(edad) AS promedio_de_edades 96 | FROM alumnos 97 | WHERE nacionalidad = 'Argentina'; 98 | 99 | -- != (Desigual) 100 | 101 | 102 | SELECT id_alumno, nombre, apellido, dni, telefono, edad 103 | FROM alumnos 104 | WHERE edad >= 18 105 | ORDER BY edad ASC; 106 | 107 | SELECT nombre, apellido, dni, telefono 108 | FROM alumnos 109 | WHERE edad >= 18 110 | ORDER BY apellido DESC; 111 | 112 | UPDATE coderhouse.alumnos SET edad = 26 WHERE id_alumno = 8; 113 | 114 | SELECT 115 | MIN(edad) AS "Mas Joven", 116 | MAX(edad) AS Mayor 117 | FROM alumnos ; 118 | 119 | 120 | SELECT nacionalidad, 121 | MIN(edad) AS "Mas Joven", 122 | MAX(edad) AS "Mas Adulto" 123 | FROM alumnos 124 | GROUP BY nacionalidad; 125 | 126 | 127 | 128 | SELECT nombre, apellido, dni, telefono 129 | FROM alumnos 130 | ORDER BY apellido ASC 131 | LIMIT 5; 132 | -------------------------------------------------------------------------------- /clase_10/ejercicios/ejercicios.md: -------------------------------------------------------------------------------- 1 | # Ejercicios Clase 10 2 | 3 | ## Transacciones 4 | 5 | ### 📁 `ejercicios.md` 6 | 7 | # 🧠 Ejercicios de Práctica – Transacciones y Backup en MySQL Workbench 8 | 9 | ## 🎯 Objetivos de la clase 10 | 11 | - Reconocer e implementar las sentencias del sublenguaje **TCL**. 12 | - Identificar en qué situación usar cada sentencia (**COMMIT, ROLLBACK, SAVEPOINT**). 13 | - Definir los conceptos **Backup** y **Restauración**. 14 | - Identificar los componentes del proceso de **Backup & Restore**. 15 | - Implementar **Backups** y **Restauraciones** en Workbench y línea de comandos. 16 | 17 | --- 18 | 19 | ## 🧪 SECCIÓN 1 – Transacciones (TCL) 20 | 21 | ### 🧩 Ejercicio 1: Insertar múltiples registros con COMMIT 22 | 23 | 1. Crear una base de datos `ejemplo_tcl`. 24 | 2. Crear una tabla `clientes` con id, nombre, email. 25 | 3. Iniciar una transacción e insertar 3 registros. 26 | 4. Ejecutar `COMMIT`. 27 | 5. Verificar que los datos se guardaron. 28 | 29 | ```sql 30 | START TRANSACTION; 31 | 32 | INSERT INTO clientes (nombre, email) VALUES ('Carlos', 'carlos@mail.com'); 33 | INSERT INTO clientes (nombre, email) VALUES ('Lucía', 'lucia@mail.com'); 34 | INSERT INTO clientes (nombre, email) VALUES ('Damián', 'damian@mail.com'); 35 | 36 | COMMIT; 37 | ```` 38 | 39 | --- 40 | 41 | ### 🧩 Ejercicio 2: Usar ROLLBACK para deshacer errores 42 | 43 | 1. Iniciar una nueva transacción. 44 | 2. Insertar 2 registros nuevos en `clientes`. 45 | 3. Por error, intentá insertar uno con un email repetido. 46 | 4. Al fallar, usar `ROLLBACK`. 47 | 5. Verificar que no se insertó nada. 48 | 49 | --- 50 | 51 | ### 🧩 Ejercicio 3: Usar SAVEPOINT para retroceder parcialmente 52 | 53 | 1. Iniciar una transacción. 54 | 2. Insertar 3 productos en una tabla `productos`. 55 | 3. Usar `SAVEPOINT` después del primero y segundo insert. 56 | 4. Luego hacé un rollback al segundo punto. 57 | 5. Commit final. 58 | 59 | ```sql 60 | START TRANSACTION; 61 | 62 | INSERT INTO productos (nombre, precio) VALUES ('Mouse', 1500); 63 | SAVEPOINT luego_del_mouse; 64 | 65 | INSERT INTO productos (nombre, precio) VALUES ('Teclado', 3500); 66 | SAVEPOINT luego_del_teclado; 67 | 68 | INSERT INTO productos (nombre, precio) VALUES ('Monitor', 25000); 69 | 70 | ROLLBACK TO luego_del_teclado; 71 | COMMIT; 72 | ``` 73 | 74 | --- 75 | 76 | ### 🧩 Ejercicio 4: Restaurar valores iniciales en múltiples tablas 77 | 78 | 1. Crear tablas `cuentas` y `movimientos`. 79 | 2. Insertar datos iniciales con una transacción. 80 | 3. Simular una transferencia entre cuentas usando transacciones. 81 | 4. Si algo falla, usar `ROLLBACK`. 82 | 5. Si todo está bien, `COMMIT`. 83 | 84 | --- 85 | 86 | ## 💾 SECCIÓN 2 – Backup y Restauración 87 | 88 | ### 📌 Ejercicio 5: Crear un backup completo con MySQL Workbench 89 | 90 | 1. Crear una base `backup_demo` con varias tablas y registros. 91 | 2. Ir a `Server > Data Export`. 92 | 3. Exportar la base completa a un archivo `.sql`. 93 | 4. Guardar el archivo en tu PC. 94 | 95 | --- 96 | 97 | ### 📌 Ejercicio 6: Eliminar una tabla por accidente (simulado) 98 | 99 | 1. Eliminar una tabla (por ejemplo, `empleados`). 100 | 2. Verificar que ya no existe. 101 | 102 | ```sql 103 | DROP TABLE empleados; 104 | ``` 105 | 106 | --- 107 | 108 | ### 📌 Ejercicio 7: Restaurar la base desde el backup 109 | 110 | 1. Ir a `Server > Data Import`. 111 | 2. Importar el archivo `.sql` creado en el Ejercicio 5. 112 | 3. Confirmar que la tabla eliminada volvió. 113 | 114 | --- 115 | 116 | ### 📌 Ejercicio 8: Crear un backup desde línea de comandos (si usás terminal) 117 | 118 | ```bash 119 | mysqldump -u root -p backup_demo > backup_respaldo.sql 120 | ``` 121 | 122 | ### 📌 Ejercicio 9: Restaurar el backup desde terminal 123 | 124 | ```bash 125 | mysql -u root -p backup_demo < backup_respaldo.sql 126 | ``` 127 | 128 | --- 129 | 130 | ## 📘 SECCIÓN 3 – Preguntas teóricas 131 | 132 | 1. ¿Qué diferencia hay entre `ROLLBACK` y `ROLLBACK TO SAVEPOINT`? 133 | 2. ¿En qué casos usarías `START TRANSACTION`? 134 | 3. ¿Qué ventaja tiene usar SAVEPOINT en vez de hacer un rollback completo? 135 | 4. ¿Qué datos incluye un archivo de backup `.sql`? 136 | 5. ¿Qué sucede si restaurás un backup sobre una base que ya tiene datos? 137 | 138 | --- 139 | 140 | ## 🧠 BONUS – Proyecto Integrador 141 | 142 | Crea un sistema de inscripción a cursos: 143 | 144 | 1. Tablas: `alumnos`, `cursos`, `inscripciones`. 145 | 2. Simulá una transacción donde varios alumnos se inscriben. 146 | 3. Introducí un error (como un ID inexistente) a propósito. 147 | 4. Hacé rollback y corregilo. 148 | 5. Exportá un backup y volvé a importar para verificar todo. 149 | 150 | --- 151 | 152 | ## ✅ Checklist Final 153 | 154 | - [ ] Sé usar `START TRANSACTION`, `COMMIT`, `ROLLBACK`, `SAVEPOINT`. 155 | - [ ] Puedo generar un backup en `.sql`. 156 | - [ ] Sé restaurar desde Workbench y terminal. 157 | - [ ] Identifico cuándo usar cada técnica. 158 | 159 | --- 160 | 161 | ## 🧑🏫 Profesor 162 | 163 | 👨💻 **Alejandro Daniel Di Stefano** 164 | 📌 **Desarrollador Full Stack** 165 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) 166 | -------------------------------------------------------------------------------- /clase_01/resumen.md: -------------------------------------------------------------------------------- 1 | 2 | ## **📌 Clase 01** 3 | ### **Unidad 1: Bases de Datos Relacionales** 4 | 🎯 **Objetivos de la clase** 5 | 1. Definir qué es una base de datos. 6 | 2. Identificar los componentes de una base de datos. 7 | 3. Presentar los tipos de bases de datos y su importancia. 8 | 4. Explicar el glosario técnico clave. 9 | 5. Definir qué es una base de datos relacional y sus aspectos generales. 10 | 6. Identificar los componentes de una base de datos relacional. 11 | 12 | --- 13 | 14 | 15 | # **📌 Contenido de la clase** 16 | ## **1️⃣ ¿Qué es una Base de Datos?** 17 | 🎯 **Definición** 18 | Una base de datos (DB) es un conjunto organizado de información que permite almacenar, gestionar y recuperar datos de manera eficiente. 19 | 20 | 📌 **Ejemplo práctico:** 21 | Piensa en una hoja de cálculo donde guardas una lista de clientes con nombres, correos y teléfonos. Si esta información crece demasiado, Excel deja de ser eficiente. Aquí es donde entra una base de datos. 22 | 23 | 📌 **Importancia:** 24 | - Permite almacenar grandes volúmenes de información. 25 | - Facilita el acceso y la manipulación de los datos. 26 | - Asegura la integridad y seguridad de la información. 27 | 28 | --- 29 | 30 | ## **2️⃣ Componentes de una Base de Datos** 31 | 1. **Datos:** Información almacenada en tablas. 32 | 2. **Software de Base de Datos:** Programa que gestiona los datos (Ej.: MySQL, PostgreSQL, SQL Server). 33 | 3. **Usuarios:** Personas o sistemas que interactúan con la base de datos. 34 | 4. **Lenguaje de Consulta:** Como SQL, para manejar los datos. 35 | 36 | 📌 **Ejemplo:** 37 | Una base de datos de una tienda online tiene: 38 | - Tabla `Clientes` (con nombres, correos y teléfonos). 39 | - Tabla `Pedidos` (con productos comprados y montos). 40 | 41 | --- 42 | 43 | ## **3️⃣ Tipos de Bases de Datos y su Importancia** 44 | 📌 **Tipos de bases de datos más comunes:** 45 | 1. **Bases de Datos Relacionales (SQL)**: Organizan datos en tablas relacionadas. Ejemplo: MySQL. 46 | 2. **Bases de Datos No Relacionales (NoSQL)**: Usan documentos o clave-valor (Ej.: MongoDB). 47 | 48 | 📌 **Comparación rápida:** 49 | | Característica | Relacional (SQL) | No Relacional (NoSQL) | 50 | |--------------|-----------------|------------------| 51 | | Estructura | Tablas y relaciones | Documentos o claves | 52 | | Ejemplo | MySQL, PostgreSQL | MongoDB, Firebase | 53 | | Uso típico | Aplicaciones empresariales | Big Data, Apps móviles | 54 | 55 | --- 56 | 57 | ## **4️⃣ Glosario Técnico Clave** 58 | - **SQL (Structured Query Language):** Lenguaje para manejar bases de datos relacionales. 59 | - **Tabla:** Conjunto de datos organizados en filas y columnas. 60 | - **Registro:** Cada fila dentro de una tabla. 61 | - **Campo:** Cada columna dentro de una tabla. 62 | - **Clave Primaria (Primary Key):** Identificador único de cada registro. 63 | - **Clave Foránea (Foreign Key):** Relaciona una tabla con otra. 64 | 65 | 📌 **Ejemplo visual de tabla:** 66 | | ID | Nombre | Email | 67 | |----|--------|----------------| 68 | | 1 | Juan | juan@gmail.com | 69 | | 2 | Ana | ana@gmail.com | 70 | 71 | Aquí, el campo `ID` es la **Clave Primaria**. 72 | 73 | --- 74 | 75 | ## **5️⃣ ¿Qué es una Base de Datos Relacional?** 76 | 🎯 **Definición** 77 | Una base de datos relacional organiza los datos en tablas que pueden relacionarse entre sí mediante claves primarias y claves foráneas. 78 | 79 | 📌 **Ejemplo de Relación entre Tablas:** 80 | 1. **Tabla `Clientes`** 81 | | ClienteID | Nombre | Email | 82 | |----------|--------|----------------| 83 | | 1 | Juan | juan@gmail.com | 84 | | 2 | Ana | ana@gmail.com | 85 | 86 | 2. **Tabla `Pedidos`** 87 | | PedidoID | ClienteID | Producto | 88 | |---------|----------|------------| 89 | | 101 | 1 | Laptop | 90 | | 102 | 2 | Teléfono | 91 | 92 | **Relación:** `Pedidos.ClienteID` es una **Clave Foránea** que conecta con `Clientes.ClienteID`. 93 | 94 | --- 95 | 96 | ## **6️⃣ Ejercicio Práctico en Vivo** 97 | ✍ **Objetivo:** Crear una base de datos simple y hacer consultas en SQL. 98 | 99 | 📌 **Pasos:** 100 | 1. **Crear la base de datos:** 101 | ```sql 102 | CREATE DATABASE Tienda; 103 | USE Tienda; 104 | ``` 105 | 106 | 2. **Crear la tabla `Clientes`:** 107 | ```sql 108 | CREATE TABLE Clientes ( 109 | ClienteID INT PRIMARY KEY, 110 | Nombre VARCHAR(100), 111 | Email VARCHAR(100) UNIQUE 112 | ); 113 | ``` 114 | 115 | 3. **Insertar datos:** 116 | ```sql 117 | INSERT INTO Clientes (ClienteID, Nombre, Email) 118 | VALUES (1, 'Juan Pérez', 'juan@gmail.com'), 119 | (2, 'Ana Gómez', 'ana@gmail.com'); 120 | ``` 121 | 122 | 4. **Consultar datos:** 123 | ```sql 124 | SELECT * FROM Clientes; 125 | ``` 126 | 127 | 📌 **Desafío:** 128 | - Crear una tabla `Pedidos` con `PedidoID`, `ClienteID` y `Producto`. 129 | - Insertar registros en `Pedidos`. 130 | - Hacer una consulta para obtener los pedidos de cada cliente. 131 | 132 | --- 133 | 134 | ## 🧑🏫 Profesor 135 | 136 | 👨💻 **Alejandro Daniel Di Stefano** 137 | 📌 **Desarrollador Full Stack** 138 | 🔗 **GitHub:** [Drako01](https://github.com/Drako01) -------------------------------------------------------------------------------- /clase_05/Query_Clase_05.sql: -------------------------------------------------------------------------------- 1 | -- Creacion de una vista basica 2 | CREATE VIEW vista_alumnos AS 3 | SELECT nombre, apellido FROM alumnos; 4 | 5 | -- Consultar una Vista 6 | SELECT * FROM vista_alumnos; 7 | 8 | -- Vistas Complejas (Usando JOIN) 9 | 10 | CREATE VIEW view_inscripciones_alumnos AS 11 | SELECT 12 | a.id_alumno, 13 | CONCAT(a.nombre, ' ', a.apellido) AS nombre_completo, 14 | a.email, 15 | c.id_curso, 16 | c.nombre_curso, 17 | i.inscription_at 18 | FROM inscripciones i 19 | JOIN alumnos a ON i.id_alumno = a.id_alumno 20 | JOIN cursos c ON i.id_curso = c.id_curso; 21 | 22 | SELECT * FROM view_inscripciones_alumnos; 23 | 24 | CREATE VIEW view_alumno_completa AS 25 | SELECT 26 | nombre, 27 | apellido, 28 | email, 29 | instituto 30 | FROM alumnos; 31 | 32 | SELECT * FROM view_alumno_completa; 33 | 34 | -- Eliminacion de una Vista 35 | 36 | DROP VIEW view_alumno_completa; 37 | 38 | -- Modificar o Actualizar una Vista con OR REPLACE 39 | 40 | CREATE OR REPLACE VIEW view_alumno_completa AS 41 | SELECT 42 | a.nombre, 43 | a.apellido, 44 | a.email, 45 | a.instituto, 46 | c.nombre_curso, 47 | i.inscription_at 48 | FROM inscripciones i 49 | JOIN alumnos a ON i.id_alumno = a.id_alumno 50 | JOIN cursos c ON i.id_curso = c.id_curso; 51 | 52 | -- Ejecicios de Repaso 53 | 54 | SELECT * FROM cursos; 55 | -- Agregamos columna duracion 56 | ALTER TABLE cursos ADD COLUMN duracion_curso INT DEFAULT 20; 57 | 58 | UPDATE cursos SET duracion_curso = 60 WHERE id_curso = 3; 59 | INSERT INTO cursos (nombre_curso, duracion_curso) VALUES 60 | ("Data Analytics", 120), 61 | ("React", 60), 62 | ("Angular", 80), 63 | ("Python" ,120); 64 | 65 | -- Mostrar todos los cursos que duren más de 20 horas. 66 | SELECT 67 | nombre_curso AS nombre, 68 | duracion_curso AS duracion 69 | FROM cursos 70 | WHERE duracion_curso > 20; 71 | 72 | -- Listar los alumnos cuyo apellido contenga la letra “z”. 73 | SELECT * FROM alumnos; 74 | SELECT * FROM alumnos WHERE UPPER(apellido) LIKE "%Z%"; 75 | SELECT * FROM alumnos WHERE LOWER(apellido) LIKE "%z%"; 76 | SELECT * FROM alumnos WHERE LOWER(apellido) LIKE "%ez%"; 77 | SELECT * FROM alumnos WHERE LOWER(email) LIKE "%gmail.com"; 78 | SELECT * FROM alumnos WHERE LOWER(email) LIKE "ma%"; 79 | 80 | -- Mostrar todos los cursos cuyo nombre empiece en “SQL”. 81 | SELECT * FROM cursos; 82 | INSERT INTO cursos (nombre_curso, duracion_curso) VALUES 83 | ("SQL nivel Basico", 80), 84 | ("SQL nivel Intermedio", 60), 85 | ("SQL nivel Avanzado", 80), 86 | ("SQL Server" ,180); 87 | 88 | SELECT * FROM cursos WHERE LOWER(nombre_curso) LIKE "SQL%"; 89 | 90 | -- Mostrar los primeros 3 cursos en orden alfabético. 91 | SELECT * FROM cursos; 92 | SELECT * FROM cursos 93 | ORDER BY id_curso ASC 94 | LIMIT 3; 95 | 96 | 97 | -- Obtener el promedio de duración de los cursos por categoría. 98 | CREATE TABLE categoria ( 99 | id_categoria INT AUTO_INCREMENT PRIMARY KEY, 100 | nombre_categoria VARCHAR(100) NOT NULL 101 | ); 102 | ALTER TABLE cursos ADD COLUMN id_categoria INT; 103 | ALTER TABLE cursos 104 | ADD CONSTRAINT fk_curso_categoria 105 | FOREIGN KEY (id_categoria) REFERENCES categoria (id_categoria); 106 | 107 | INSERT INTO categoria (nombre_categoria) VALUES 108 | ("Base de Datos"), 109 | ("Programacion"); 110 | 111 | SELECT * FROM categoria; 112 | 113 | SELECT 114 | cat.nombre_categoria, 115 | ROUND(AVG(cur.duracion_curso)) AS promedio_duracion 116 | FROM cursos cur 117 | JOIN categoria cat ON cur.id_categoria = cat.id_categoria 118 | GROUP BY cat.nombre_categoria; 119 | 120 | -- Mostrar la categoría con más cursos asociados. 121 | CREATE VIEW view_categoria_mas_cursos AS 122 | SELECT 123 | cat.nombre_categoria, 124 | COUNT(cur.id_curso) AS cantidad_cursos 125 | FROM categoria cat 126 | LEFT JOIN cursos cur ON cur.id_categoria = cat.id_categoria 127 | GROUP BY cat.id_categoria 128 | ORDER BY cantidad_cursos DESC 129 | LIMIT 1; 130 | 131 | SELECT * FROM view_categoria_mas_cursos; 132 | 133 | -- Crear un trigger que registre en un log cada vez que un alumno se inscribe. 134 | CREATE TABLE log_inscripciones ( 135 | id_log INT AUTO_INCREMENT PRIMARY KEY, 136 | id_alumno INT, 137 | id_curso INT, 138 | fecha_inscripcion DATETIME, 139 | log_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP 140 | ); 141 | 142 | DELIMITER // 143 | 144 | CREATE TRIGGER tr_log_inscriptios 145 | AFTER INSERT ON inscripciones 146 | FOR EACH ROW 147 | BEGIN 148 | INSERT INTO log_inscripciones (id_alumno, id_curso, fecha_inscripcion) 149 | VALUES (NEW.id_alumno, NEW.id_curso, NEW.inscription_at); 150 | END // 151 | 152 | DELIMITER ; 153 | SELECT * FROM cursos; 154 | SELECT * FROM inscripciones; 155 | SELECT * FROM log_inscripciones; 156 | 157 | INSERT INTO inscripciones (id_alumno, id_curso) VALUES 158 | (4,12), 159 | (4,7); 160 | 161 | -- Listar los cursos junto con la cantidad de alumnos, ordenado de mayor a menor. 162 | CREATE VIEW view_cantidad_alumnos_curso AS 163 | SELECT 164 | c.nombre_curso, 165 | COUNT(i.id_alumno) AS cantidad_alumnos 166 | FROM cursos c 167 | LEFT JOIN inscripciones i ON c.id_curso = i.id_curso 168 | GROUP BY c.id_curso, c.nombre_curso 169 | ORDER BY cantidad_alumnos DESC; 170 | 171 | SELECT * FROM view_cantidad_alumnos_curso; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🗄️ SQL - Modalidad Flex | CoderHouse 🏫 2 | 3 |
4 |
5 |
8 |
9 |
10 |
11 |