Revisión Evaluación 02
1 Evaluación 02-A
Responde las siguientes preguntas seleccionando la opción correcta.
La respuesta debe quedar marcada con una X, ejemplo “xa)”, las que no cumplan se contara la mitad del puntaje
¿Cuál de las siguientes opciones representa una unión interna en SQL?
- SELECT * FROM A LEFT JOIN B ON A.id = B.id;
- SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
- SELECT * FROM A INNER JOIN B ON A.id = B.id;
- SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id;
¿Cuál de los siguientes operadores se utiliza para realizar una conversión explícita de tipos en Oracle?
- CONVERT
- CAST
- TO_DATE
- FORMAT
¿Qué función matemática se utiliza para calcular el promedio en SQL?
- SUM
- AVG
- MAX
- MIN
¿Cuál de las siguientes estructuras de control se utiliza para evaluar múltiples condiciones en SQL?
- IF
- WHILE
- CASE
- FOR
¿Qué tipo de JOIN devuelve todas las filas de la tabla izquierda y solo las filas coincidentes de la tabla derecha?
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
¿Cuál es la salida de la siguiente subconsulta si la tabla Productos tiene los valores [1, 2, 3] en la columna Precio?
SELECT Precio FROM Productos WHERE Precio > (SELECT AVG(Precio) FROM Productos);
- 2, 3
- 3
- 1, 2
- 1, 3
¿Cuál de los siguientes operadores se utiliza para verificar si un valor es igual a cualquiera de los valores en un conjunto?
- IN
- BETWEEN
- ALL
- ANY
¿Qué función de conversión se utiliza en SQL Server para convertir un valor a un tipo de datos específico?
- CAST
- CONVERT
- FORMAT
- TO_NUMBER
¿Cuál es la estructura correcta de un procedimiento almacenado en Oracle?
- CREATE PROCEDURE nombre AS …
- CREATE PROCEDURE nombre BEGIN …
- CREATE PROCEDURE nombre IS …
- CREATE PROCEDURE nombre FUNCTION …
¿Qué función se utiliza para devolver el número más pequeño de un conjunto de valores?
- MAX
- SUM
- MIN
- COUNT
1.1 Sección 2: Desarrollo en Base de Datos
script sql-server
-- Crear tabla Clientes
CREATE TABLE Clientes (
INT IDENTITY(1,1) PRIMARY KEY,
ClienteID NVARCHAR(50),
Nombre NVARCHAR(50),
Apellido NVARCHAR(100),
Email NVARCHAR(20),
Telefono DATE
FechaRegistro
);-- Crear tabla Productos
CREATE TABLE Productos (
INT IDENTITY(1,1) PRIMARY KEY,
ProductoID NVARCHAR(100),
NombreProducto NVARCHAR(50),
Categoria DECIMAL(10, 2),
Precio INT
Stock
);-- Crear tabla Ventas
CREATE TABLE Ventas (
INT IDENTITY(1,1) PRIMARY KEY,
VentaID DATE,
FechaVenta INT,
ClienteID DECIMAL(10, 2),
TotalVenta FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID)
);-- Crear tabla DetallesVentas
CREATE TABLE DetallesVentas (
INT IDENTITY(1,1) PRIMARY KEY,
DetalleID INT,
VentaID INT,
ProductoID INT,
Cantidad DECIMAL(10, 2),
TotalLinea FOREIGN KEY (VentaID) REFERENCES Ventas(VentaID),
FOREIGN KEY (ProductoID) REFERENCES Productos(ProductoID)
);-- Insertar datos ficticios en la tabla Clientes
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Juan',
'Pérez', 'juan.perez@example.com', '123456789', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Ana',
'López', 'ana.lopez@example.com', '987654321', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Carlos',
'Ramírez', 'carlos.ramirez@example.com', '555111222', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('María',
'Fernández', 'maria.fernandez@example.com', '666333444', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Elena',
'Martínez', 'elena.martinez@example.com', '777888999', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Luis',
'González', 'luis.gonzalez@example.com', '444555666', GETDATE());
-- Insertar datos ficticios en la tabla Productos
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Laptop',
'Electrónica', 1500, 10);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Smartphone',
'Electrónica', 1000, 5);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Lavadora',
'Electrodomésticos', 800, 4);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Refrigerador',
'Electrodomésticos', 1200, 3);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Sofá',
'Muebles', 600, 7);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Mesa de
comedor', 'Muebles', 300, 6);
-- Insertar datos ficticios en la tabla Ventas
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 1, 1500);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 2, 1000);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 3, 2400);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 4, 1800);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 5, 600);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 6, 300);
-- Insertar datos ficticios en la tabla DetallesVentas
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (1, 1, 1,
1500);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (2, 2, 1,
1000);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (3, 3, 1,
800);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (3, 4, 1,
1200);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (4, 5, 2,
1200);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (5, 6, 2,
600);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (6, 1, 1,
300);
Ejercicio 1
Procedimiento Almacenado para Insertar Productos
Crea un procedimiento almacenado llamado sp_InsertarProducto que reciba el nombre del producto, la categoría y el precio. Este procedimiento debe insertar el producto en la tabla Productos y devolver un mensaje indicando que el producto ha sido insertado correctamente.
Solución
CREATE PROCEDURE sp_InsertarProducto
NVARCHAR(100),
@NombreProducto NVARCHAR(50),
@Categoria DECIMAL(10, 2),
@Precio INT
@Stock AS
BEGIN
-- Inserta el nuevo producto en la tabla Productos
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock)
VALUES (@NombreProducto, @Categoria, @Precio, @Stock);
-- Muestra un mensaje de confirmación
'El producto ha sido insertado correctamente.';
PRINT END;
Ejercicio 02
Consulta 1
Muestra el nombre del cliente, la fecha de la venta, el nombre del producto, la cantidad vendida y el total de la línea de la venta. Ordena el resultado por nombre del cliente y fecha de la venta. Si un cliente no ha realizado ninguna venta, muestra igualmente su nombre y un valor nulo en las columnas relacionadas con las ventas.
Solución
SELECT c.Nombre AS NombreCliente, v.FechaVenta, p.NombreProducto, dv.Cantidad, dv.TotalLinea
FROM Clientes c
LEFT JOIN Ventas v ON c.ClienteID = v.ClienteID
LEFT JOIN DetallesVentas dv ON v.VentaID = dv.VentaID
LEFT JOIN Productos p ON dv.ProductoID = p.ProductoID
ORDER BY c.Nombre, v.FechaVenta;
Consulta 2
Muestra el nombre del cliente, el total de ventas que ha realizado y el número de productos distintos que ha comprado. Incluye solo a los clientes que han comprado al menos 3 productos diferentes.
Solución
SELECT
AS NombreCliente,
c.Nombre SUM(v.TotalVenta) AS TotalVentas,
COUNT(DISTINCT dv.ProductoID) AS ProductosDistintos
FROM Clientes c
JOIN Ventas v ON c.ClienteID = v.ClienteID
JOIN DetallesVentas dv ON v.VentaID = dv.VentaID
GROUP BY c.Nombre
HAVING COUNT(DISTINCT dv.ProductoID) >= 3;
Consulta 3
Muestra el nombre del producto, la cantidad total vendida y el total de ventas para cada producto. Solo incluye productos que se hayan vendido en más de 5 transacciones diferentes. Ordena los resultados por cantidad total vendida en orden descendente.
Solución
SELECT
p.NombreProducto, SUM(dv.Cantidad) AS CantidadTotalVendida,
SUM(dv.TotalLinea) AS TotalVentas
FROM DetallesVentas dv
JOIN Productos p ON dv.ProductoID = p.ProductoID
GROUP BY p.NombreProducto
HAVING COUNT(DISTINCT dv.VentaID) > 5
ORDER BY CantidadTotalVendida DESC;
Ejercicio 03: Subconsultas
Subconsulta 1
Encuentra todos los productos cuyo precio es superior al precio promedio de todos los productos.
Solución
SELECT NombreProducto, Precio
FROM Productos
WHERE Precio > (SELECT AVG(Precio) FROM Productos);
Subconsulta 2
Encuentra todos los clientes que han realizado ventas superiores al total de ventas realizadas por el cliente con ClienteID = 2.
Solución
SELECT c.Nombre, SUM(v.TotalVenta) AS TotalVentas
FROM Clientes c
JOIN Ventas v ON c.ClienteID = v.ClienteID
GROUP BY c.ClienteID, c.Nombre
HAVING SUM(v.TotalVenta) > (
SELECT SUM(TotalVenta)
FROM Ventas
WHERE ClienteID = 2
);
2 Evaluación 02-B
2.1 Sección 1: Selección Múltiple
¿Qué tipo de JOIN en SQL Devuelve todas las filas de la tabla derecha y solo las filas coincidentes de la tabla izquierda?
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTTER JOIN
¿Cuál de las siguientes funciones en SQL devuelve el número de filas en una tabla?
- SUM
- COUNT
- AVG
- MIN
¿Qué operador se utiliza para realizar una conversión explícita de tipos de datos en SQL Server?
- CAST
- CONVERT
- FORMAT
- TO_CHAR
¿Cuál de las siguientes estructuras de control se utiliza para evaluar múltiples condiciones en SQL?
- IF
- CASE
- WHILE
- FOR
¿Qué tipo de JOIN incluye todas las filas en ambas tablas, incluso si no tienen coincidencias?
- LEFT JOIN
- INNER JOIN
- RIGHT JOIN
- FULL OUTER JOIN
¿Cuál de las siguientes funciones matemáticas devuelve el valor máximo de un conjunto de datos?
- MIN
- AVG
- MAX
- SUM
¿Cual es la función en SQL que se utilizar para convertir una fecha a una cadena de caracteres?
- CONVERT
- CAST
- TO_DATE
- FORMAT
¿Qué función en SQL devuelve la suma total de una columna?
- SUM
- COUNT
- MAX
- AVG
¿Qué estructura en SQL se utiliza para evaluar condiciones y devolver diferentes valores?
- CASE
- IF
- ELSE
- FOR
¿Qué tipo de JOIN devuelve solo las filas coincidentes de ambas tablas?
- LEFT JOIN
- RIGHT JOIN
- INNER JOIN
- FULL OUTER JOIN
2.2 Sección 2: Desarrollo en Base de Datos
script sql-server
-- Crear tabla Clientes
CREATE TABLE Clientes (
INT IDENTITY(1,1) PRIMARY KEY,
ClienteID NVARCHAR(50),
Nombre NVARCHAR(50),
Apellido NVARCHAR(100),
Email NVARCHAR(20),
Telefono DATE
FechaRegistro
);-- Crear tabla Productos
CREATE TABLE Productos (
INT IDENTITY(1,1) PRIMARY KEY,
ProductoID NVARCHAR(100),
NombreProducto NVARCHAR(50),
Categoria DECIMAL(10, 2),
Precio INT
Stock
);-- Crear tabla Ventas
CREATE TABLE Ventas (
INT IDENTITY(1,1) PRIMARY KEY,
VentaID DATE,
FechaVenta INT,
ClienteID DECIMAL(10, 2),
TotalVenta FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID)
);-- Crear tabla DetallesVentas
CREATE TABLE DetallesVentas (
INT IDENTITY(1,1) PRIMARY KEY,
DetalleID INT,
VentaID INT,
ProductoID INT,
Cantidad DECIMAL(10, 2),
TotalLinea FOREIGN KEY (VentaID) REFERENCES Ventas(VentaID),
FOREIGN KEY (ProductoID) REFERENCES Productos(ProductoID)
);-- Insertar datos ficticios en la tabla Clientes
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Juan',
'Pérez', 'juan.perez@example.com', '123456789', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Ana',
'López', 'ana.lopez@example.com', '987654321', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Carlos',
'Ramírez', 'carlos.ramirez@example.com', '555111222', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('María',
'Fernández', 'maria.fernandez@example.com', '666333444', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Elena',
'Martínez', 'elena.martinez@example.com', '777888999', GETDATE());
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono, FechaRegistro) VALUES ('Luis',
'González', 'luis.gonzalez@example.com', '444555666', GETDATE());
-- Insertar datos ficticios en la tabla Productos
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Laptop',
'Electrónica', 1500, 10);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Smartphone',
'Electrónica', 1000, 5);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Lavadora',
'Electrodomésticos', 800, 4);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Refrigerador',
'Electrodomésticos', 1200, 3);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Sofá',
'Muebles', 600, 7);
INSERT INTO Productos (NombreProducto, Categoria, Precio, Stock) VALUES ('Mesa de
comedor', 'Muebles', 300, 6);
-- Insertar datos ficticios en la tabla Ventas
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 1, 1500);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 2, 1000);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 3, 2400);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 4, 1800);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 5, 600);
INSERT INTO Ventas (FechaVenta, ClienteID, TotalVenta) VALUES (GETDATE(), 6, 300);
-- Insertar datos ficticios en la tabla DetallesVentas
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (1, 1, 1,
1500);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (2, 2, 1,
1000);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (3, 3, 1,
800);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (3, 4, 1,
1200);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (4, 5, 2,
1200);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (5, 6, 2,
600);
INSERT INTO DetallesVentas (VentaID, ProductoID, Cantidad, TotalLinea) VALUES (6, 1, 1,
300);
Ejercicio 01
Procedimiento Almacenado para Actualizar Productos
Crea un procedimiento almacenado llamado sp_ActualizarProducto
que reciba el ID del producto y el nuevo precio, y actualice el precio del producto en la tabla Productos. El procedimiento debe devolver un mensaje que indique si el producto fue actualizado correctamente.
Solución
CREATE PROCEDURE sp_ActualizarProducto
@ProductoID INT,
@Precio DECIMAL(10,2)
AS
BEGIN
UPDATE Productos
SET Precio = @Precio
WHERE ProductoID = @ProductoID
'El producto fue actualizado correctamente'
PRINT END;
Ejercicio 02
Consultas Complejas con JOINs
Consulta 1
Muestra el nombre del cliente, la cantidad total de productos comprados y el total de ventas para aquellos clientes que han realizado más de dos transacciones.
Solución
SELECT
c.Nombre,SUM(dv.Cantidad) AS CantTotalVendida,
SUM(v.TotalVenta) AS TotalVentas
FROM Clientes c
JOIN Ventas v ON c.ClienteID = v.ClienteID
JOIN DetallesVentas dv ON v.VentaID = dv.VentaID
GROUP BY c.Nombre
HAVING COUNT(v.VentaID) > 2;
Consulta 2
Muestra el nombre del producto, la cantidad total vendida, y el promedio de ventas por producto. Incluye solo productos que han sido vendidos en más de 3 transacciones.
Solución
SELECT
p.NombreProducto,SUM(dv.Cantidad) AS CantTotalVendida,
AVG(v.TotalVenta) AS PromedioVentas
FROM Productos p
JOIN DetallesVentas dv ON p.ProductoID = dv.ProductoID
JOIN Ventas v ON dv.VentaID = v.VentaID
GROUP BY p.NombreProducto
HAVING COUNT(v.VentaID) > 3;
Ejercicio 03
Subconsultas Complejas
Subconsultas 1
Encuentra el nombre del cliente que ha realizado la venta con el mayor total de venta.
Solución
SELECT c.Nombre, c.Apellido
FROM Clientes c
JOIN Ventas v ON c.ClienteID = v.ClienteID
WHERE v.TotalVenta = (SELECT MAX(TotalVenta) FROM Ventas);
Subconsulta 2
Encuentra el nombre de los productos que tienen un precio mayor que el promedio del precio de todos los productos en la misma categoría.
Solución
SELECT p.NombreProducto, p.Precio, p.Categoria
FROM Productos p
WHERE p.Precio > (
SELECT AVG(Precio)
FROM Productos
WHERE Categoria = p.Categoria);