Volver a la lista de artículos Artículos
Lectura de 13 minutos

SQL para el análisis de datos: 15 ejercicios prácticos con soluciones

¿Es usted nuevo en el mundo de SQL y está ansioso por descubrir el poder del análisis de datos? En este artículo, mejoraremos nuestros conocimientos de SQL mediante 15 ejercicios prácticos diseñados específicamente para principiantes. Porque cuando se trata de SQL, ¡la práctica hace al maestro!

Vamos a centrarnos en el dominio crítico del análisis de datos, donde SQL ocupa un lugar central. SQL, o lenguaje de consulta estructurado, desempeña un papel fundamental en el análisis de datos. Proporciona un marco sólido para consultar, transformar y extraer información valiosa de las bases de datos. Si desea profundizar en el mundo de SQL y convertirse en un maestro del análisis de datos, puede explorar información y recursos adicionales en nuestro artículo Aprenda SQL para el análisis de datos.

Lo que no vamos a hacer es aburrirte con teoría. En cambio, creemos firmemente en el poder del aprendizaje a través de la experiencia práctica. Por eso hemos preparado una colección de 15 ejercicios SQL para principiantes que le sumergirán en el arte del análisis de datos, todo ello utilizando un conjunto de datos reales de una tienda.

Estos ejercicios se han extraído de nuestro completo curso, Basic Ejercicio de SQL: A Store, que ofrece un total de 169 ejercicios interactivos en línea. Los ejercicios del artículo están agrupados en diferentes temas: consultas de tabla única, consultas JOIN, consultas ORDER BY, ejercicios GROUP BY y otras características. Si disfruta con estos ejercicios, sin duda querrá explorar el curso para disfrutar de una experiencia de aprendizaje más amplia.

Ahora, ¡prepárese para arremangarse y sumergirse por completo en el reino del análisis de datos potenciado por SQL!

Visión general de la base de datos de la tienda

La base de datos de la tienda consta de seis tablas, cada una con un propósito único y estructurada para funciones específicas. Estas tablas son fundamentales para los ejercicios de SQL que nos ocupan, por lo que es importante conocer a fondo sus componentes. A continuación, veremos una breve descripción de cada tabla.

SQL para el análisis de datos
  • employee: Contiene detalles del empleado como ID, nombre, fecha de nacimiento, dirección, ciudad, país y supervisor inmediato.
  • customer: Almacena información sobre los clientes, como su ID, nombre, empresa, correo electrónico, dirección, ciudad y país.
  • purchase: Registra detalles del pedido, incluyendo ID del pedido, ID del cliente (quién realizó el pedido), empleado (quién atendió el pedido), precio total, y detalles de compra y envío.
  • purchase_item: Conecta las compras con los productos mediante ID, producto, precio unitario y cantidad.
  • category: Proporciona información sobre las categorías de productos mediante el ID de categoría, el nombre, la descripción y el ID de categoría principal.
  • product: Enumera los productos de la tienda e incluye el ID del producto, el nombre del producto, el ID de la categoría, la cantidad por unidad, el precio unitario, las unidades en stock y el estado del producto.

Ahora que conocemos mejor las tablas de la base de datos de la tienda, vamos a realizar algunos ejercicios SQL que le ayudarán a perfeccionar sus habilidades de análisis de datos.

Ejercicios SQL de Análisis de Datos

Dado que la práctica es esencial para desarrollar y perfeccionar sus habilidades SQL, estos ejercicios le servirán como herramientas valiosas. Incluso hemos creado una hoja de trucos de SQL para el análisis de datos para facilitarle las cosas. Es posible que desee tenerla a mano en su viaje a través de los siguientes 15 ejercicios de SQL.

Consultas de una sola tabla

En esta sección, vamos a centrarnos en las consultas SQL que implican una única tabla. Estos ejercicios le ayudarán a dominar el arte fundamental de recuperar, filtrar y trabajar con datos dentro de un único conjunto de datos.

Ejercicio 1: Todos los Productos

Ejercicio: Mostrar todos los datos presentes en la tabla product tabla.

Solución:

SELECT *
FROM product;

Explicación de la solución: Esta sencilla consulta recupera todos los datos de la product tabla. El asterisco (*) se utiliza para indicar que queremos seleccionar todas las columnas disponibles de la tabla, es decir, obtener todos los datos. Después de la palabra clave FROM, damos el nombre de la tabla de la que estamos seleccionando (aquí, la tabla product).

Ejercicio 2: Productos con precio unitario superior a 3,5

