Ejercicios para practicar SQL con la base de datos Northwind

Aquí les traigo una guía de ejercicios para practicar el lenguaje SQL con la base de datos de Northwind (una vez que lo hayan resuelto en su navegador, haciendo clic en la consigna se desplegará la respuesta correcta para que puedan comparar). También les dejo la versión más actualizada que encontré en la nube de esta antigua (y excelentísima) base de datos de Microsoft.

(Para quienes quieran aprender SQL desde cero por supuesto siempre recomiendo los videos del gran maestro YouTuber Lucas Dalto)

CONSULTAS EN SQL CON NORTHWIND (si haces click en la consigna, te aparecerá la solución)

  1. Seleccionar los clientes que viven en el país de "USA".
    SELECT * FROM Customers
    WHERE Country = 'USA'
  2. Seleccionar los proveedores que viven en la ciudad de "BERLÍN".
    SELECT * FROM Suppliers
    WHERE City = 'BERLIN'
  3. Seleccionar los empleados con códigos 3, 5 y 8.
    SELECT * FROM Employees
    WHERE EmployeeID in (3,5,8);
  4. Seleccionar los productos que tienen stock mayor que cero y son del proveedor 1, 3 y 5.
    SELECT * FROM Products
    WHERE UnitsInStock > 0 AND SupplierID IN (1,3,5)
  5. Seleccionar los productos con precio mayor o igual a 20 y menor o igual a 90.
    SELECT * FROM Products
    WHERE UnitPrice BETWEEN 20 AND 90;
  6. Mostrar las órdenes de compra entre las fechas 01/01/2017 al 15/07/2017.
    set dateformat dmy
    SELECT * FROM Orders
    WHERE OrderDate BETWEEN '01/01/2017' AND '15/07/2017';
  7. Mostrar las órdenes de compra hechas en el año 2017 que pertenecen a los empleados con códigos 1, 3, 4 y 8.
    set dateformat dmy
    SELECT * FROM Orders
    WHERE (OrderDate BETWEEN '01/01/2017' AND '31/12/2017' )
    AND ( EmployeeID IN (1,3,4,8));
  8. Mostrar las órdenes hechas en el año 2016.
    SELECT * FROM Orders
    WHERE YEAR (OrderDate) = '2016';
  9. Mostrar las órdenes hechas en el año 2017 del mes de abril.
    SELECT * FROM Orders
    WHERE YEAR (OrderDate) = '2017' AND MONTH (OrderDate) = '4';
  10. Mostrar las órdenes hechas el primero de todos los meses del año 2018.
    SELECT * FROM Orders
    WHERE DAY (OrderDate) = '1' AND YEAR (OrderDate) = '2018';
  11. Mostrar todos los clientes que no tienen fax.
    SELECT * FROM Customers
    WHERE Fax IS NULL;
  12. Mostrar todos los clientes que tienen fax.
    SELECT * FROM Customers
    WHERE Fax IS NOT NULL;
  13. Mostrar el nombre del producto, el precio, el stock y el nombre de la categoría a la que pertenece.
    SELECT ProductName, UnitPrice, UnitsInStock, CategoryName
    FROM Products
    INNER JOIN Categories
    ON Categories.CategoryID = Products.CategoryID;
  14. Mostrar el nombre del producto, el precio, el código del proveedor y el nombre de la compañía proveedora.
    SELECT ProductName, UnitPrice, P.SupplierID, CompanyName
    FROM Products AS P
    INNER JOIN Suppliers AS S
    ON S.SupplierID = P.SupplierID;
  15. Mostrar el número de orden, el código del producto, el precio, la cantidad y el total pagado por producto.
    SELECT OrderID, ProductID, UnitPrice, Quantity, (UnitPrice*Quantity) AS TOTAL
    FROM [Order Details];
  16. Mostrar el número de la orden, fecha, código del producto, precio, código del empleado y su nombre completo.
    SELECT O.OrderID, OrderDate, ProductID, UnitPrice, O.EmployeeID, (lastname+' '+FirstName)
    FROM Orders AS O
    INNER JOIN [Order Details] AS D
    ON O.OrderID=D.OrderID
    INNER JOIN Employees AS E
    ON E.EmployeeID=O.EmployeeID;
  17. Mostrar los 10 productos con menor stock.
    SELECT TOP 10 *
    FROM Products
    ORDER BY UnitsInStock;
  18. Mostrar los 10 productos con mayor stock.
    SELECT TOP 10 *
    FROM Products
    ORDER BY UnitsInStock Desc;
  19. Mostrar los 10 productos con mayor precio.
    SELECT TOP 10 *
    FROM Products
    ORDER BY UnitPrice Desc;
  20. Mostrar los 10 productos más baratos.
    SELECT TOP 10 *
    FROM Products
    ORDER BY UnitPrice;
  21. Seleccionar todos los campos de la tabla clientes, ordenar por compañía.
    SELECT * FROM Customers
    ORDER BY CompanyName;
  22. Seleccionar todos los campos de clientes, cuya compañía empiece con la letra B y pertenezcan a UK. Ordenar por nombre de la compañía.
    SELECT * FROM Customers
    WHERE CompanyName LIKE 'B%' AND Country ='UK'
    ORDER BY CompanyName;
  23. Seleccionar todos los campos de productos de las categorías 1, 3 y 5. Ordenar por categoría.
    SELECT * FROM Products WHERE CategoryID IN (1,3,5)
    ORDER BY CategoryID;
  24. Seleccionar los productos cuyos precios unitarios están entre 50 y 200.
    SELECT * FROM Products
    WHERE UnitPrice BETWEEN 50 AND 200;
  25. Visualizar el nombre y el id de la compañía del cliente, fecha, precio unitario y producto de la orden.
    SELECT CompanyName, O.CustomerID, O.OrderDate, OD.UnitPrice, P.ProductName
    FROM Customers AS C
    INNER JOIN Orders AS O
    ON C.CustomerID = O.CustomerID
    INNER JOIN [Order Details] AS OD
    ON O.OrderID = OD.OrderID
    INNER JOIN Products AS P
    ON P.ProductID = OD.ProductID;
  26. Visualizar el nombre de la categoría y el número de productos que hay por cada categoría.
    SELECT CategoryName, COUNT(*) AS 'TOTAL RODUCTOS'
    FROM Categories AS C
    INNER JOIN Products AS P
    ON C.CategoryID = P.CategoryID
    GROUP BY CategoryName;
  27. Seleccionar los 5 productos más vendidos.
    SELECT TOP 5 ProductName, SUM(Quantity)
    FROM [Order Details] AS D
    INNER JOIN Products AS P
    ON D.ProductID=P.ProductID
    GROUP BY ProductName
    ORDER BY SUM(Quantity);
  28. Seleccionar los jefes de los empleados.
    SELECT ReportsTo, LastName || ' ' || FirstName AS NOMBRE
    FROM Employees
    WHERE ReportsTo IS NOT NULL;
  29. Obtener todos los productos cuyo nombre comienza con M y tienen un precio comprendido entre 28 y 129.
    SELECT * FROM Products
    WHERE ProductName LIKE 'M%' AND UnitPrice BETWEEN 28 AND 129;
  30. Obtener todos los clientes del país de USA, Francia y UK.
    SELECT * FROM Customers
    WHERE Country IN ('USA', 'France', 'UK');
  31. Obtener todos los productos descontinuados o con stock cero.
    SELECT * FROM Products
    WHERE Discontinued = 1 OR UnitsInStock = 0;
  32. Obtener todas las órdenes hechas por el empleado King Robert.
    SELECT O.OrderID, O.EmployeeID, lastname || ' ' || FirstName AS EmployeeFullName
    FROM Orders AS O
    INNER JOIN Employees AS E
    ON O.EmployeeID = E.EmployeeID WHERE (E.lastname || ' ' || E.FirstName) = 'King Robert';
  33. Obtener todas las órdenes por el cliente cuya compañía es "Que delicia".
    SELECT O.OrderID, O.CustomerID, CompanyName
    FROM Orders AS O
    INNER JOIN Customers AS C
    ON O.CustomerID = C.CustomerID WHERE O.CustomerID = 'QUEDE';
  34. Obtener todas las órdenes hechas por el empleado King Robert, Davolio Nancy y Fuller Andrew.
    SELECT O.OrderID, O.EmployeeID, (lastname || ' ' || FirstName) AS EmployeeFullName
    FROM Orders AS O
    INNER JOIN Employees AS E
    ON O.EmployeeID = E.EmployeeID
    WHERE (E.lastname || ' ' || E.FirstName) IN ('King Robert', 'Davolio Nancy', 'Fuller Andrew');
  35. Obtener todos los productos (código, nombre, precio, stock) de la orden 10257.
    SELECT OD.ProductID, P.ProductName, P.UnitPrice, P.UnitsInStock
    FROM Products AS P
    JOIN 'Order Details' AS OD
    ON OD.ProductID = P.ProductID
    WHERE OD.OrderID = 10257;

  36. Obtener todos los productos (código, nombre, precio, stock) de las órdenes hechas desde 2017 hasta la fecha de hoy.
    SELECT OD.ProductID, P.ProductName, P.UnitPrice, P.UnitsInStock, O.OrderDate
    FROM Products AS P
    JOIN 'Order Details' AS OD
    ON OD.ProductID = P.ProductID
    JOIN ORDERS AS O
    ON OD.OrderID = O.OrderID
    WHERE O.OrderDate > '2017-01-01';
  37. Calcular los 15 productos más caros.
    SELECT TOP 15 *
    FROM Products
    ORDER BY UnitPrice Desc;
  38. Calcular los 5 productos más baratos.
    SELECT TOP 5 *
    FROM Products
    ORDER BY UnitPrice;
  39. Obtener el nombre de todas las categorías y los nombres de sus productos, precio y stock.
    SELECT CategoryName, ProductName, UnitPrice, UnitsInStock
    FROM Categories AS C
    INNER JOIN Products AS P
    ON C.CategoryID = P.CategoryID;
  40. Calcular el stock de productos por cada categoría, sin contabilizar los productos que cuyo nombre comience con la letra P.
    SELECT C.CategoryName, SUM(P.UnitsInStock) AS StockByCategory
    FROM Categories AS C
    JOIN Products AS P
    ON C.CategoryID = P.CategoryID
    WHERE P.ProductName NOT LIKE 'p%'
    GROUP BY C.CategoryName
    ORDER BY C.CategoryName;
  41. Obtener el nombre del cliente, nombre del proveedor, nombre del empleado y el nombre de los productos que están en la orden 10794.
    SELECT O.OrderID, C.CompanyName, S.CompanyName, E.FirstName, P.ProductName
    FROM Customers AS C
    INNER JOIN Orders AS O
    ON C.CustomerID = O.CustomerID
    INNER JOIN Employees AS E
    ON O.EmployeeID = E.EmployeeID
    INNER JOIN [Order Details] AS OD
    ON O.OrderID = OD.OrderID
    INNER JOIN Products AS P
    ON P.ProductID = OD.ProductID
    INNER JOIN Suppliers AS S
    ON S.SupplierID = P.SupplierID
    WHERE O.OrderID = 10794;
  42. Mostrar el número de órdenes de cada uno de los clientes por año, luego ordenar código del cliente y el año.
    SELECT CustomerID,YEAR (OrderDate), COUNT(*)
    FROM Orders
    GROUP BY CustomerID, YEAR (OrderDate)
    ORDER BY CustomerID, YEAR (OrderDate);
  43. Contar el número de órdenes que se han realizado por años y meses, luego debe ser ordenado por año y por mes.
    SELECT YEAR (OrderDate), COUNT(*)
    FROM Orders
    GROUP BY YEAR (OrderDate), MOUNTH (OrderDate)
    ORDER BY YEAR (OrderDate), MOUNTH (OrderDate);
  44. Seleccionar el nombre de la compañía del cliente, el código de la orden de compra, la fecha de la orden de compra, código del producto, cantidad pedida del producto, nombre del producto, el nombre de la compañía proveedora y la ciudad del proveedor, usar Join.
    SELECT C.CompanyName, O.OrderID, O.OrderDate, P.ProductID, Quantity, P.ProductName, S.CompanyName, S.City
    FROM Customers AS C
    INNER JOIN Orders AS O
    ON C.CustomerID = O.CustomerID
    INNER JOIN [Order Details] AS OD
    ON O.OrderID = OD.OrderID
    INNER JOIN Products AS P
    ON OD.ProductID = P.ProductID
    INNER JOIN Suppliers AS S
    ON S.SupplierID = P.SupplierID;
  45. Seleccionar el nombre de la compañía del cliente, nombre del contacto, el código de la orden de compra, la fecha de la orden de compra, el código del producto, cantidad pedida del producto, nombre del producto y el nombre de la compañía proveedora, usar JOIN. Solamente las compañías proveedoras que comienzan con la letra de la A hasta la letra G, además la cantidad pedida del producto debe estar entre 23 y 187.
    SELECT C.CompanyName, C.ContactName, O.OrderID, O.OrderDate, OD.ProductID, Quantity, P.ProductName, S.CompanyName
    FROM Customers AS C
    INNER JOIN Orders AS O
    ON C.CustomerID = O.CustomerID
    INNER JOIN [Order Details] AS OD
    ON OD.OrderID = O.OrderID
    INNER JOIN Products AS P
    ON P.ProductID = OD.ProductID
    INNER JOIN Suppliers AS S
    ON S.SupplierID = P.SupplierID WHERE S.CompanyName LIKE '[A-G]%' AND Quantity BETWEEN 23 AND 187;

Comentarios