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

12 Preguntas de Práctica de Funciones SQL

Las funciones SQL nos permiten manipular datos, incluyendo valores numéricos y de cadena. Este artículo presenta 12 preguntas de práctica de funciones SQL - con soluciones y explicaciones detalladas - que te ayudarán a consolidar tus conocimientos de SQL.

Practicar SQL es importante si quieres mejorar tus habilidades. Pero encontrar ejercicios de práctica de SQL es difícil. Queremos ayudarte, así que hemos estado publicando recopilaciones gratuitas de ejercicios de práctica de SQL. En este artículo, te ofrecemos 12 preguntas de práctica de funciones SQL, con soluciones y explicaciones. Si te gusta este artículo, echa un vistazo a nuestro completo Ejercicio de SQL completo; ¡puedes probar los primeros ejercicios gratis!

Bien, empecemos. Antes de pasar a los ejercicios de funciones SQL, repasemos rápidamente los distintos tipos de funciones SQL y veamos nuestro conjunto de datos.

¿Qué es una función SQL?

Una función SQL toma uno o más argumentos como entrada, procesa los argumentos y devuelve una salida. SQL ofrece un conjunto de funciones predefinidas que trabajan con valores de cadena (por ejemplo, UPPER(), SUBSTRING()), valores numéricos (por ejemplo, FLOOR(), GREATEST()) y valores NULL (por ejemplo, ISNULL()).

Las funciones SQL pueden clasificarse a su vez en funciones escalares, agregadas y de ventana. Las funciones escalares toman un único argumento y devuelven un único resultado, por ejemplo, LEN(nombre) devolvería el número de caracteres de cada nombre. Las funciones agregadas devuelven un único valor para un grupo de filas (es decir, devuelven un valor agregado). Por ejemplo, SUM(sales) devuelve el total de todos los valores de la columna ventas. Las funciones agregadas se combinan con GROUP BY para calcular estadísticas.

Las funciones de ventana trabajan sobre grupos de filas (llamados ventanas) que pueden cambiar en relación con la fila actual. Al igual que las funciones de agregado, las funciones de ventana se aplican a un grupo de filas; a diferencia de las funciones de agregado, devuelven un valor por fila. Puede obtener más información sobre la diferencia entre funciones agregadas y de ventana aquí.

Si desea profundizar en las funciones SQL, le recomiendo nuestro curso Funciones estándar de SQL curso. Sus 211 retos de codificación le proporcionarán mucha práctica.

Presentación del conjunto de datos

Conozcamos rápidamente el conjunto de datos. Nuestros ejercicios de práctica de funciones SQL utilizarán un conjunto de datos de muestra de Alquiler de DVD que hemos importado a una base de datos PostgreSQL. Este es el esquema del conjunto de datos:

Preguntas prácticas sobre funciones SQL

Y estas son las tablas que usaremos en nuestros ejercicios:

  • La tabla customer almacena información sobre los clientes de alquiler de DVD. Se conecta a las tablas rental y payment cada cliente puede tener cero o más registros en estas tablas.
  • La tabla rental almacena información sobre cada alquiler realizado por los clientes. Se conecta con la tabla inventory ya que cada alquiler requiere exactamente un artículo del inventario. También se conecta a la tabla payment para poder asignar un registro de pago a cada alquiler.
  • La tabla payment almacena información sobre el pago de cada alquiler. También se conecta a las tablas rental y staff para poder asignar un alquiler y un empleado a cada pago.
  • La tabla staff almacena información sobre los empleados de la tienda de DVD. Se conecta a las tablas payment y rental para asignar un miembro del personal a cada pago y alquiler.
  • La tabla inventory almacena todos los artículos disponibles en el inventario de alquiler de DVD. Se conecta a la tabla rental para asignar un único artículo del inventario a cada alquiler. También se conecta a la tabla film para asignar cada película a un almacén de alquiler.
  • La tabla film almacena detalles sobre todas las películas disponibles para alquiler. Se conecta a la tabla inventory para asignar cada película a una tienda. También se conecta a la tabla language para indicar en qué idioma(s) está disponible la película. Por último, se conecta a la tabla film_actor para asignar actores a películas (y películas a actores).
  • La tabla language almacena todos los idiomas de las películas ofrecidas por el alquiler de DVD. Se conecta a la tabla film para asignar un idioma a cada película.
  • La tabla film_actor almacena las relaciones de muchos a muchos entre las tablas film y actor (porque cada actor puede actuar en muchas películas y cada película puede tener muchos actores). Conecta con las tablas film y actor para asignar cada película a todos los actores que han actuado en ella y cada actor a todas las películas en las que ha participado.
  • La tabla actor almacena todos los actores que aparecen en las películas disponibles en el alquiler de DVD. Se conecta a la tabla film_actor que asigna los actores a las películas.