Ejercicio: Mostrar los nombres de los productos con un precio unitario mayor o igual a 3.5.

Solución:

Explicación de la solución: Usando la cláusula WHERE, filtramos por product_names con un precio unitario mayor o igual a 3.5. La cláusula WHERE restringe las filas devueltas por la consulta a sólo aquellas que cumplan los criterios especificados.

Ejercicio 3: Productos con Condiciones Específicas de Categoría y Precio

Ejercicio: Mostrar los datos de todos los productos de las categorías con un ID de 1 (Alimentos) o 5 (Frutas y Verduras) y con un precio unitario superior a 3,5.

Solución:

SELECT *
FROM product
WHERE (category_id = 1 OR category_id = 5)
  AND unit_price > 3.5;

Explicación de la solución: Esta consulta utiliza los operadores AND y OR para crear condiciones complejas que filtran los productos en función de la categoría y unit_price.

El operador OR permite productos de la categoría 1 (Alimentos) o de la categoría 5 (Frutas y Verduras), mientras que el operador AND garantiza que los productos seleccionados deben tener un precio unitario superior a 3,5. El uso de corchetes mejora la legibilidad de la consulta.

Consultas JOIN

Las uniones son un concepto fundamental en SQL. Son cruciales para el análisis de datos, ya que permiten combinar y analizar datos de distintas fuentes, lo que permite obtener una visión completa de los conjuntos de datos. Para más ejercicios de práctica que involucren joins, consulte nuestro artículo SQL Joins: 12 Preguntas de Práctica con Respuestas Detalladas.

Ejercicio 4: Productos y Categorías

Ejercicio: Seleccione nombres de productos junto con sus categorías. Muestre dos columnas: product_name y category_name.

Solución:

SELECT
  product_name,
  category.name AS category_name
FROM product
JOIN category
  ON product.category_id = category.category_id;

Explicación de la solución: En este ejercicio, un INNER JOIN combina los datos de las columnas product y category tablas. Un INNER JOIN selecciona sólo las filas que tienen valores coincidentes en ambas tablas. Esto garantiza que sólo se recuperen los productos con las categorías correspondientes, creando un resultado significativo y preciso.

La parte ON de la consulta define la relación entre las dos tablas. Además, el uso de alias (AS category_name) nos permite renombrar las columnas según lo requiera la pregunta.

Ejercicio 5: Compras y Productos

Ejercicio: Para cada compra, muestre el ID de compra, el nombre del producto, el precio unitario en el momento de la compra y la cantidad de artículos de cada producto.

Solución:

SELECT
  purchase_id,
  product_name,
  purchase_item.unit_price,
  quantity
FROM purchase_item
JOIN product
  ON purchase_item.product_id = product.product_id;

Explicación de la solución: Esta consulta combina datos de las bases de datos purchase_item y product lo que nos permite mostrar información relevante sobre las compras. En SQL, INNER JOIN y JOIN a menudo se utilizan indistintamente, pero sirven para el mismo propósito: recuperar filas coincidentes de ambas tablas.

Ejercicio 6. Compras y categorías Compras y Categorías

Ejercicio: Para cada compra, muestre todas las categorías de productos comprados en esta compra. Muestre cada categoría sólo una vez por cada compra.

Solución:

SELECT DISTINCT
  purchase_id,
  category.name AS category_name
FROM purchase_item
JOIN product
  ON purchase_item.product_id = product.product_id
JOIN category
  ON product.category_id = category.category_id;

Explicación de la solución: En este ejercicio, estamos uniendo tres tablas: purchase_item, producty category. La unión de más de dos tablas se logra conectando secuencialmente cada tabla a través de sus columnas relacionadas. Si desea obtener más información sobre la unión de varias tablas, lea Cómo unir 3 tablas (o más) en SQL.

El uso de la palabra clave DISTINCT aquí asegura que cada categoría de producto aparezca sólo una vez para cada compra, proporcionando una lista clara y concisa de categorías asociadas con cada compra. Esto puede ser especialmente útil cuando se desea evitar información redundante en el conjunto de resultados.

Consultas ORDER BY

La ordenación de datos es un paso crucial en el análisis de datos porque permite organizar la información de forma estructurada y significativa. Los siguientes ejercicios le enseñarán cómo ordenar los datos de forma significativa para la elaboración de informes y análisis.

Ejercicio 7: Categorías Ordenadas

Ejercicio: Muestre los datos de todas las categorías. Ordene las categorías por nombre en orden ascendente (A a Z).

Solución:

SELECT *
FROM category
ORDER BY name ASC;

