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

15 ejercicios prácticos de SQL Server con soluciones

Mejore su dominio de SQL Server con nuestros ejercicios prácticos de SQL Server. Cada una de estas 15 tareas prácticas de T-SQL incluye una solución detallada que le ayudará a mejorar sus habilidades de consulta.

¿Sabe que todo el mundo dice: "La práctica hace al maestro"? Pues bien, no podría ser más cierto en el caso de SQL. El verdadero aprendizaje se produce cuando se empieza a trabajar con consultas, tablas y datos. Si desea perfeccionar sus conocimientos de MS SQL Server, está en el lugar adecuado. Estos 15 ejercicios T-SQL para principiantes son perfectos para familiarizarse con los conceptos básicos. (Si se lo está preguntando, T-SQL es el dialecto SQL utilizado en las bases de datos de SQL Server).

Los ejercicios se han extraído de nuestro curso interactivo Ejercicios prácticos de SQL en MS SQL Server. Se trata de un curso práctico de T-SQL para principiantes que trabajan con SQL Server. Ofrece más de 80 ejercicios prácticos, agrupados en secciones sobre consultas de tabla única, funciones agregadas, agrupación y ordenación de resultados, JOINS, y subconsultas, entre otras. Si te gustan los ejercicios de este artículo, te recomiendo que pruebes el curso.

Si eres un principiante que quiere aprender todo lo que T-SQL tiene que ofrecer, echa un vistazo a nuestra pista de aprendizaje completa Curso completo de SQL en MS SQL Server. La pista contiene 7 cursos interactivos de T-SQL que le enseñarán todo el T-SQL moderno para el análisis de datos.

Sección 1: Gatos - Ejercicios SQL perfectos para afilar sus garras

En la primera sección, trabajaremos con la tabla Cat. Esta tabla tiene las siguientes columnas:

  • Id - El ID de un gato determinado.
  • Name - El nombre del gato.
  • Breed - La raza del gato (por ejemplo, siamés, cornish rex).
  • Coloration - La coloración del gato (por ejemplo, carey, negro).
  • Age - Edad del gato.
  • Sex - Sexo del gato.
  • FavToy - Juguete favorito del gato.

Ejercicio 1: Tabla para conocer al gato

Ejercicio: Selecciona todos los datos de la Cat tabla.

Solución:

SELECT * 
FROM Cat;

Solución: Utilizamos la sentencia SELECT para seleccionar datos de la base de datos. El asterisco (*) que sigue a SELECT significa que se quieren todas las columnas de la tabla. La sentencia FROM Cat indica la tabla de la que se extraen las filas.

Ejercicio 2: Gatitos

Ejercicio: Seleccione Name, Breed, y Coloration para cada gato que tenga menos de cinco años.

Solución:

SELECT 
  Name, 
  Breed, 
  Coloration 
FROM Cat 
WHERE Age < 5;

Explicación: Como antes, utilizamos la sentencia SELECT. Esta vez, listamos las columnas que queremos seleccionar: Name, Breed, y Coloration. En la cláusula FROM, damos el nombre de la tabla (Cats).

En la cláusula WHERE, especificamos la condición para seleccionar sólo gatos menores de 5 años: Age < 5. Utilizamos el operador < para comparar el valor de la columna Edad con el número 5. La base de datos sólo seleccionará los gatos que sean menores de 5 años (es decir, que tengan una Edad inferior a 5).

Ejercicio 3: Gatos Ragdoll jóvenes y viejos

Ejercicio: Seleccionar el ID y el nombre de todos los gatos menores de cinco años o mayores de diez y que sean de raza Ragdoll.

Solución:

SELECT Id, Name 
FROM Cat
WHERE (Age < 5 OR Age > 10)
AND Breed = 'Ragdoll';

Explicación: Esta consulta es similar a la anterior. La única diferencia está en la cláusula WHERE.

