
En este curso aprenderás a manejar esta base de datos, con más de 6 millones de instalaciones en el mundo.
Para diseñar una base de datos podemos seguir los siguentes pasos:
1. Cada tabla deberá tener un nombre único y específico.
2. Cada una de las tablas deberá tener al menos un campo
MySQL reconoce varios tipos de datos, o lo que es lo mismo, categorías generales (abstracciones) cuyos valores se pueden representar:
Como ya se había dicho, una tabla es un conjunto de uno o más columnas. Cuando se crea una tabla con la sentencia CREATE TABLE, se especifica el tipo deseado para cada columna. Un TIPO DE COLUMNA es más específico que un TIPO DE DATO. El tipo de dato es una categoría general como "número"o "cadena". A un tipo de cadena le caracteriza precisamente la clase de valores que puede contener, como SMALLINT o VARCHAR(32).
AUTO_INCREMENT es un atributo de columna que debería utilizar sólo con tipos enteros. Esto limita las posibilidades desde TINYINT a BIGINT.
Para poder escoger entre todas las variaciones de tipo de columna, no está demás hacerse las siguientes preguntas (aunque algunas veces parecerán obvias):
¿Qué tipo de valores, números, cadenas y fechas albergará la columna?
¿Sus valores se corresponden con algún rango?
Con la siguiente definición:
DECIMAL(3, 2)
Creeremos que el campo podrá almacenar 3 dígitos a la izquierda del punto y 2 a la derecha (por ejemplo 250.00). Pero no, no es así.
Lo que le estamos indicando a MySQL declarando la columna de esa forma es que soporte 3 dígitos en total, y que de esos 3 tome 2 para decimales. De modo que el número positivo más grande que podremos almacenar con esa definición será 9.99 ya que son tres dígitos y dos de ellos serán utilizados como decimales.
Debido a eso, debemos tener en mente que:
M: El número de dígitos que puede soportar el campo
D: El número de dígitos que se toman de M como decimales
Así que si queremos almacenar algo como 250.00 debemos declarar la columna así:
DECIMAL(5, 2)
Con eso estamos diciéndole al motor: “Que este campo soporte números de hasta cinco dígitos, dos de ellos a la izquierda del punto”. Y el número positivo más grande que podremos almacenar será 999.99
DECIMAL(5, 2) 500.00 999.99
DECIMAL(7,3) 1500.650 9999.999
DECIMAL(9,2) 1500000.90 9999999.99
DECIMAL(5,4) 1.00759 .9999
DECIMAL(5,0) 10000 99999
DECIMAL(65, 0) Un número de 65 dígitos sin punto decimal Un número de 65 dígitos compuesto de nueves
DECIMAL(66, 0) Error, el máximo para M es 65 Error, el máximo para M es 65DECIMAL(65,
Para poder escoger entre todas las variaciones de tipo de columna, no está demás hacerse las siguientes preguntas (aunque algunas veces parecerán obvias):
¿Qué tipo de valores, números, cadenas y fechas albergará la columna?
¿Sus valores se corresponden con algún rango?
MySQL proporciona varios tipos de columna para valores temporales:
Nombre de tipo Significado
DATE Valor de fecha en formato YYYY-MM-DD
"1000-01-01" a "9999-12-31"
Requiere 3 bytes
Los tipos de columnas más utilizados son CHAR y VARCHAR. Difieren que el primero es de una longitud fija y que el segundo es de una longitud variable. Si los campos que se van a almacenar no varían de longitud drásticamente (por ejemplo, un número telefónico) no conviene utilizar el campo VARCHAR, pues tiene un byte adicional de control
Los motores de almacenamiento son componentes MySQL que manejan las operaciones SQL para diferentes tipos de tablas.
InnoDB es el motor de almacenamiento predeterminado y de uso más general, y Oracle recomienda su uso para tablas, excepto en casos de uso especializados. (La sentencia CREATE TABLE desde MySQL 5.7 crea tablas InnoDB por defecto).
En este capítulo puedes encontrar los datos y el esquema de la base de datos.
Apuntes a la primera sección "Introducción a MySQL"
La forma que crearemos y manipularemos la información es por medio de un lenguaje llamado SQL (Structured Query Lenguage), diseñado por IBM en los años setenta. El lenguaje se divide, en términos generales, en los siguientes módulos.
La sentencia para crear una tabla es: CREATE TABLE nombre (definición de columnas)
Crear una tabla
La sentencia para crear una tabla es:
CREATE TABLE nombre (definición de columnas)
Los tipo de las columnas ya se vieron en el capítulo anterior, pero los principales son:
1. Integer: Número entero con rango de -2,147,483,648 y 2,147,483,647 2. VarChar(n): Es una cadena con longitud variable, con un máximo de 255 caracteres. El parámetro n marca el máximo de la longitud esperada.
Mostrar las tablas en una base de datos
Para que usted pueda ver las tablas existentes, necesita ejecutar el siguiente comando:
SHOW tables;
Ejecute el comando con punto y coma al final.
Eliminación de bases de datos y de tablas
Para borrar una tabla o una base de datos basta con la sentencia
DROP TABLE nombreTabla;
DROP DATABASE base de datos; Tenga cuidado al ejecutar esta sentencia, ya que una vez ejecutada no habrá manera de recuperar la información. Ejemplo: Borre la tabla "salon", que por error pusimos su nombre en sigular, cuando debría ser "salones", y vuelva a crearla con el nombre correcto.
Para insertar datos a una tabla, necesitamos la siguiente instrucción:
INSERT INTO tabla (columnas) VALUES (valores); Por ejemplo, para insertar un registro en nuestra tabla de contactos utilizaríamos la siguiente sentencia: INSERT INTO alumnos (nombre, apellido, nacimiento, promedio, sexo, idEscuela, idSalon, idCurso)
VALUES ("Paco", "Arce", "1966-02-10", 8, "M", 1, 1,1);
Otra forma de insertar datos es por medio de un archivo de tipo texto que contiene las instrucciones SQL. Por ejemplo: En un procesador de palabra que no maneje caracteres especiales teclee las siguientes instrucciones: INSERT INTO escuelas VALUES(0,"Escuela 1"); INSERT INTO escuelas VALUES(0,"Libre de Derecho"); INSERT INTO escuelas VALUES(0,"Escuela 2"); INSERT INTO escuelas VALUES(0,"Abierta de economía");
Contamos con otra sintaxis para insertar varios registros en la misma sentencia:
INSERT INTO cursos (id, descripcion) VALUES(0,"JavaScript"), (0,"PHP"), (0,"MySQL"), (0,"CSS3"), (0,"SublimeText3"), (0,"HTML5");
En muchas ocasiones es necesario modificar los datos que ya se encuentran en nustras tablas. Para ello contamos con la siguiente sentencia: UPDATE [LOW_PRIORITY] tabla SET columna=valor [,columna2=valor2...] [WHERE condición] [LIMIT n]
Para borrar un registro, o grupos de registros, se utilizará la sentencia DELETE: DELETE [LOW_PRIORITY] FROM tabla [WHERE condicion] [LIMIT n]
Podemos instertar una gran cantidad de información desde un archivo externo por medio de la instrucción LOAD DATA. Su sintaxis general es:
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE "nombre_archivo.txt"
[IGNORE | REPLACE]
INO TABLE nombre_tabla
[FIELDS
[TERMINATED BY 'cadena']
[OPTIONALLY] ENCLOSED BY 'caracter']
[ESCAPED BY 'caracter']]
[LINES TERMINATED BY 'cadena']
[IGNORE n LINES]
[(lista_columnas)]
LOW_PRIORITY retrasa la sentencia hasta que ningún cliente esté leyendo de la tabla.
LOCAL hará que el archivo se lea de la computadora del cliente y se envíe al servidor.
IGNORE No carga las columnas que tengan la llave principal dupliocada
REPLACE Remplaza los registros con llaves duplicadas
Si se usa FIELDS hay que especificar TERMINATED BY (describe el caracter o caracteres que delimitan valores dentro de una fila)
ENCLOSED BY especifica un carácter entrecomillado que se quita al final del campo de valores si se una OPTIONALLY.
ESCAPED BY especifica el carácter de escape de los caracteres especiales.
FIELDS siempre debe preceder a LINES.
LINES TERMINATED BY especifica un carácter o caracteres que significan el final de las lineas.
Apuntes a la sección "El SQL de MySQL"
Para consultar los datos utilizaremos la sentencia SELECT como se muestra a continuación en su versión simplificada: SELECT [DISTINCT | ALL | otras_opciones] lista_selección [INTO OUTFILE 'nombre_archivo' opciones_exportación] FROM tabla_origen [, tabla_origen...] [WHERE condición] [LIMIT m,n]; [GROUP BY expresión_de_agrupación] [HAVING condición_de_búsqueda] [ORDER BY expresión_order_by [ASC | DESC]]
Esta cláusula especifica las tablas de donde se van a obtener las filas.
La cláusula FROM es necesaria siempre. Su sintáxis básica es:
FROM lista_tablas
Especifica una condición de búsqueda para restrigir las filas que se van a devolver. Su sintaxis es la siguiente:
[WHERE condición_de_búsqueda | nombre de columna {*= | =*} nombre de columna]
El primer argumento "condición de búsqueda" limita las dilas devueltas en el conjunto de resultados mediante el uso de predicads.
El segundo argumento "nombre de columna {*= | =*} nombre de columna" funcionará para las combinaciones, las cuales se verán más adelante.
Por medio de la sentencia WHERE podemos consultar simultáneamente más de una tabla. Por ejemplo, en la base de datos el campo "idEscuela" de la tabla "alumnos" es la llave para unir la descripción de la escuela en la tabla "escuelas". Para unirlas debemos igualar en la sentencia WHERE idEscuela=id
Especifica las agrupaciones que se van a realizar en las dilas de salida y, en caso de incluir funciones de agregado como COUNT o MAX en la cláusula SELECT lista_selección calcula el valor de resumen de cada grupo.
Especifica las agrupaciones que se van a realizar en las dilas de salida y, en caso de incluir funciones de agregado como COUNT o MAX en la cláusula SELECT lista_selección calcula el valor de resumen de cada grupo.
Especifica las agrupaciones que se van a realizar en las dilas de salida y, en caso de incluir funciones de agregado como COUNT o MAX en la cláusula SELECT lista_selección calcula el valor de resumen de cada grupo.
La cláusula LIMIT nos permite seleccionar un conjunto de los renglones regresados por el select. Esto es de mucha utilidad cuando estamos mostrando registros por Internet, ya que nos permite "paginar" la selección y no saturar ni al cliente ni al servidor. Su sintaxis es: [LIMIT n] [LIMIT m,n]
Recuerde que podemos utilizar los alias tanto para renombrar tablas en el FROM como para renombrar el nombre de las columnas. Esto es de gran utilidad porque algunas veces el nombre de las tablas son muy largos y hacen a la sentencia muy compleja. Para generar un "alias" en la sentencia FROM necesitamos la palabra AS como se muestra en el siguiente ejemplo:
IN efectúa una selección entre un conjunto de posbles resultados. También se tiene su contraparte NOT IN.
Operador condicional muy importante para seleccionar entre eun rango de columnas numéricas es el BETWEEN AND.
Por medio de esta comparación podemos buscar patrones dentro de las cadenas, ya que se podemos utilizar comodines, por ejemplo:
IS NULL: También se puede seleccionar los campos que se encuentren con el valor NULL, o seleccionar exclusivamente aquellos que sean diferentes a NULL.
Las funciones de agregado realizan un cálculo sobre un conjunto de valores y devuelven un solo valor.
Con la excepción de COUNT, las funciones de agregado omiten los valores NULL.
Las funciones de agregado sólo se aceptan como expresiones en la lista de selección de una instricción SELECT.
Las funciones de agregado sólo se aceptan como expresiones en la lista de selección de una instricción SELECT.
MID(columna, inicio[,longitu]): Extrae un conjunto de “n” caracteres a partir del valor de “inicio” de la columna seleccionada.
LENGTH(columna): Regresa la longitud de la cadena almacenada en la columna.
FIELD () devuelve la posición del índice de un valor en una lista de valores. Esta función realiza una búsqueda entre mayúsculas y minúsculas.
Si el valor especificado no se encuentra en la lista de valores, esta función devolverá cero.
Si el valor es NULL, devolverá cero.
LOCATE() devuelve la ubicación de la primera aparición de una subcadena en una cadena.
LPAD() devuelve una cadena que se rellena a la izquierda con una cadena especificada a una cierta longitud.
Por medio de los operadores lógicos podemos realizar varias preguntas dentro de una misma condicional.
Por medio de AND regresará verdadero si todas las condiciones son verdaderas.
Por medio de OR regresará verdadero si al menos una condición es verdadera.
Aqui encontrarás los apuntes de la sección.
MySQL tiene varias funciones para el manejo de fechas que nos pueden ser de mucha utilidad. Aquí mostramos algunas de ellas.
La función DATE_ADD(fecha, INTERVAL expr unidad) añade o suma tiempo a una fecha.
DAY y DAYOFMONTH: Día del mes.
DAYNAME: Nombre del dia de la semana en inglés.
DAYOFWEEK: Número del día de la semana, 1 domingo, 7 sábado.
DAYOFYEAR: Día del año.
HOUR: Regresa la hora de una fecha.
MINUTE: Regresa los minutos.
SECOND: Regresa los segundos.
MICROSECOND: Regresa los microsegundos.
TIME: Regresa el tiempo de una fecha.
TO_DAYS: Devuelve el número de días entre la fecha y el año cero (0000-00-00).
FROM_DAYS: Devuelve una fecha de una representación numérica del día.
MAKEDATE: Cree y devuelva una fecha basada en un valor de año y número de días.
WEEK: Regresa el número de semana del año.
WEEKDAY: Regresa el número del día de la semana, 0 = lunes… 6 = domingo.
WEEKOFYEAR: Regresa el número de semana del año.
YEARWEEK: Regresa el año y la semana de una fecha.
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
MySQL soporta las siguientes sintaxis de JOIN para la parte “tablas” de comandos SELECT y DELETE y UPDATE de múltiples tablas.
La cláusula LEFT JOIN regresa todos los renglones de la tabla izquierda (tabla1) que coincidan con los renglones de la tabla derecha (tabla2).
Si no hay coincidencias, se regresa un valor nulo.
La cláusula RIGHT JOIN regresa todos los renglones de la tabla2 (tabla derecha), que coincidan con los renglones de la tabla izquierda (tabla1).
El resultado es nulo (NULL) si el la tabla izquierda no hay coincidencia
La cláusula RIGHT JOIN regresa todos los renglones de la tabla2 (tabla derecha), que coincidan con los renglones de la tabla izquierda (tabla1).
El resultado es nulo (NULL) si el la tabla izquierda no hay coincidencias.
Podemos crear una tabla a partir de un query anteponiendo la sentencia CREATE TABLE al query.
La tabla no debe existir previamente.
Podemos llamar a otro query dentro de otra consulta, generalmente dentro del WHERE cuando necesitamos calcular información con la que no contamos.
Podemos detectar, por medio de un subquery, los elementos que existen o que no existen en otra tabla.
Para ello podemos utilizar EXISTS() y NOT EXISTS().
Si el subquery regresa registros en su consulta es resultado será verdadero, si no regresa registros, el resultado será falso.
Una tabla derivada es una tabla virtual devuelta desde una declaración SELECT.
Una tabla derivada es similar a una tabla temporal, pero se usa una tabla derivada en la instrucción SELECT.
Es mucho más simple que una tabla temporal porque no requiere pasos para crear la tabla temporal.
El término tabla derivada y un subquery a menudo se usa indistintamente.
Cuando se utiliza u
MySQL introdujo la expresión de tabla común o la función CTE desde la versión 8.0.
Una expresión de tabla común es un conjunto de resultados temporal denominado que existe sólo dentro del ámbito ejecución de una instrucción SQL única por ejemplo, SELECT, INSERT, UPDATE, o DELETE.
Una consulta inicial que forma el conjunto de resultados base de la estructura CTE. La parte de consulta inicial se denomina miembro de anclaje.
Una parte de consulta recursiva es una consulta que hace referencia al nombre CTE, por lo tanto, se llama miembro recursivo. El miembro recursivo se une con el miembro de anclaje mediante un operador UNION ALL u UNION DISTINCT.
Una tarea muy común en el desarrollo de aplicaciones: si tenemos una tabla “maestra”, por ejemplo la comanda de un restaurante, debemos sumarizar y actualizar los consumido (los platillos).
Para ello debemos crear primero un select y el resultado lo actualizaremos en la tabla maestra por medio de un inner join.
Para seleccionar todos los registros de una tabla, excluyendo los que también existen en otra tabla, utiliza una subconsulta NOT IN o un LEFT JOIN con IS NULL, especificando la condición de coincidencia entre ambas tablas, generalmente usando una columna común como el ID.
Para crear una vista en MySQL, usa la sintaxis
CREATE VIEW nombre_vista AS consulta;
Esta sentencia crea una tabla virtual basada en el resultado de la consulta, que puede incluir una o varias tablas, simplificando así consultas complejas.
Para crear una vista en MySQL, usa la sintaxis
CREATE VIEW nombre_vista AS consulta;
Esta sentencia crea una tabla virtual basada en el resultado de la consulta, que puede incluir una o varias tablas, simplificando así consultas complejas.
Muchas veces necesitamos actualizar un campo de una tabla, por ejemplo, el stock de un producto, con los datos de otra tabla, por ejemplo, las ventas.
Para ello podemos utilizar una sentencia UPDATE y unimos ambas con JOIN
Muchas veces necesitamos crear un registro en una tabla, a partir otra, por ejemplo, crear u registro de movimiento con relación a cada detalle de una venta.
Para ello podemos utilizar una sentencia INSERT y otra sentencia SELECT.
Por medio de la sentencia GROUP BY podemos analizar un proceso con varias tablas.
SELECT DATE(v.fecha) AS fecha,
c.cuenta AS cuenta,
COUNT(p.idVenta) AS totalTransacciones,
SUM(p.pago) AS totalVendido
FROM ventas AS v
JOIN pagos p ON p.idVenta = v.id
JOIN usuarios u ON v.idUsuario = u.id
JOIN cuentas c ON p.idCuenta = c.id
WHERE v.fecha >= '2026-03-09' AND v.fecha <= '2026-03-15'
GROUP BY DATE(v.fecha), p.idCuenta
ORDER BY fecha DESC, totalVendido DESC;
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
Después de crear una tabla, es posible cambiar muchas de las opciones que fueron definidas cuando se creó originalmente, por ejemplo:
Agregar, modificar o eliminar columnas.
Así se puede cambiar el nombre, longitud, tipo de datos, la precisión, la escala y la aceptación de valores NULL de la columna, aunque existen algunas restricciones.
CHANGE especifica que la columna dada va a cambiarse de nombre_columna a nombre_columna_nuevo, o a modificarse al nuevo tipo de datos (si es que los nombres de las columnas coinciden).
Para ello usaremos la sentencia ADD [COLUMN], donde la declaración de columna comprende el nombre de la columna, así como su longitud, tipo y otras características, como UNSIGNED, NOT NULL, etc
Para eliminar una columna necesitamos la sentencia DROP [COLUMN] nombre_columna.
Si esta columna es parte del indice, se elimina del indice sin borrar este.
Si elimina todas las columnas del indice, este también se borra.
Renombrar una tabla con ALTER TABLE
Una llave foránea es un campo utilizada para vincular dos tablas.
Una llave foránea es un campo (o colección de campos) en una tabla que se refiere a la LLAVE PRIMARIA en otra tabla.
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
Creamos el índice “primary key” o “de clave primaria” al momento de crear la tabla.
En este caso se usa la opción PRIMARY KEY al final de la definición de los campos, con una lista de los campos que serán parte del índice.
Se les llama así a los indices que permiten que sus llaves de dupliquen.
Por ejemplo, un índice con las columnas nombre+apellidos se podría duplicar con personas que tuvieran exactamente los mismos nombres y apellidos.
Los índices únicos son básicamente como los índices ordinarios, excepto que los valores duplicados no son permitidos.
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
Una cuenta MySQL se define en términos de un nombre de usuario y el equipo o equipos desde los que el usuario puede conectar al servidor.
Aunque en la versión 5.0.2 de MySQL existe una sentencia para crear usuarios, CREATE USER, en versiones anteriores se usa exclusivamente la sentencia GRANT para crearlos.
Para una adecuada administración de los usuarios, lo primero que debemos conocer, es cómo visualizarlos.
phpMyAdmin es la herramienta más utilizada en la manipulación de MySQL, aunque llega a cambiar un poco dependiendo de la versión.
Cuando ya subimos nuestra aplicación al servidor Web, por lo general creamos bases de datos, usuarios y asignamos privilegios a los mismos, así como relacionar usuarios con bases de datos, por medio del cPanel, o de algún panel similar.
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
Una llave foránea es un campo utilizada para vincular dos tablas.
Una llave foránea es un campo (o colección de campos) en una tabla que se refiere a la LLAVE PRIMARIA en otra tabla.
MySQL permite crear una tabla con las opciones CASCADE y RESTRICT.
La opción CASCADE elimina o actualiza la fila de la tabla primaria (que contiene LLAVES PRIMARIAS) y elimina o actualiza automáticamente las filas coincidentes en la tabla secundaria (que contiene LLAVES FORÁNEAS).
ALTER TABLE tabla
ADD [CONSTRAINT [symbol]]
FOREIGN KEY [índice] (col_name, ...)
REFERENCES tabla2(col_name,...)
[ON DELETE opcion]
[ON UPDATE opcion]
ALTER TABLE alumnos
DROP FOREIGN KEY indice;
MySQL le permite crear una tabla con la opción SET NULL. Al hacerlo, se eliminará o actualizará la fila de la tabla primaria y se establecerá la columna o columnas de llave foránea en la tabla secundaria en NULL.
Puede usar SET NULL para DELETE y UPDATE.
La restricción NOT ACTION funciona como RESTRICT. Es compatible con SQL estándard.
SET DEFAULT no lo reconoce en INNODB.
A partir de MySQL 8.0.16, acepta las restricciones CHECK de tabla y columna para todos los motores de almacenamiento.
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
¿Algo para mejorar en esta sección?
¿Algún comentario o aporte?
Tus comentarios son muy importantes y seguiré trabajando para que puedas calificar este curso con 5 estrellas.
En esta clase encontrarás los apuntes de la sección.
MySQL es la base de datos más utilizada en Internet, sin duda alguna. Se estima en más de 6 millones de instalaciones al rededor del mundo. En este curso aprenderás a utilizarla desde las instrucciones más básicas, hasta hacer querys complejos. Nuestros objetivos son:
Aprender los términos básicos sobre las bases de datos.
Crear una base de datos, una tabla, insertará un registro, actualizará y borrará registros.
Estructurar sentencias SELECT con WHERE, ORDER BY, GROUP BY, HAVING, LIMIT, etc.
Aprender el manejo de fechas con las funciones básicas de MySQL.
Aprender a concatenar tablas con los diferentes tipos de instrucción JOIN.
Modificar las tablas por medio del comando ALTER TABLE.
Crear, manipular y eliminar de los índices.
Aprender a crear, borrar y manejar los usuarios
Aprender a crear y manipular las llaves foráneas entre las tablas.
Aprender a bloquear tablas, cambiar claves de acceso, respaldar y recuperar los datos de un respaldo.
Este curso está dirigido a Desarrolladores web que deseen utilizar la base de datos MySQL. Necesitas tener conocimientos generales de computación y una computadora personal con Windows u OSx y conexión a Internet. Tendrás los archivos y los apuntes del curso. Actualizado a MariaDB 11.4. La base de datos más instalada en el mundo.