Explicación de la solución: En este ejercicio, utilizamos la cláusula ORDER BY para ordenar los resultados de la category tabla en orden ascendente basado en la columna name. Esta ordenación permite ver las categorías en orden alfabético. La palabra clave ASC es opcional aquí; representa el orden de clasificación por defecto, que es ascendente.

Ejercicio 8: Empleados Ordenados por Fecha de Nacimiento

Ejercicio: Mostrar los apellidos, nombres y fechas de nacimiento de los empleados. Ordene los resultados por la edad del empleado en orden ascendente(Sugerencia: Utilice la columnabirth_date ).

Solución:

SELECT
  last_name,
  first_name,
  birth_date
FROM employee
ORDER BY birth_date DESC;

Explicación de la solución: Como no hay columna de edad en nuestra tabla, ordenamos los empleados por birth_date en orden descendente utilizando la palabra clave DESC. Ordenar por birth_date en orden descendente le permite ver los empleados desde el más joven al más viejo.

El uso de DESC es crucial en este caso, ya que invierte el orden ascendente predeterminado y consigue el resultado deseado.

Ejercicio 9: Productos Ordenados por el Número de Unidades

Ejercicio: Mostrar los datos de todos los productos, ordenando los resultados por el número de unidades en orden descendente y por el nombre del producto en orden ascendente.

Solución:

SELECT *
FROM product
ORDER BY units_in_stock DESC, product_name ASC;

Explicación de la solución: Esta consulta ordena los productos primero por units_in_stock en orden descendente y luego por product_name en orden ascendente. La primera condición de ordenación garantiza que los productos con más unidades en stock aparezcan en primer lugar; los productos con el mismo número de unidades se ordenan además alfabéticamente por nombre.

Consultas GROUP BY

En esta sección, exploramos las consultas SQL que implican agrupar datos para su análisis. GROUP BY es esencial para agregar y resumir información basada en criterios específicos. Revise GROUP BY en SQL Explicado para mayor información.

Ejercicio 10: El Precio Unitario Promedio para Cada Categoría

Ejercicio: Para cada categoría de producto, muestre su nombre y encuentre el precio unitario promedio. Muestre dos columnas: nombre y average_unit_price.

Solución:

SELECT
  category.name,
  AVG(unit_price) AS average_unit_price
FROM product
JOIN category
  ON product.category_id = category.category_id
GROUP BY category.name;

Explicación de la solución: En este ejercicio, estamos calculando el precio unitario medio para cada categoría de producto. La consulta une las columnas product y category para asociar los productos a sus respectivas categorías. A continuación, se utiliza la cláusula GROUP BY para agrupar los datos por category_name. Utilizando AVG(), podemos calcular el precio unitario medio dentro de cada categoría, lo que nos da una idea de la distribución de precios entre las diferentes categorías de productos.

Ejercicio 11: Número de clientes en las ciudades

Ejercicio: Cuente cuántos clientes viven en cada ciudad, excepto en Knoxville y Stockton. Ordene los resultados por el nombre de la ciudad en orden ascendente. Muestre dos columnas: city y customers_quantity.

Solución:

SELECT
  city,
  COUNT(customer_id) AS customers_quantity
FROM customer
WHERE city <> 'Knoxville'
  AND city <> 'Stockton'
GROUP BY city
ORDER BY city;

Explicación de la solución: En esta consulta, utilizamos la cláusula WHERE con el operador <> (que significa no igual a) para filtrar los registros cuyo nombre de ciudad sea Knoxville o Stockton. Este filtrado garantiza que el análisis abarque todas las ciudades excepto las especificadas.

A continuación, la función COUNT() calcula el recuento de clientes para cada una de las ciudades restantes. La cláusula GROUP BY agrupa los datos por nombre de ciudad, lo que nos permite contar los clientes de cada ciudad.

Por último, los resultados se ordenan en orden ascendente por ciudad, proporcionando una visión clara y organizada de la distribución de los clientes en las distintas ciudades.

Ejercicio 12: Número de productos descatalogados

Ejercicio: Para cada categoría, encuentre el número de productos descatalogados. Muestre sólo las categorías con al menos tres productos descatalogados. Ordene las filas por el número de productos descatalogados en orden descendente. Muestre dos columnas: name (el nombre de la categoría) y discontinued_products_number.

Solución:

SELECT
  category.name,
  COUNT(product_id) AS discontinued_products_number
FROM product
JOIN category
  ON product.category_id = category.category_id
WHERE discontinued IS TRUE
GROUP BY category.name
HAVING COUNT(product_id) >= 3
ORDER BY COUNT(product_id) DESC;