Buscamos gatos que tengan menos de 5 años o más de 10 años. Para ello, utilizamos la condición (Age < 5 OR Age > 10). Utilizamos los operadores de comparación < y >, y los combinamos con el operador lógico OR. De este modo se seleccionan los gatos menores de 5 años o mayores de 10 años.

A continuación, utilizamos la condición Breed = 'Ragdoll' para seleccionar únicamente los gatos Ragdoll. Es importante señalar que el valor de texto Ragdoll está entre comillas simples: 'Ragdoll'.

Por último, utilizamos el operador AND para combinar las condiciones de edad y raza.

Ejercicio 4: ¿A qué gatos les gusta jugar con pelotas?

Ejercicio: Seleccionar todos los datos de los gatos cuya:

  • La raza empieza por 'R'.
  • La coloración termina con 'm'.
  • Su juguete favorito empieza por "pelota".

Solución:

SELECT *
FROM Cat
WHERE Breed LIKE 'R%'
  AND Coloration LIKE '%m'
  AND FavToy LIKE 'ball%'

Explicación: Utilizamos una sencilla consulta SELECT para resolver el ejercicio. En SELECT, ponemos el asterisco * para seleccionar todas las columnas de la tabla.

A continuación, utilizamos AND para combinar tres condiciones WHERE. La primera condición selecciona gatos con nombres de razas que empiecen por R. Utilizamos el operador LIKE y el comodín %: Breed LIKE 'R%'. Esta condición significa que buscamos razas que empiecen por R, seguidas de cualquier texto (vacío o no).

En la segunda condición, utilizamos Coloration LIKE '%m' para encontrar gatos cuya coloración termine en "m". En la tercera condición, utilizamos FavToy LIKE 'ball%' para buscar juguetes favoritos que empiecen por "pelota".

Si estás buscando ejercicios SQL básicos adicionales, consulta nuestro artículo 10 Ejercicios para Principiantes Ejercicio de SQL con Soluciones.

Sección 2: Juegos - Mejore sus habilidades SQL con datos de videojuegos

Ahora pasamos de los gatos y nos centramos en algo completamente diferente: los videojuegos. Trabajaremos con la tabla Games que consta de 9 columnas:

  • Id - El ID de un juego determinado.
  • Title - El título del juego (por ejemplo, Mario Kart).
  • Company - La empresa que produjo el juego.
  • Type - El género (por ejemplo, carreras).
  • ProductionYear - Año de creación del juego.
  • System - La consola para la que se lanzó el juego (por ejemplo, Nintendo).
  • ProductionCost - El coste de producción del juego.
  • Revenue - Los ingresos generados por el juego.
  • Rating - La valoración del juego (por los usuarios).

En esta sección nos centraremos en el uso de las funciones GROUP BY y aggregate.

Ejercicio 5: Costes medios de producción de buenos juegos

Ejercicio: Mostrar el coste medio de producción de los juegos que se produjeron entre 2010 y 2015 y obtuvieron una valoración superior a 7.

Solución:

SELECT 
  AVG(ProductionCost)
FROM Games
WHERE ProductionYear BETWEEN 2010 AND 2015
  AND Rating > 7;

Explicación: En el enunciado SELECT, usamos la función agregada AVG() para calcular el coste medio de producción. Damos ProductionCost como argumento; la expresión completa es AVG(ProductionCost).

En la cláusula WHERE, filtramos por juegos de alta calificación (Rating > 7) y producidos entre 2010 y 2015 (ProductionYear BETWEEN 2010 AND 2015).

Ejercicio 6: Estadísticas de producción de juegos por año

Ejercicio: Para todos los juegos, muestre cuántos juegos se lanzaron cada año (como el recuento column), el coste medio de producción (como la columna AvgCost ) y sus ingresos medios (como la columna AvgRevenue ).

Solución:

SELECT
  ProductionYear,
  COUNT(*) AS count,
  AVG(ProductionCost) AS AvgCost,
  AVG(Revenue) AS AvgRevenue
FROM Games
GROUP BY ProductionYear;

