# Tema 3 · 3 · SQL con la tabla de estudiantes (carga, CRUD, administración y ejercicios 1 y 2) Presentación del Tema 3: «CREATE = INSERT», «READ = SELECT» y «UPDATE»; «Carga de BD en SGBD», «Manipulación de datos en SGBD», «Administración de bases de datos desde Adminer» y «Administración de tablas desde Adminer» y «Ejercicio 1» y «Ejercicio 2». Duración: 10 a 15 minutos de carga y comprobaciones, más lo que dediques a los ejercicios. Coste: ninguno propio (usas la RDS y el Adminer que ya tienes encendidos). ## Qué vas a hacer Vas a cargar en tu RDS la base `universidad` (tabla `estudiantes`, 48 alumnos) con Adminer y a hacer sobre ella las prácticas de SQL de las diapositivas: altas, consultas, cambios y bajas, administración de bases y tablas, y los ejercicios 1, 2 y 2B. Esta guía no resuelve los ejercicios: explica cómo montar el entorno y cómo comprobar que tus resultados son los esperados (cada bloque de `ejercicios.txt` trae el resultado esperado en comentarios), pero no las sentencias que debes escribir. ``` tema3_estudiantes.sql ──(SQL command / Import en Adminer)──> RDS: base universidad, tabla estudiantes (48 filas) ejercicios.txt ────────(copiar y pegar bloque a bloque)────> prácticas CRUD, administración, ejercicios 1, 2 y 2B ``` **Qué se crea en AWS:** nada. Todo ocurre dentro de la RDS que ya tienes (bases `universidad`, y temporalmente `prueba`). ## Qué contiene esta carpeta | Fichero | Para qué sirve | En qué paso se usa | |---|---|---| | `tema3_estudiantes.sql` | Crea la base `universidad` y la tabla `estudiantes` (columnas `id`, `nombre`, `apellidos`, `grupo`, `num_convocatoria` y `derecho_a_examen`) con 48 registros | Paso 1 | | `ejercicios.txt` | SQL para copiar y pegar si los bloques de las diapositivas dan error, con el resultado esperado en comentarios: CRUD, administración, columna `nota`, ejercicios 1, 2 y 2B. Su primera línea explica que PowerPoint mete caracteres no imprimibles | Pasos 3 a 7 | | `README.md` | Esta guía | Siempre | ## Antes de empezar - [ ] La RDS MariaDB en estado `Available` ([03.01](../03.01-RDSMariaDB.md)). - [ ] Adminer desplegado y conectado a tu RDS ([03.02](../03.02-adminer/README.md)). Si lo apagó el autoapagado, arráncalo de nuevo (la IP habrá cambiado). - [ ] Los ficheros `.sql` y `.txt` están en tu PC (no en CloudShell): ábrelos con un editor de texto (Bloc de notas, VS Code...), **no** con Word ni con Excel. ## Cómo llevar los ficheros a donde toque No hace falta CloudShell. Abre cada fichero en tu PC con un editor de texto, copia el contenido y pégalo en Adminer (**SQL command**), o súbelo con **Import** (para `.sql`). Los ficheros no se ejecutan en tu PC. ## Paso a paso **Paso 1. Cargar `tema3_estudiantes.sql`.** 1. En el menú de la izquierda de Adminer, pulsa **SQL command**. 2. Abre `tema3_estudiantes.sql` en tu PC, copia todo el contenido, pégalo en el cuadro y pulsa **Execute**. Alternativa: **Import** > elige el fichero > **Execute**. El fichero crea la base `universidad` (si no existe), la tabla `estudiantes` e inserta los registros. Qué verás: la ejecución termina sin mensajes de error en rojo. Comprueba que está cargado: abre el desplegable de bases de datos, elige `universidad` (en minúscula), pulsa la tabla `estudiantes` y luego **select data**: deben salir 48 registros. O lanza: ```sql USE universidad; SELECT COUNT(*) FROM estudiantes; ``` Debe devolver `48`. Si lo ejecutas dos veces, el fichero no borra nada antes de insertar, así que tendrás los registros duplicados (96, con ids nuevos). Si quieres volver a empezar de cero, elimina la base y vuelve a cargar el fichero (perderás los cambios que hayas hecho): `DROP DATABASE universidad;`. **Paso 2. Cómo usar `ejercicios.txt`.** Está en el orden de las diapositivas. Pega los bloques de **uno en uno** en **SQL command** y pulsa **Execute**; lee qué hace cada sentencia antes de lanzarla. Todas las sentencias terminan en `;` (si pegas dos sentencias seguidas sin `;` entre ellas, MariaDB las lee como una sola y da `Error 1064`). Las líneas que empiezan por `--` o `#` son comentarios y se pueden pegar. Cada bloque trae en comentarios el **resultado esperado**: cifras que debes obtener. Si tras pegar desde la diapositiva sale un error raro, copia el bloque de este fichero en su lugar. Si te saltas un ejercicio, salta también lo que depende de él. **Paso 3. Ejemplos CRUD.** En Adminer puedes editar filas con la interfaz (**select data** > **edit**) o lanzar SQL. El SQL de apoyo está en el bloque `Ejemplos CRUD` de `ejercicios.txt` (`INSERT`, `SELECT`, `UPDATE`, `DELETE`). Qué verás (según el propio fichero): 49 filas tras el `INSERT` (Ana tiene el id 49), 4 con apellido `Ruiz` y, al final, 48 filas (A 14, B 15, C 19). Si el `INSERT` con id 70 te dio curiosidad: dejaría el `AUTO_INCREMENT` en 71 (los ids siguientes serían 71, 72...); no hace falta para ningún ejercicio. **Paso 4. Administración de bases de datos y tablas.** Bloque `Administracion` de `ejercicios.txt` (en Adminer, **SQL command**): crea y borra una base de prueba sin tocar `universidad`, y añade y quita una columna y una tabla de prueba. Qué verás: en la lista de bases de datos, la columna *Collation* de `prueba` pasa de `latin1_swedish_ci` (el valor por defecto de la RDS) a `utf8mb4_general_ci`; `SELECT COUNT(*), COUNT(correo) FROM estudiantes;` da `48` y `0` (`correo` es `NULL` en todas las filas); al terminar, `estudiantes` sigue con 48 filas y sus 6 columnas (`id`, `nombre`, `apellidos`, `grupo`, `num_convocatoria`, `derecho_a_examen`). Estas sentencias no se pueden deshacer con `ROLLBACK`. **No borres `universidad`**: la usan los ejercicios siguientes. **Paso 5. Columna `nota` y ejemplos de CRUD.** Los ejemplos de `INSERT`, `SELECT` y `UPDATE` de la presentación (apartados «CREATE = INSERT», «READ = SELECT» y «UPDATE») usan una columna `nota` que **no existe** en `tema3_estudiantes.sql`: sin ella dan `Error (1054): Unknown column 'nota'`. La crea el `ALTER TABLE` de la presentación (`ALTER TABLE estudiantes ADD nota int(2) NULL DEFAULT 5;`). Ejecútalo primero, **una sola vez** (si lo repites da `1060 Duplicate column name`, inofensivo). Está en el bloque `Columna nota` de `ejercicios.txt`. **Ojo: esos tres ejemplos cambian datos de verdad.** Si los ejecutas tal cual, el `INSERT` deja una fila más (Elena Fernández) y el `UPDATE` sube 14 notas, y las comprobaciones de después (50 filas tras el ejercicio 3, A 14 / B 13 / C 23) ya no cuadran. Por eso `ejercicios.txt` trae los tres ejemplos dentro de `START TRANSACTION` ... `ROLLBACK`, para no cambiar tus datos: pruébalos así, o ejecuta el `ROLLBACK` tú mismo (las diapositivas ya lo avisan en el cuadro amarillo). El bloque entero debe ir en **una sola ejecución** de Adminer. Qué verás (tras el CRUD del paso 3): el `SELECT` de la presentación devuelve 10 filas (todas con `nota` 5: empates) y el `UPDATE` cambia 14 filas si ya has hecho el `INSERT` y 13 si no (Ana Domingo, la del `INSERT`, tiene `derecho_a_examen` vacío y no entra). Tras el `ROLLBACK`, todo queda como estaba (`nota` = 5 en todas las filas, 48 alumnos). **Paso 6. Ejercicio 1.** Bloque `Ejercicio 1`: escribe tu consulta (el enunciado está en la diapositiva) y compara. Qué verás: 4 filas: Carlos, Hugo, Mario y Paula. Si no sale ninguna, comprueba que has elegido la base `universidad`; también vale `... WHERE apellidos LIKE 'Ru%' ORDER BY nombre;`. **Paso 7. Ejercicio 2.** Primero comprueba cuántas filas vas a tocar y solo entonces modifica. Qué verás: el `SELECT` previo da 7 filas; el `UPDATE` informa `4 rows affected` (y no 7: el motor solo cuenta las filas que cambian de verdad; los David que ya estaban en el grupo C no se cuentan, 7 − 4 = 3); la comprobación final por grupos da **A 12, B 13, C 23**. **Paso 8. Ejercicio 2B (contar, agrupar y relacionar).** Bloque `Ejercicio 2B`: `COUNT`, `GROUP BY`, `HAVING`, subconsulta con `NOT IN` y `JOIN`. Qué verás (cifras «tras los ejercicios 1 y 2», antes del ejercicio 3 de [03.04](../03.04-webappexportar/README.md)): `COUNT(*)` 48; A 12, B 13, C 23; `HAVING` > 3: Molina 5, Dominguez 4, Fernandez 4, Ruiz 4; `NOT IN`: Carlos, Lucia, Luis, Mario, Pablo. Si ya has hecho el ejercicio 3 (dos altas en el grupo A) saldrán 50 filas, A 14 y, en el `NOT IN`, 7 nombres (los 5 anteriores más los de tus dos alumnos nuevos): es lo correcto, no un error. El `JOIN` necesita la base `paises` del ejercicio 4 (actividad [03.05](../03.05-paiseseuribor/README.md)): va comentado en el fichero; quita los `-- ` cuando hayas hecho ese ejercicio. Resultado esperado: Spain Sur, Italy Norte, France Centro, Greece Sur, Austria Centro. ## Errores frecuentes | Síntoma | Causa | Solución | |---|---|---| | Error al pegar un bloque desde el PowerPoint | PowerPoint mete caracteres no imprimibles | Copia el bloque de `ejercicios.txt` | | Error al pegar dos sentencias seguidas (`Error 1064`) | Falta algún `;` entre ellas | Termina cada sentencia con `;` o lánzalas de una en una | | Registros duplicados (96) tras cargar `tema3_estudiantes.sql` dos veces | El fichero no borra antes de insertar | `DROP DATABASE universidad;` y carga el fichero una sola vez | | `Error (1054): Unknown column 'nota'` al probar la presentación | La columna `nota` no existe hasta el `ALTER TABLE` de la presentación | Ejecuta ese `ALTER TABLE` primero (paso 5) | | `1060 Duplicate column name 'nota'` | Ya habías creado la columna y repites el `ALTER TABLE` | Inofensivo: la columna ya está | | El `SELECT` del ejercicio 1 no devuelve filas | Elegiste otra base de datos | `USE universidad;` (en minúscula) | | Los números de los ejercicios no cuadran (por ejemplo, A 14 en vez de A 12) | Ejecutaste la presentación sin `ROLLBACK`, o repetiste un `INSERT` | Si no puedes arreglarlo a mano, `DROP DATABASE universidad;` y vuelve a cargar el fichero | | Adminer rechaza el fichero por tamaño (`Maximum allowed file size`) | Adminer con los límites de PHP por defecto | Ver «Errores frecuentes» de [03.02](../03.02-adminer/README.md) (estos ficheros pesan unos KB, así que no debería pasar con los scripts actuales) | ## Limpieza En esta actividad no hay nada que borrar en AWS: todo es SQL dentro de tu RDS. **No borres `universidad`**: la necesitan las actividades [03.04](../03.04-webappexportar/README.md) y [03.06](../03.06-acidrigidez/README.md). Si quieres empezar de cero, `DROP DATABASE universidad;` y vuelve a cargar `tema3_estudiantes.sql`. La RDS y Adminer se borran al final del tema: Adminer en la limpieza de [03.02](../03.02-adminer/README.md) y la RDS en la de [03.01](../03.01-RDSMariaDB.md), después de la última actividad que las use (03.09). ## Cómo sabes que has terminado - [ ] `tema3_estudiantes.sql` cargado: la base `universidad` tiene la tabla `estudiantes` con 48 registros al empezar. - [ ] Has hecho las prácticas de la presentación: `universidad.estudiantes` sigue con 48 filas y sin la columna `correo`, y la base `prueba` ya no existe. - [ ] La tabla tiene la columna `nota` (valor por defecto 5) y los ejemplos de la presentación los probaste con `ROLLBACK`. - [ ] Ejercicio 1: 4 filas. Ejercicio 2: `4 rows affected` y grupos A 12 / B 13 / C 23. - [ ] (Opcional) Ejercicio 2B con las cifras indicadas. Anterior: [03.02 · Adminer](../03.02-adminer/README.md) · Siguiente: [03.04 · Web app propia y ejercicio 3 (exportar e importar)](../03.04-webappexportar/README.md)