Tabla de contenidos
Esta página es un complemento práctico a los contenidos teóricos que se cubren en el Tema 8 de TIC de 1º Bachillerato.
La creación de tablas es uno de los primeros pasos en el diseño de una base de datos relacional en MySQL. Las tablas son el corazón de cualquier base de datos, ya que almacenan la información en un formato estructurado compuesto por filas y columnas. Cada tabla debe ser definida con una estructura que especifique el nombre de cada columna y el tipo de datos que almacenará.
Ahora, vamos a ver cómo se realiza este proceso paso a paso.
1. Definir la estructura de la tabla
Antes de escribir cualquier código, debemos entender qué información queremos almacenar en nuestra tabla y cómo queremos organizarla.
Por ejemplo, si estamos creando una tabla para almacenar información sobre los estudiantes de un instituto, podríamos querer guardar el nombre del estudiante, su número de identificación, su fecha de nacimiento, y su correo electrónico.
Tal y como vimos en los apuntes, primero define todas esas cuestiones y luego escribe las instrucciones SQL necesarias para trasladarlo a tu sistema gestor de bases de datos de trabajo.
2. Usar la instrucción CREATE TABLE
Para crear una tabla en MySQL, utilizamos la instrucción SQL CREATE TABLE, seguida del nombre que queremos darle a la tabla y una lista de columnas con sus tipos de datos -entre paréntesis puedes configurar ese tipo de dato-.
Cada columna se define con un nombre único y un tipo de dato que especifica qué tipo de información se puede almacenar en esa columna (por ejemplo, VARCHAR para cadenas de texto, INT para números enteros, DATE para fechas, etc.).
2.1. Ejemplo de creación de una tabla
Supongamos que queremos crear una tabla llamada estudiantes. Aquí tenemos un ejemplo de cómo podría ser la instrucción SQL para crear esta tabla:
CREATE TABLE estudiantes (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
fecha_nacimiento DATE NOT NULL,
correo_electronico VARCHAR(100)
);- id: es un número entero que se autoincrementa y actúa como la clave primaria de la tabla, lo que significa que cada registro en la tabla tendrá un identificador único
- nombre: es una cadena de texto que puede tener hasta 100 caracteres. El NOT NULL indica que este campo es obligatorio y no puede estar vacío.
- fecha_nacimiento: almacena la fecha de nacimiento del estudiante. Al igual que el nombre, este campo es obligatorio.
- correo_electronico: es una cadena de texto que puede tener hasta 100 caracteres y almacenará el correo electrónico del estudiante. Este campo no es obligatorio (puede estar vacío).
Es fundamental definir una clave primaria para cada tabla, ya que asegura que cada registro sea único y facilita la búsqueda de registros.
2.2. Tipos de datos en SQL
En SQL, ya hemos visto que cada columna de una tabla se define con un tipo de datos específico que determina el tipo de información que puede contener.
Elegir el tipo de datos adecuado para cada columna es fundamental para optimizar el almacenamiento, el rendimiento y la integridad de los datos.
A continuación, tienes los principales tipos de datos en SQL y para qué casos está indicado cada uno:
Tipos de datos numéricos
- INT (Entero): para almacenar números enteros. Es útil para datos que no requieren decimales, como el número de identificación o la cantidad de elementos.
- DECIMAL(M, N): para números con decimales donde se controla la precisión. Indicado para valores exactos como precios o medidas. M es el número total de dígitos y N es el número de dígitos después del punto decimal.
- FLOAT y DOUBLE: para números de punto flotante con precisión simple y doble, respectivamente. Son adecuados para cálculos científicos o cuando se requieren grandes rangos de valores.
Tipos de datos de fecha y hora
- DATE: almacena fechas en formato YYYY-MM-DD. Ideal para cumpleaños, fechas de eventos, etc.
- TIME: para horas, minutos y segundos. Útil para almacenar horarios de eventos o duraciones.
- DATETIME: combina fecha y hora en un solo tipo de dato. Indicado para marcas de tiempo precisas, como la fecha y hora de creación de un registro.
Tipos de datos de cadena de caracteres
- VARCHAR(n): para texto de longitud variable con un máximo definido. n representa el número máximo de caracteres. Ideal para nombres, direcciones de correo electrónico, etc.
- CHAR(n): para cadenas de longitud fija. n es la longitud. Adecuado para datos de tamaño constante, como códigos de país o códigos postales.
- TEXT: para cadenas de texto largas, como comentarios o descripciones. No requiere un tamaño máximo.
Tipos de datos lógicos
- BOOLEAN: almacena valores verdadero o falso. Indicado para estados, como activo/inactivo, verdadero/falso.
Consideraciones importantes
- La elección entre VARCHAR y CHAR depende del tamaño fijo o variable de los datos. VARCHAR es más flexible y ahorra espacio para texto de longitud variable.
- Para números decimales, DECIMAL ofrece precisión exacta, mientras que FLOAT y DOUBLE pueden ser más eficientes para cálculos científicos o cuando la precisión absoluta no es crítica.
- La gestión eficiente del espacio y el rendimiento de las consultas son consideraciones clave al elegir los tipos de datos, especialmente para bases de datos grandes.
Por ejemplo:
CREATE TABLE ejemplo (
id INT,
precio DECIMAL(10, 2),
fecha_creacion DATETIME,
nombre VARCHAR(50),
codigo CHAR(5),
descripcion TEXT,
activo BOOLEAN
);2.3. Restricciones a campos en SQL
Las restricciones en SQL son reglas aplicadas a las columnas de una tabla para asegurar la integridad y la calidad de los datos.
Estas reglas ayudan a prevenir la entrada de datos incorrectos o indeseados en la base de datos.
A continuación, exploraremos las principales restricciones que podemos aplicar a una columna en SQL:
NOT NULL
Asegura que una columna no pueda tener un valor nulo (es decir, que no se puede dejar vacía). Indicado para campos obligatorios, como el nombre de un usuario o el identificador único de un registro.
SQL: nombre_columna TIPO_DE_DATO NOT NULL.
/* el campo correo electrónico es obligatorio */ ... correo_electronico VARCHAR(255) NOT NULL, ...
UNIQUE
Garantiza que todos los valores en una columna sean únicos entre sí, evitando duplicados. Útil para datos que deben ser exclusivos, como direcciones de correo electrónico o números de identificación personal.
SQL: nombre_columna TIPO_DE_DATO UNIQUE.
/* el campo correo electrónico es obligatorio y no puede repetirse */ ... correo_electronico VARCHAR(255) UNIQUE NOT NULL, ...
PRIMARY KEY
Combina las restricciones NOT NULL y UNIQUE. Identifica de manera única cada fila en una tabla. Imprescindible para especificar la clave primaria de la tabla, como el ID de un registro.
SQL: nombre_columna TIPO_DE_DATO PRIMARY KEY.
/* el campo DNI es clave primaria */ ... DNI CHAR(9) NOT NULL PRIMARY KEY, ...
FOREIGN KEY
Establece una relación de clave foránea entre la columna actual y la columna de otra tabla, asegurando la integridad referencial entre ambas tablas. Indicado para enlazar tablas relacionadas, como conectar un pedido con el cliente que lo realizó.
SQL: FOREIGN KEY (nombre_columna) REFERENCES tabla_referenciada(nombre_columna_referenciada).
/* el campo cliente_id hace referencia al campo id de la tabla clientes */ ... cliente_id INT, FOREIGN KEY (cliente_id) REFERENCES clientes(idc) ...
CHECK
Asegura que el valor de la columna cumpla una condición específica o un rango de valores. Útil para restricciones de valores, como que la edad de una persona esté entre 0 y 120.
SQL: nombre_columna TIPO_DE_DATO CHECK (condición).
/* el número de max_corredores debe estar entre 10 y 500 */ ... CHECK (max_corredores <= 500 AND max_corredores >= 10), ...
DEFAULT
Asigna un valor predeterminado a la columna si no se especifica un valor durante la inserción de datos. Adecuado para valores por defecto, como establecer el estado de activación de un usuario como verdadero por defecto.
SQL: nombre_columna TIPO_DE_DATO DEFAULT valor_predeterminado.
/* el estado por defecto es activo, y la fecha por defecto es la actual */ ... estado VARCHAR(10) DEFAULT 'activo', fecha_creacion DATE DEFAULT CURRENT_DATE, ...
Veamos otro ejemplo donde entren en funcionamiento todos los tipos de datos y muchas de las restricciones que hemos visto:
CREATE TABLE empleados (
empleado_id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
correo_electronico VARCHAR(255) UNIQUE NOT NULL,
salario DECIMAL(10, 2) CHECK (salario > 0),
fecha_contratacion DATETIME DEFAULT CURRENT_TIMESTAMP,
hora_entrada TIME DEFAULT '09:00:00',
fecha_nacimiento DATE,
esta_activo BOOLEAN DEFAULT TRUE,
nif CHAR(9) UNIQUE NOT NULL,
tipo_contrato VARCHAR(50) DEFAULT 'indefinido',
numero_departamento INT,
FOREIGN KEY (numero_departamento) REFERENCES departamentos(departamento_id),
codigo_empleado CHAR(5) NOT NULL,
peso FLOAT CHECK (peso > 0.0),
altura FLOAT CHECK (altura > 0.0 AND altura < 3.0),
biografia TEXT,
eficiencia_energetica DOUBLE CHECK (eficiencia_energetica >= 0.0 AND eficiencia_energetica <= 100.0)
);Seleccionar y aplicar las restricciones adecuadas es muy importante para mantener la integridad de los datos y el funcionamiento correcto de la base de datos. Estas restricciones ayudan a prevenir errores y aseguran que los datos almacenados cumplan con las reglas establecidas.
Ejercicio 8.3 – Creación de tablas
La biblioteca del instituto necesita digitalizar su sistema de gestión de libros y préstamos. Para ello, se requiere crear una base de datos que incluya dos tablas principales: una para los libros y otra para los préstamos. Los requisitos para cada tabla son los siguientes:
Tabla de Libros (libros):
- Cada libro debe tener un identificador único.
- Debe incluir el título del libro, que no puede estar vacío.
- Debe registrar el autor del libro.
- Debe tener una columna que indique el año de publicación.
- Debe incluir una categoría (por ejemplo, novela, ciencia ficción, historia, etc.), que no puede estar vacía.
Tabla de Préstamos (prestamos):
- Cada préstamo debe tener un identificador único.
- Debe asociarse cada préstamo a un libro mediante el identificador del libro.
- Debe registrar el identificador del usuario al que se le ha prestado el libro.
- Debe incluir las fechas de inicio y fin del préstamo.
- Debe tener una columna que indique si el préstamo está activo o no.
Para cada tabla, determina los tipos de datos más apropiados para sus columnas y aplica las restricciones necesarias para asegurar la integridad de los datos según los requisitos mencionados.
Elabora la instrucción SQL para la creación de cada una de las tablas y prueba a ejecutarlo en tu base de datos entrenamiento.
Entrega: debes entregar un archivo .sql con tu código SQL antes de la fecha límite indicada en classroom.
3. Manipular una tabla
Después de haber aprendido cómo crear tablas en SQL, sus tipos de datos y algunas restricciones a los campos, es la hora de conocer cómo modificar, eliminar y limpiar tablas. Las instrucciones que nos permiten hacer esto son: ALTER, DROP, y TRUNCATE, respectivamente.
3.1. Modificar la estructura
La instrucción ALTER TABLE se utiliza para modificar la estructura de una tabla existente. Puede ser tan versátil como añadir o eliminar columnas, cambiar el tipo de datos de una columna o añadir restricciones a las columnas.
Supongamos que tenemos una tabla llamada empleados y queremos añadir una nueva columna llamada telefono para registrar los números de teléfono de los empleados.
ALTER TABLE empleados ADD telefono VARCHAR(15);
Si más adelante decidimos que cada empleado debe tener registrado su teléfono, podemos modificar la columna para que no acepte valores nulos.
ALTER TABLE empleados MODIFY telefono VARCHAR(15) NOT NULL;
3.2. Eliminar una tabla
La instrucción DROP TABLE se usa para eliminar una tabla y todos sus datos de manera permanente. Una vez que una tabla es eliminada, no se puede recuperar (a menos que se disponga de copias de seguridad).
Si decidimos, por ejemplo, que la tabla empleados_temporales ya no es necesaria en nuestra base de datos, podemos eliminarla con el siguiente comando:
DROP TABLE empleados_temporales;
3.3. Limpiar una tabla
TRUNCATE TABLE se utiliza para eliminar todos los registros de una tabla sin eliminar la tabla en sí. Es una manera rápida de limpiar los datos de una tabla manteniendo su estructura, lo cual es útil durante el desarrollo o para reiniciar datos en tablas de log o registros temporales.
Supongamos que queremos eliminar todos los registros de la tabla log_accesos para empezar a registrar nuevos eventos desde cero.
TRUNCATE TABLE log_accesos;
Estas instrucciones son herramientas muy potentes para el manejo de bases de datos y deben usarse con cuidado, especialmente DROP y TRUNCATE, ya que implican la pérdida de datos.
Ejercicio 8.4 – Manipulación de tablas
La empresa “Bicicletas Rápidas S.A.” necesita gestionar su inventario de bicicletas a través de una base de datos. Para ello, se requiere crear una tabla llamada Inventario que contenga la siguiente información sobre cada bicicleta:
- id: un identificador único autoincremental para cada bicicleta.
- modelo: el nombre del modelo de la bicicleta, no puede estar vacío y debe ser único.
- precio: el precio de venta de la bicicleta, debe ser mayor que 0.
- stock: la cantidad de bicicletas disponibles en el inventario, de forma predeterminada 5 unidades.
- color: el color principal de la bicicleta, no puede estar vacío.
- entrada: la fecha en que la bicicleta fue añadida al inventario, por defecto, la fecha actual. CURRENT_DATE es una macro que almacena la fecha actual.
Crea las instrucciones SQL que te permitan crear la tabla anterior.
Una vez que hayas creado la tabla, diseña cada una de las 5 instrucciones que te permitan realizarle estas modificaciones:
- Añadir un nuevo campo llamado descripcion que permita a los usuarios añadir notas sobre la bicicleta.
- Cambiar el campo precio para permitir valores hasta 9999.99.
- Añadir una restricción para que stock no sea menor que 0.
- Cambiar el campo color para que acepte hasta 30 caracteres.
- Añadir un campo promocionada tipo BOOLEAN que indique si la bicicleta está en promoción o no, con un valor predeterminado de FALSE.
Entrega: debes entregar un archivo .sql con tu código SQL antes de la fecha límite indicada en classroom.