Explicación: Está acostumbrado a la sintaxis básica de SELECT, así que no la repasaremos. En esta consulta, estamos utilizando GROUP BY para organizar las filas en grupos basados en un valor determinado. Cuando hacemos eso, podemos encontrar estadísticas para cada grupo.

En el SELECT, listamos el ProductionYear y las siguientes expresiones:

  • COUNT(*) para contar filas en cada grupo.
  • AVG(ProductionCost) para calcular el coste medio de producción en cada grupo.
  • AVG(Revenue) para calcular los ingresos medios de cada grupo.

Después de FROM, añadimos GROUP BY. Como queremos calcular estadísticas para cada año de producción, utilizamos GROUP BY ProductionYear.

Ejercicio 7: Estadísticas de producción de la empresa

Ejercicio: Para cada empresa, seleccione su nombre, el número de juegos que produjo (como la columna NumberOfGames ), el coste medio de producción (como la columna AvgCost ). Nota: Mostrar sólo las empresas que produjeron más de un juego.

Solución:

SELECT Company,
  COUNT(*) AS NumberOfGames,
  AVG(ProductionCost) AS AvgCost
FROM Games
GROUP BY Company
HAVING COUNT(Company) > 1; 

Explicación: En esta consulta seleccionamos datos de la tabla Games tabla. Seleccionamos Company, COUNT(*) para contar las filas de esta empresa, y AVG(ProductionCost) para calcular el coste medio de producción de todos los juegos producidos por esta empresa.

A continuación, utilizamos GROUP BY Company para agrupar los juegos producidos por cada empresa. Por último, utilizamos la cláusula HAVING para limitar los resultados a las empresas que han producido más de un juego.

Ejercicio 8: Identificar buenos juegos

Ejercicio: Nos interesan los buenos juegos producidos entre 2000 y 2009. Un buen juego es un juego que tiene una puntuación superior a 6 y que fue rentable (ganó más que sus costes de producción).

Para cada empresa, muestre el nombre de la empresa, sus ingresos totales por juegos buenos producidos entre 2000 y 2009 (como la columna RevenueSum ), y el número de juegos buenos que produjo en este periodo (como la columna NumberOfGames ). Muestra sólo las empresas con ingresos por juegos buenos superiores a 4 000 000.

Solución:

SELECT
  Company,
  COUNT(*) AS NumberOfGames,
  SUM(Revenue) AS RevenueSum
FROM Games
WHERE ProductionYear BETWEEN 2000 AND 2009
  AND Rating > 6
  AND Revenue - ProductionCost > 0
GROUP BY Company
HAVING SUM(Revenue) > 4000000;

Explicación: En SELECT, listamos Company para obtener el nombre de la empresa, COUNT(*) para contar el número de juegos producidos por esta empresa, y SUM(Revenue) para calcular los ingresos totales de la empresa.

En WHERE, aplicamos los filtros a nivel de fila mencionados en el ejercicio:

  • ProductionYear BETWEEN 2000 AND 2009 para encontrar juegos producidos entre 2000 y 2009.
  • Rating > 6 juegos con una puntuación superior a 6.
  • Revenue - ProductionCost > 0 para encontrar juegos con más ingresos que costes de producción.

Agrupamos las filas utilizando GROUP BY Company. Por último, utilizamos HAVING para encontrar empresas con ingresos totales superiores a 4000000.

Ejercicio 9: Beneficio bruto por empresa

Ejercicio: Para todas las empresas presentes en la tabla, muestre su nombre y la suma del beneficio bruto en todos los años. Para simplificar este problema, suponga que el beneficio bruto es Revenue - ProductionCost; muestre esta columna como GrossProfitSum.

Asegúrese de que los resultados comienzan con la empresa que tuvo el mayor beneficio bruto.

Solución:

SELECT
  Company,
  SUM(Revenue - ProductionCost) AS GrossProfitSum
FROM Games
GROUP BY Company
ORDER BY SUM(Revenue - ProductionCost) DESC;

