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');