Ahora que conocemos el conjunto de datos, empecemos a practicar las funciones SQL.

Práctica de Funciones SQL: Cadenas

SQL proporciona numerosas funciones que permiten manipular valores de cadena. He aquí algunas de las más comunes:

  • CONCAT() concatena dos o más valores de cadena en uno solo
  • LENGTH() devuelve el número de caracteres contenidos en el valor de cadena.
  • LOWER() convierte la cadena en todas minúsculas.
  • REPLACE() sustituye parte de la cadena por otra cadena.
  • SUBSTRING() extrae parte de la cadena.
  • UPPER() convierte la cadena en mayúsculas

Lea este artículo para conocer todas las funciones de cadena de SQL.

Ejercicio 1: Actualizar los Correos Electrónicos del Personal

Pregunta: La tienda de alquiler de DVD Sakila ha abierto sucursales en el Reino Unido. Actualice las direcciones de correo electrónico del personal sustituyendo el dominio de correo electrónico actual sakilastaff.com por sakila.uk; llame a esta columna new_email.

Solución:

SELECT REPLACE(email, 'sakilastaff.com', 'sakila.uk')
          AS new_email
FROM staff;

Explicación: Utilizamos la función REPLACE() para sustituir parte de la cadena por otra cadena.

Cada valor de la columna email de la tabla staff se pasa a la función REPLACE(), que sustituye sakilastaff.com por sakila.uk.

Ejercicio 2: Listar todos los clientes

Pregunta: Enumere los nombres de todos los clientes activos utilizando el formato apellido, primera letra del nombre. Llame a esta columna customer_name y ordene la lista alfabéticamente.

(Sugerencia: Los clientes activos tienen un 1 en la columna active ).

Solución:

SELECT CONCAT(last_name, ', ', SUBSTRING(first_name, 1, 1))
          AS customer_name
FROM customer
WHERE active = 1
ORDER BY customer_name;

Explicación: Seleccionamos los nombres y apellidos de la customer tabla. Para seleccionar sólo los clientes activos, definimos una cláusula WHERE con la condición de que el valor de active sea 1.

Para devolver los nombres de los clientes en el formato dado, utilizamos la función CONCAT() para concatenar todas las partes en una sola cadena:

  • La primera parte es la columna last_name.
  • La segunda parte es una coma.
  • La tercera parte es la primera letra del primer nombre, que se extrae mediante la función SUBSTRING().

Por último, ordenamos la lista alfabéticamente por la columna last_name.

Ejercicio 3: Lista de películas con descripciones breves

Pregunta: Muestre el título de cada película y los 100 primeros caracteres de su descripción, seguidos de tres puntos si la descripción supera los 100 caracteres. Nombre esta columna truncated_description. Si la descripción tiene 100 caracteres o menos, muestre la descripción completa en la misma columna.

Solución:

SELECT title,
       CASE
         WHEN LENGTH(description) <= 100 THEN description
         ELSE SUBSTRING(description, 1, 100) || '...'
       END AS truncated_description
FROM film;

Explicación: Seleccionamos las columnas title y description de la film tabla.

