Ejercicios de Base de Datos

Ejercicio 1: Creación de una tabla

Cree una tabla llamada «Clientes» con las siguientes columnas:

ID (entero, clave primaria)

Nombre (cadena de texto)

Correo electrónico (cadena de texto)

Solución 1: SQL

CREATE TABLE Clientes (
ID INT PRIMARY KEY,
Nombre VARCHAR(255),
Email VARCHAR(255)
);

Ejercicio 2: Inserción de datos

Inserte tres registros de ejemplo en la tabla «Clientes».

Solución 2: SQL

INSERT INTO Clientes (Nombre, Email)
VALUES
('Juan Pérez', 'juan@example.com'),
('María López', 'maria@example.com'),
('Carlos Rodríguez', 'carlos@example.com');

Ejercicio 3: Consulta de datos

Realice una consulta para seleccionar todos los clientes cuyo nombre comience con «M».

Solución 3: SQL

SELECT * FROM Clientes WHERE Nombre LIKE 'M%';

Ejercicio 4: Actualización de datos

Actualice el correo electrónico del cliente con ID 2 a «maria@gmail.com».

Solución 4: SQL

UPDATE Clientes SET Email = 'maria@gmail.com' WHERE ID = 2;

Ejercicio 5: Eliminación de datos

Elimine al cliente con ID 3 de la tabla «Clientes».

Solución 5: SQL

DELETE FROM Clientes WHERE ID = 3;

Ejercicio 6: Consulta de múltiples tablas

Cree dos tablas, «Pedidos» y «Productos», y realice una consulta que muestre todos los pedidos con los nombres de los productos correspondientes.

Solución 6: SQL

-- Crear tabla Pedidos
CREATE TABLE Pedidos (
ID INT PRIMARY KEY,
ClienteID INT,
Fecha DATE
);


-- Crear tabla Productos
CREATE TABLE Productos (
ID INT PRIMARY KEY,
Nombre VARCHAR(255),
Precio DECIMAL(10, 2)
);


-- Consulta para mostrar pedidos con nombres de productos
SELECT Pedidos.ID, Clientes.Nombre AS Cliente, Productos.Nombre AS Producto
FROM Pedidos
JOIN Clientes ON Pedidos.ClienteID = Clientes.ID
JOIN DetallePedido ON Pedidos.ID = DetallePedido.PedidoID
JOIN Productos ON DetallePedido.ProductoID = Productos.ID;

Ejercicio 7: Clave foránea

Modifique la tabla «Pedidos» para incluir una clave foránea que haga referencia al cliente que realizó el pedido.

Solución 7: SQL

-- Modificar la tabla Pedidos para agregar una clave foránea
ALTER TABLE Pedidos
ADD FOREIGN KEY (ClienteID) REFERENCES Clientes(ID);

Ejercicio 8: Normalización

Revise la tabla «Productos» y aplique la primera forma normal (1NF) si no está en esa forma.

Solución 8: SQL

— La tabla Productos ya está en 1NF si no hay columnas repetidas

Ejercicio 9: Consulta avanzada

Escriba una consulta que muestre los nombres de los clientes que han realizado más de 3 pedidos.

Solución 9: SQL

SELECT Clientes.Nombre
FROM Clientes
JOIN Pedidos ON Clientes.ID = Pedidos.ClienteID
GROUP BY Clientes.ID, Clientes.Nombre
HAVING COUNT(Pedidos.ID) > 3;

Ejercicio 10: Índices

Cree un índice en la columna «Nombre» de la tabla «Clientes» para acelerar las consultas de búsqueda por nombre.

Solución 10: SQL

-- Crear un índice en la columna Nombre de la tabla Clientes
CREATE INDEX idx_nombre ON Clientes (Nombre);

Ejercicio 11: Consulta con JOIN

Supongamos que tienes dos tablas: «Estudiantes» y «Cursos». Realiza una consulta que muestre los nombres de los estudiantes y los nombres de los cursos a los que están inscritos.

Solución 11: SQL