Explicación de la solución: En esta consulta, utilizamos la cláusula HAVING para filtrar las categorías con al menos tres productos descatalogados. La cláusula HAVING se aplica después de la operación GROUP BY y nos permite filtrar los resultados agregados en función de la condición específica. Para más información sobre el uso de HAVING, lea nuestros artículos Explicación de la cláusula HAVING de SQL y HAVING vs. WHERE en SQL: Lo Que Debe Saber.

Adicionalmente, notará el uso de la función COUNT() dentro de la cláusula ORDER BY. Esto nos permite ordenar las filas basándonos en el conteo de productos descontinuados en orden descendente.

La cláusula ORDER BY es flexible y puede incluir funciones agregadas, lo que la convierte en una potente herramienta para ordenar datos basándose en valores agregados.

Otras funciones SQL

En esta sección, profundizaremos en las funciones SQL adicionales para ampliar su conjunto de herramientas. Exploraremos el trabajo con valores de NULL y la limpieza de datos mediante la función ROUND(). Estas funciones son cruciales para manejar escenarios complejos de análisis de datos.

Ejercicio 13: Empleados con Fecha de Contratación Desconocida

Ejercicio: Mostrar los apellidos y nombres de los empleados con fecha de contratación desconocida.

Solución:

SELECT
  last_name,
  first_name
FROM employee
WHERE hire_date IS NULL;

Explicación de la solución: En esta consulta, la cláusula WHERE con hire_date IS NULL nos permite filtrar y seleccionar los registros en los que falta la fecha de contratación. Este tipo de consulta puede ser un análisis crucial para identificar registros de empleados incompletos o errores de introducción de datos en el conjunto de datos.

Ejercicio 14: Número de empleados con fechas de nacimiento y contratación desconocidas

Ejercicio: Contar el número de empleados con fechas de nacimiento y contratación desconocidas .

Solución:

SELECT
  COUNT(*) AS employees_number
FROM employee
WHERE birth_date IS NULL
  AND hire_date IS NULL;

Explicación de la solución: En esta consulta, volvemos a utilizar la condición IS NULL para filtrar las filas en las que faltan birth_date y hire_date. Esto nos permite COUNT() sólo aquellos empleados que carecen de información tanto de la fecha de nacimiento como de la fecha de contratación.

Ejercicio 15: Porcentaje de Dinero Gastado por el Cliente en la Compra

Ejercicio: Para cada cliente que realizó una compra, muestre el ID de cada compra realizada por este cliente y el porcentaje de dinero gastado en esa compra en relación con todo el dinero gastado por ese cliente.

Solución:

SELECT
  contact_name,
  purchase_id,
  ROUND(total_price * 100.0 / (SELECT SUM(total_price) FROM purchase WHERE customer_id = p.customer_id)) AS percentage
FROM purchase p
JOIN customer 
  ON p.customer_id = customer.customer_id;

Explicación de la solución: En esta solución, utilizamos dos consultas. La consulta principal incorpora una subconsulta dentro de la sentencia SELECT para calcular el SUM() de los precios totales de las compras realizadas por el mismo cliente.

A continuación, se calcula el porcentaje utilizando la fórmula proporcionada y se aplica la función ROUND() para redondear el resultado. Esta consulta es una poderosa herramienta para obtener información sobre el comportamiento de compra de cada cliente.

¿Listo para Más Ejercicios SQL?

Dominar SQL es una habilidad esencial para el análisis de datos - y la mejor manera de aprenderlo es haciéndolo. En este artículo repasamos una selección de 15 ejercicios SQL para principiantes extraídos de nuestro completo curso, Basic Ejercicio de SQL: A Store.

Pero estos ejercicios son sólo el principio. Si estás ansioso por una experiencia de aprendizaje más extensa, te invitamos a explorar nuestro curso completo que incluye 169 ejercicios interactivos. Para aquellos que anhelan retos aún mayores, este curso es sólo uno de los nueve cursos disponibles en el Ejercicio de SQL de aprendizaje, cada uno de los cuales ofrece un formato atractivo.

También disponemos de nuestro curso SQL Monthly Practice, que se actualiza periódicamente con nuevos ejercicios para mantener tus habilidades afiladas y al día de los últimos avances en SQL.

Sumérjase en más ejercicios de SQL y dominará el arte del análisis de datos. El camino para convertirse en un experto en SQL comienza con la práctica continua. Así que sigue explorando y perfeccionando tus habilidades. El éxito está a la vuelta de la esquina.