Utilizamos la sentencia CASE WHEN para decidir el contenido de la columna truncated_description. Es equivalente a la sentencia IF…ELSE… de otros lenguajes de programación.

  • Utilizamos la función LENGTH() para obtener el número de caracteres presentes en la columna description. WHEN el número de caracteres es menor o igual a 100, THEN mostramos la descripción completa.
  • Utilizamos la función SUBSTRING() para obtener los 100 primeros caracteres de la columna description. Los concatenamos con tres puntos utilizando la función ||. Este contenido se almacena en la columna truncated_description si no se cumple la condición de la cláusula WHEN.

Ejercicio 4: Seleccionar películas y actores

Pregunta: Visualice todas las películas utilizando el formato título de la película (año de estreno) como columna film. También muestre todos los actores asignados a las películas utilizando el formato apellido, nombre como columna actor. Ordene los datos cronológicamente por año de estreno y alfabéticamente por título de la película.

Solución:

SELECT f.title || ' (' || f.release_year || ')' AS film,
       a.last_name || ', ' || a.first_name AS actor
FROM film f
JOIN film_actor fa
ON f.film_id = fa.film_id
JOIN actor a
ON fa.actor_id = a.actor_id
ORDER BY f.release_year, f.title;

Explicación:

Para seleccionar los nombres de los actores y las películas en las que actuaron, tenemos que unir las columnas actor, filmy film_actor en sus columnas comunes. Consulte esta práctica de SQL JOIN para aprender más sobre la unión de múltiples tablas.

En la sentencia SELECT, concatenamos los títulos de las películas y los años de estreno de toda la tabla film con los nombres y apellidos de los actores de la tabla actor tabla.

Por último, ordenamos los datos primero por film.release_year; dentro de cada año, ordenamos además los datos alfabéticamente por la columna title.

Práctica de funciones SQL: Valores Numéricos

SQL proporciona numerosas funciones que permiten manipular valores numéricos. Estas son algunas de las más comunes:

  • ABS() devuelve el valor absoluto de su argumento.
  • CEILING() devuelve el valor redondeado hacia arriba.
  • FLOOR() devuelve el valor redondeado hacia abajo.
  • GREATEST() devuelve el mayor número de un grupo de números.
  • LEAST() devuelve el número más pequeño de un grupo de números.
  • ROUND() redondea el número a un número determinado de decimales.

Lee este artículo para conocer todas las funciones numéricas de SQL.

Ejercicio 5: Calcular la Longitud Promedio de la Descripción

Pregunta: Muestre la longitud media de todas las descripciones de películas. Nombre esta columna average_film_desc_length. Redondee el resultado al entero más cercano.

Solución:

SELECT 
  FLOOR(AVG(LENGTH(description)))
          AS average_film_desc_length
FROM film;

Explicación:

Seleccionamos la columna description de la film tabla. La envolvemos en tres funciones para obtener la longitud media de la descripción redondeada al entero más próximo:

  • La función LENGTH(), con description como argumento, obtiene el número de caracteres por descripción.
  • Envolvemos la salida de LENGTH() en la función AVG() para calcular la media de todas las longitudes de descripción.
  • Finalmente, envolvemos AVG(LENGTH(description) en la función FLOOR() para redondear la media al entero más cercano.

Ejercicio 6: Encontrar las películas más largas

Pregunta: Enumere los títulos de las películas con mayor duración.

Solución:

SELECT title
FROM film
WHERE length = (SELECT MAX(length) FROM film);

Explicación:

Seleccionamos la columna title de la film de la tabla.

Como sólo queremos listar la(s) película(s) con mayor duración, definimos una condición de la cláusula WHERE. Utilizamos una subconsulta que devuelve el valor de duración máxima encontrado en la columna length. La condición afirma que el valor de la duración de los títulos de las películas a mostrar debe ser igual al valor devuelto por la subconsulta.

Para más práctica con subconsultas SQL, revise estos ejercicios de práctica de subconsultas.

Ejercicio 7: Listar Estadísticas de Alquiler

Pregunta: Muestre la duración media del alquiler en días (como la columna avg_rental_duration_days ) y el pago medio por alquiler (como la columna avg_payment_per_rental ). Redondee ambos valores a 2 decimales.

Solución:

SELECT 
  ROUND(AVG(EXTRACT(DAY FROM r.return_date - r.rental_date)), 2)
          AS avg_rental_duration_days,
  ROUND(AVG(p.amount), 2) 
          AS avg_payment_per_rental
FROM rental r
JOIN payment p
ON r.rental_id = p.rental_id;

Explicación:

En primer lugar, unimos las columnas rental y payment en su columna común.

Para obtener la duración media del alquiler en días, debemos hallar la diferencia media entre las columnas rental_date y return_date de la tabla rental de la tabla. Para ello, utilizamos la función EXTRACT() para obtener el número de días que duró el alquiler (como valores enteros); a continuación, utilizamos AVG() para calcular el valor medio. Finalmente, envolvemos esto en la función ROUND(), proporcionando el valor medio como primer argumento y 2 como segundo argumento para obtener el valor medio redondeado.

Para obtener el pago medio por alquiler, volvemos a utilizar AVG(), pasando esta vez la columna de importe de la tabla payment como argumento. Como antes, lo envolvemos en ROUND() para redondear el resultado a dos decimales.

Ejercicio 8: Descuento de las cuotas de alquiler

Pregunta: Sakila está realizando un descuento especial en los alquileres de la siguiente manera:

  • 50% de descuento en películas G.
  • 40% de descuento en películas PG.
  • 30% de descuento en películas PG-13.

Seleccione los títulos de las películas junto con sus tarifas de alquiler actualizadas (nombre esta columna new_rental_rate).

Solución:

SELECT title,
       CASE
         WHEN rating = 'G' THEN rental_rate * 0.5
         WHEN rating = 'PG' THEN rental_rate * 0.6
         WHEN rating = 'PG-13' THEN rental_rate * 0.7
         ELSE rental_rate
       END AS new_rental_rate
FROM film;

Explicación:

Seleccionamos la columna title de la film y las tarifas de alquiler actualizadas basadas en la columna rating.

Utilizamos la sentencia CASE WHEN para aplicar descuentos basados en los valores de la columna rating:

  • Si la clasificación es G, la tarifa de alquiler se descuenta un 50% (rental_rate * 0.5).
  • Si la clasificación es PG, el precio del alquiler se descuenta un 40% (rental_rate * 0.6).
  • Si la calificación es PG-13, el alquiler se descuenta un 30% (rental_rate * 0.7).
  • En caso contrario, devolvemos el rental_rate

Práctica de funciones SQL: NULLs

SQL proporciona numerosas funciones que permiten gestionar los valores de NULL. Éstas son algunas de las más comunes:

  • ISNULL() devuelve verdadero si su argumento es un valor NULL; en caso contrario, devuelve
  • IFNULL() devuelve un valor declarado si el valor original es NULL.
  • COALESCE() devuelve el primer valor noNULL de sus argumentos.

Ejercicio 9: Encontrar Clientes con Alquileres Actuales

Pregunta: Seleccionar los nombres y apellidos de los clientes que tienen alquileres en curso.

Solución:

SELECT c.first_name, c.last_name
FROM customer AS c
JOIN rental AS r
ON c.customer_id = r.customer_id
WHERE r.return_date IS NULL;

Explicación:

Seleccionamos los nombres y apellidos de los clientes de la tabla de clientes.

Para obtener los clientes que tienen alquileres en curso, debemos buscar registros en la tabla rental donde el valor de la columna return_date sea NULL. Para ello, unimos las columnas customer y rental en su columna común.

Ejercicio 10: Seleccionar películas y sus idiomas

Pregunta: Seleccione todos los títulos de películas con información sobre el idioma o idiomas en los que está disponible la película. Cree una columna (denominada film_language_info) con valores que sigan este formato:

<film title> is available in <language name>. 

Si el nombre del idioma es NULL, utilice la frase un idioma desconocido en lugar del nombre del idioma.

Solución:

SELECT f.title || ' is available in ' || 
          COALESCE(l.name, 'an unknown language') AS film_language_info
FROM film AS f
JOIN language AS l
ON f.language_id = l.language_id;

Explicación:

Seleccionamos la columna title de la tabla film y la columna name de la tabla language de la tabla. Por lo tanto, debemos unir las columnas film y language en su columna común.

Concatenamos los títulos de las películas con la frase "está disponible en" y el nombre del idioma. Tenga en cuenta que al seleccionar el nombre del idioma, utilizamos la función COALESCE() para sustituir el nombre del idioma por "idioma desconocido" si el nombre del idioma es NULL.

Ejercicio 11: Buscar clientes que hayan alquilado recientemente un DVD

Pregunta: El equipo de marketing de Sakila quiere enviar un correo electrónico a los clientes que no han alquilado ningún DVD durante dos semanas. Enumere las direcciones de correo electrónico de todos los clientes que han devuelto su alquiler más reciente hace menos de dos semanas. No incluya a los clientes que tienen alquileres en curso.

Solución:

WITH filtered_customers AS (
    SELECT customer_id,
           MAX(return_date) AS most_recent_return_date
    FROM rental
    WHERE return_date IS NOT NULL
    GROUP BY customer_id
    HAVING MAX(return_date) < CURRENT_DATE - INTERVAL '2 weeks'
)

SELECT c.email
FROM customer c
JOIN filtered_customers fc
ON c.customer_id = fc.customer_id;

Explicación:

En primer lugar, creamos una expresión común de tabla (CTE) para filtrar los clientes; la llamamos filtered_customers. En la CTE, seleccionamos la columna customer_id y el valor más reciente de la columna return_date por cliente de la tabla. rental de la tabla; por lo tanto, utilizamos la cláusula GROUP BY. Seleccionamos sólo los clientes que no tienen alquileres en curso, es decir, en los que la columna return_date IS NOT NULL . E imponemos la condición de que el valor de most_recent_return_date sea inferior a dos semanas.

A continuación, unimos la salida devuelta por este CTE con la tabla customer y seleccionamos la columna email, para poder enviar correos electrónicos a los clientes que no han estado activos en las últimas dos semanas.

Ejercicio 12: Actualizar Fechas Finales de Alquiler NULL

Pregunta: Seleccione los ID de cliente y los ID de alquiler de todos los clientes, junto con las fechas de inicio y fin de cada alquiler. Si la fecha de finalización del alquiler es NULL, sustitúyala añadiendo a la fecha de inicio del alquiler tantos días como se indican en la duración del alquiler para la película dada.

Solución:

SELECT r.customer_id, 
       r.rental_id, 
       r.rental_date, 
       COALESCE(r.return_date,
                r.rental_date + INTERVAL '1 day' * f.rental_duration)
          AS return_date
FROM rental AS r
JOIN inventory AS i
ON r.inventory_id = i.inventory_id
JOIN film AS f
ON i.film_id = f.film_id;

Explicación:

Seleccionamos las columnas customer_id, rental_id, y rental_date de la rental tabla. A continuación, utilizamos la función COALESCE(), pasando la columna return_date como primer argumento. Si la columna return_date es NULL, entonces la sustituimos por la columna rental_date más tantos días como indique la columna rental_duration de la film de la tabla.

Tenga en cuenta que para hacer coincidir el valor de la columna f.rental_duration con el de la columna r.rental_id, debemos unir la tabla rental con la tabla film a través de la tabla inventory en sus columnas comunes.

¿Quiere Más Práctica de Funciones SQL?

Este artículo presentó ejemplos reales de cómo utilizar las funciones SQL para obtener información valiosa sobre los datos. Echa un vistazo a este curso en Funciones estándar de SQL para practicar más.

Si no estás listo para comprometerte con un curso completo, aquí tienes algunos ejercicios de práctica de SQL avanzado que realmente ponen a prueba tus conocimientos de SQL. También puedes probar estos ejercicios de práctica para las funciones de ventana de SQL. Sigue esta guía práctica de SQL para aprovechar al máximo los recursos de LearnSQL.es.

Mucha suerte.