Explicación: En la expresión SELECT, listamos los valores Company y SUM(Revenue - ProductionCost). La expresión Revenue - ProductionCost calcula el beneficio bruto de cada juego y SUM(Revenue - ProductionCost) suma este beneficio entre varios juegos.

A continuación, agrupamos los datos por empresa (GROUP BY Company), y ordenamos los resultados por el beneficio bruto total en orden descendente. Por último, ordenamos por beneficio bruto; especificamos el orden descendente (10-1 en lugar de 1-10) para que el beneficio más alto sea el primero.

Puede encontrar más ejercicios específicos para GROUP BY en 10 Ejercicios GROUP BY Ejercicio de SQL con Soluciones

Sección 3: El Arte del JOIN

En esta sección, nos enfocaremos en los JOINs. Trabajaremos con una base de datos con datos sobre obras de arte. Hay tres tablas en la base de datos.

La tabla Artist tiene las siguientes columnas:

  • Id - El ID de un artista determinado.
  • Name - El nombre del artista.
  • BirthYear - Año de nacimiento del artista.
  • DeathYear - Año de fallecimiento del artista.
  • ArtisticField - El campo preferido del artista (por ejemplo, pintura, escultura).

La tabla PieceOfArt tiene las siguientes columnas:

  • Id - El ID de una obra determinada.
  • Name - El nombre de la obra.
  • ArtistId - El ID del artista que creó la obra.
  • MuseumId - El ID del museo que alberga la obra.

La tabla Museo consta de las tres columnas siguientes:

  • Id - El ID de un museo determinado.
  • Name - El nombre del museo.
  • Country - El país donde se encuentra el museo.

Ejercicio 10: Listar todas las obras de arte

Ejercicio: Indique los nombres de todas las obras de arte, junto con los nombres de sus creadores y los nombres de los museos que las albergan.

No incluya las obras perdidas (es decir, las que no tienen identificación de museo) ni las piezas con un artista desconocido. Nombra las columnas PieceOfArtName, ArtistName, y MuseumName.

Solución:

SELECT
  A.Name AS ArtistName,
  M.Name AS MuseumName,
  Poa.Name AS PieceOfArtName
FROM Museum M
JOIN PieceOfArt Poa
  ON M.Id = Poa.MuseumId
JOIN Artist A
  ON A.Id = Poa.ArtistId;

Explicación: Queremos listar todas las obras de arte de las que tenemos información completa (artista, museo). Esto nos indica que tenemos que utilizar INNER JOIN para unir las tablas.

Utilizamos la palabra clave JOIN, ya que es equivalente a INNER JOIN. Primero unimos las tablas Museum y PieceOfArt por el ID del museo. A continuación, unimos la tabla Artist en el ID del artista.

Puede consultar información sobre la unión de varias tablas en Cómo unir 3 tablas (o más) en SQL

Ejercicio 11: Obras de artistas del siglo XIX (y posteriores)

Ejercicio: Encuentre artistas que vivieron más de 50 años y nacieron después del año 1800. Indique su nombre y el nombre de las obras de arte que crearon. Renombre estas columnas ArtistName y PieceName, respectivamente.

Solución:

SELECT
  A.Name AS ArtistName,
  Poa.Name AS PieceName
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
WHERE DeathYear - BirthYear > 50
  AND BirthYear > 1800;

Explicación: Aquí unimos las tablas Artist y PieceOfArt por el ID del artista. En la cláusula WHERE, filtramos los artistas que vivieron más de 50 años. Para ello, calculamos la edad del artista con la expresión DeathYear - BirthYear y la filtramos mediante la comparación DeathYear - BirthYear > 50.

También filtramos los artistas del siglo XIX o posteriores con la condición BirthYear > 1800. Combinamos las dos condiciones con un operador AND.

Ejercicio 12: Productividad de los artistas

Ejercicio: Muestre los nombres de los artistas junto con el número de años que vivieron (nombre de la columna YearsLived) y el número de obras que crearon (nombre de la columna NumberOfCreated).

Muestra sólo los artistas que crearon al menos una obra de arte.

Solución:

SELECT
  A.Name,
  DeathYear - BirthYear AS YearsLived,
  COUNT(Poa.ArtistId) AS NumberOfCreated
FROM Artist A
JOIN PieceOfArt Poa
  ON A.Id = Poa.ArtistId
GROUP BY A.Name, DeathYear - BirthYear;

Explicación: Esta consulta SQL selecciona el nombre del artista, el número de años que vivió (DeathYear - BirthYear) y el número total de obras que creó COUNT(Poa.ArtistId).

Los datos se unen en el ID del artista entre la tabla Artist y la tabla PieceOfArt tabla. Los resultados se agrupan por el nombre del artista y su periodo de vida.

Es importante tener en cuenta dos cosas. En primer lugar, tenemos que incluir la expresión DeathYear - BirthYear en la cláusula GROUP BY, ya que esta expresión no está agregada. De lo contrario, la base de datos podría arrojar un error. (Puede leer sobre el error en Cómo solucionar un error 'Not a GROUP BY Expression' y Cómo solucionar el error "debe aparecer en la cláusula GROUP BY").

En segundo lugar, puesto que estamos utilizando INNER JOIN, ya tenemos garantizado que obtendremos los artistas que hayan creado al menos una obra de arte. Los artistas que no hayan creado ninguna obra de arte serán omitidos por este JOIN.

Puede encontrar más ejercicios de SQL JOIN en SQL Joins: 12 Preguntas de Práctica con Respuestas Detalladas

Sección 4: Un Carro de Datos

En esta sección final, trabajaremos con datos de la base de datos de una tienda. Tiene cinco tablas:

Categories Almacena los nombres de las categorías de productos:

  • Id - El ID de una categoría determinada
  • Name - El nombre de la categoría.

Products Almacena información de los productos:

  • Id - El ID de un producto dado.
  • Name - El nombre del producto.
  • CategoryId - El ID de la categoría a la que pertenece el producto.
  • Price - El precio del producto.

Clients almacena información básica del comprador:

  • Id - El ID de un cliente determinado.
  • FirstName - El nombre del cliente.
  • LastName - El apellido del cliente.

Orders registra la información básica del pedido:

  • Id - El ID de un pedido determinado.
  • ClientId - ID del cliente que realizó el pedido.
  • Year - El año en que se realizó el pedido.

Por último, la tabla OrderItems contiene datos sobre los artículos que componen cada pedido. Se trata de una tabla asociativa que conecta los datos de los ficheros Orders y Products . Consta de las siguientes columnas

  • OrderId - El ID del pedido.
  • ProductId - El ID del producto en el pedido anterior.
  • Quantity - La cantidad del producto en este pedido.
  • Price - El precio total del producto en este pedido.

Ejercicio 13: Ingresos por cada pedido

Ejercicio: Para cada pedido, seleccione su ID (nombre de la columna OrderId), el nombre y apellido del cliente que realizó este pedido, y los ingresos totales generados por este pedido (nombre de la columna Revenue).

Nota: Los ingresos del pedido son la suma de la columna Price para cada artículo del pedido.

Solución:

SELECT
  O.Id AS OrderId,
  C.FirstName,
  C.LastName,
  SUM(Oi.Price) AS Revenue
FROM Orders AS O
JOIN OrderItems AS Oi
  ON O.Id = Oi.OrderId
JOIN Clients AS C
  ON O.ClientId = C.Id
GROUP BY O.Id, C.FirstName, C.LastName;

Explicación: En esta consulta, unimos las tablas Orders, OrderItemsy Clients.

En SELECT, seleccionamos cuatro expresiones: el ID del pedido, el nombre y apellidos del cliente y la suma de todos los precios de los artículos del pedido. En GROUP BY, agrupamos los datos por el ID del pedido y el nombre y apellidos del cliente. Esto nos da los ingresos totales de cada pedido con la información (nombre y apellidos) del cliente.

Ejercicio 14: ¿Quién recompró productos?