SELECT Estudiantes.Nombre AS NombreEstudiante, Cursos.Nombre AS NombreCurso
FROM Estudiantes
JOIN Inscripciones ON Estudiantes.ID = Inscripciones.EstudianteID
JOIN Cursos ON Inscripciones.CursoID = Cursos.ID;

Ejercicio 12: Actualización condicional

Modifica la tabla «Productos» para reducir en un 10% los precios de todos los productos que cuesten más de $100.

Solución 12: SQL

UPDATE Productos
SET Precio = Precio * 0.9
WHERE Precio > 100;

Ejercicio 13: Eliminación condicional

Elimina todos los pedidos de la tabla «Pedidos» que tengan más de 30 días de antigüedad.

Solución 13: SQL

DELETE FROM Pedidos
WHERE Fecha < DATE_SUB(NOW(), INTERVAL 30 DAY);

Ejercicio 14: Clave primaria compuesta

Crea una nueva tabla llamada «DetallePedido» que tenga una clave primaria compuesta por dos columnas: «PedidoID» y «ProductoID». Esta tabla debe representar los productos incluidos en cada pedido.

Solución 14: SQL

CREATE TABLE DetallePedido (
PedidoID INT,
ProductoID INT,
PRIMARY KEY (PedidoID, ProductoID)
);

Ejercicio 15: Consulta con agregación

Escribe una consulta que muestre el precio promedio de los productos en la tabla «Productos».

Solución 15: SQL

SELECT AVG(Precio) AS PrecioPromedio
FROM Productos;

Ejercicio 16: Consulta de fechas

Realiza una consulta que muestre todos los pedidos realizados en el mes de julio de 2023.

Solución 16: SQL

SELECT *
FROM Pedidos
WHERE YEAR(Fecha) = 2023 AND MONTH(Fecha) = 7;

Ejercicio 17: Restricción UNIQUE

Añade una restricción UNIQUE a la columna «Correo electrónico» en la tabla «Clientes» para garantizar que no haya correos electrónicos duplicados.

Solución 17: SQL

ALTER TABLE Clientes
ADD CONSTRAINT UC_CorreoElectronico UNIQUE (CorreoElectronico);

Ejercicio 18: Consulta con subconsulta

Escribe una consulta que muestre los nombres de los clientes que han realizado más pedidos que cualquier otro cliente.

Solución 18: SQL

SELECT Nombre
FROM Clientes
WHERE ID = (
SELECT ClienteID
FROM Pedidos
GROUP BY ClienteID
ORDER BY COUNT(ID) DESC
LIMIT 1
);

Ejercicio 19: Transacciones

Simula una transacción en la que un cliente realiza un pedido y se descuenta el precio del producto de su saldo. Asegúrate de que la transacción sea exitosa y que se refleje en las tablas «Pedidos» y «Clientes».

Solución 19: SQL

-- Iniciar una transacción
START TRANSACTION;

-- Realizar el pedido
INSERT INTO Pedidos (ClienteID, Fecha) VALUES (1, NOW());

-- Obtener el precio del producto y el saldo del cliente
SELECT Precio INTO @PrecioProducto FROM Productos WHERE ID = 1;
SELECT Saldo INTO @SaldoCliente FROM Clientes WHERE ID = 1;

-- Verificar que el saldo del cliente sea suficiente
IF @SaldoCliente >= @PrecioProducto THEN
-- Restar el precio del producto al saldo del cliente
UPDATE Clientes SET Saldo = Saldo - @PrecioProducto WHERE ID = 1;

-- Confirmar la transacción
COMMIT;
ELSE
-- Cancelar la transacción
ROLLBACK;
END IF;

Ejercicio 20: Consulta con funciones de fecha

Realiza una consulta que muestre los nombres de los clientes que cumplen años en los próximos 30 días.

Solución 20: SQL

SELECT Nombre
FROM Clientes
WHERE DATE_FORMAT(FechaNacimiento, '%m-%d') BETWEEN DATE_FORMAT(NOW(), '%m-%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 30 DAY), '%m-%d');