Ejercicio: Seleccione el nombre y apellido de los clientes que recompraron productos (es decir, que compraron el mismo producto en más de un pedido). Incluya los nombres de esos productos y el número de los pedidos de los que formaban parte (nombre la columna OrderCount).

Solución:

SELECT
  Cli.FirstName,
  Cli.LastName,
  P.Name,
  COUNT(O.Id) AS OrderCount
FROM Clients cli
JOIN Orders O
  ON Cli.Id = O.ClientId
JOIN OrderItems Oi
  ON O.Id = Oi.OrderId
JOIN Products P
  ON P.Id = Oi.ProductId
GROUP BY Cli.FirstName, Cli.LastName, P.Name
HAVING COUNT(O.Id) > 1

Explicación: Aquí unimos cuatro tablas: Clients, Orders, OrderItemsy Products.

En SELECT, seleccionamos el nombre y apellidos del cliente, el nombre del producto, y el recuento de pedidos en los que este producto fue comprado por este cliente. Agrupamos la tabla por los datos del cliente (nombre y apellidos), y por el nombre del producto. De esta forma, las compras de este cliente de este producto se agrupan.

En HAVING, filtramos las filas en las que el recuento de pedidos es superior a 1. Esto nos permite seleccionar los clientes que compraron el mismo producto en más de una compra.

Ejercicio 15: ¿Cuánto gastó cada cliente por categoría?

Ejercicio: Seleccione el nombre y apellido de cada cliente, el nombre de la categoría en la que compró (en cualquiera de sus pedidos) y la cantidad total de dinero que gastó en esta categoría de producto (nombre esta columna TotalAmount).

Solución:

SELECT
  Cli.FirstName,
  Cli.LastName,
  C.Name,
  SUM(OI.Price) as TotalAmount
FROM Categories AS C
JOIN Products AS P
  ON C.Id = P.CategoryId
JOIN OrderItems AS OI
  ON P.Id = OI.ProductId
JOIN Orders AS O
  ON O.Id = OI.OrderId
JOIN Clients Cli
  ON Cli.Id = O.ClientId
GROUP BY Cli.FirstName, Cli.LastName, C.Name

Solución: Unimos las tablas Categories, Products, OrderItems, Ordersy Clients. Seleccionamos el nombre y los apellidos del cliente, el nombre de la categoría y la suma de los precios de los artículos del pedido. Esto nos permite calcular cuánto dinero gastó cada cliente en cada categoría.

Agrupamos los resultados por el nombre y apellidos del cliente y por el nombre de la categoría. De esta forma, se agrupan todos los artículos de compra de cada cliente y de cada categoría.

Más práctica con SQL Server

He tenido una gran experiencia explorando el variado mundo de los datos con T-SQL. Desde descubrir los secretos del comportamiento de los gatos hasta analizar estrategias de juego y apreciar el arte a través de los números, SQL ha sido mi herramienta de confianza. Ha cambiado mi forma de ver las preguntas y de descubrir las historias ocultas en los datos que nos rodean.

¿Quieres practicar más con SQL Server? Consulta estos increíbles recursos:

Si está preparado para profundizar en sus conocimientos, nuestro curso Ejercicios prácticos de SQL en MS SQL Server es justo lo que necesita. Está diseñado para reforzar sus cimientos y potenciar su capacidad para analizar e interpretar datos de forma eficaz. Con cada ejercicio, se sentirá más seguro y capacitado para abordar consultas complejas.

Práctica de SQL Server

Para aquellos que deseen explorar todos los aspectos de SQL, nuestro completo curso Curso completo de SQL en MS SQL Server lo cubre todo, desde los conceptos básicos hasta las técnicas avanzadas. Se trata de una ruta de aprendizaje perfecta para cualquiera que desee dominar SQL Server y tomar decisiones fundamentadas basadas en el conocimiento de los datos. Tanto si es principiante como si desea refrescar sus conocimientos, estos recursos le ayudarán a triunfar en el mundo de los datos.

No espere más: empiece a dominar SQL Server hoy mismo y libere todo el potencial de sus datos.