Actividad Progresiva SQL — Subiendo de Nivel
Esta actividad fue creada por Robinson Andres Cortes
En esta actividad explorarás consultas SQL a través de un conjunto de ejercicios de investigación. Intenta completar la actividad usando únicamente W3Schools, w3resource o SQLhabit como referencia.
Copia y pega el código proporcionado en tu DBMS de SQL preferido. Aunque los ejercicios funcionan con cualquier motor SQL, la solución de ejemplo utiliza MySQL.
No repetimos consultas que hagan exactamente lo mismo.
Cada paso añade una capa nueva de razonamiento.
Cuando alguien termina el Nivel 5 sin copiar, ya no está aprendiendo SQL.
Está aprendiendo a pensar en datos.
Nivel 1 — Fundamentos (Exploración básica)
-
Listar todos los usuarios.
Verificar si estoy en lo correcto
En este ejercicio, necesitamos seleccionar todos los datos de la tabla en la base de datos que creamos. En este caso, la tabla se llama
users.
En SQL del mundo real, esta solución no difiere mucho de lo que verás en la práctica. El concepto clave aquí es que el operador*significa todas las columnas.Con esto en mente, aquí está la solución:
SELECT * FROM users -
Mostrar solo
first_name,last_nameyemail.Revelar la verdad
En este ejercicio, continuamos con la misma lógica del anterior. El único cambio son las columnas seleccionadas.
En lugar de seleccionar todas las columnas (*), ahora solo necesitamos obtenerfirst_name,last_nameyemail.Con esto en mente, aquí está la solución:
SELECT first_name, last_name, email FROM users -
Filtrar usuarios cuyo
rolesea'admin'.Muéstrame la magia
En este ejercicio, introducimos otro concepto de SQL llamado
WHERE.
Esta es una sentencia condicional que filtra los datos: solo se mostrarán las filas que cumplan con la condición dada:SELECT * FROM users WHERE role = 'admin' -
Filtrar usuarios con
document_type = 'CC'.Momento de la verdad
Este sigue el ejercicio anterior, pero ahora no estamos preguntando por el
role.
En su lugar, estamos buscando eldocument_type:SELECT * FROM users WHERE document_type = 'CC' -
Mostrar usuarios mayores de 18 años (calcular la edad desde
birth_date).¿Lo hice bien?
Para resolver este reto, necesitamos introducir la función
TIMESTAMPDIFF().
En MySQL,TIMESTAMPDIFF()es una función poderosa que se utiliza para calcular la diferencia entre dos valoresDATEoDATETIME.En este caso, convertimos
birth_datea años comparándolo con la fecha actual, y luego verificamos si el usuario es mayor de 18 años.El ejercicio podría verse así:
SELECT * FROM users WHERE TIMESTAMPDIFF(YEAR, birth_date , CURDATE()) > 18Más información sobre
TIMESTAMPDIFF()aquí -
Mostrar usuarios cuyo ingreso sea mayor a 5,000,000.
Haz clic para spoilers
Siguiendo la misma lógica del ejercicio anterior, podemos usar el símbolo
>(mayor que).
Debemos asegurarnos de quemonthly_incomesea mayor que5000000.Con esto en mente, aquí está la solución:
SELECT * FROM users WHERE monthly_income > 5000000 -
Mostrar usuarios cuyo nombre comience con "A".
Veamos…
Para resolver este ejercicio, debo presentarte un nuevo concepto llamado el operador
LIKE.
El operadorLIKEse utiliza en una cláusulaWHEREpara buscar un patrón específico en una columna.
Para devolver registros que comiencen con una letra o frase específica, se agrega el%al final de la letra o frase.El ejercicio podría verse así:
SELECT * FROM users WHERE first_name like 'a%'Más información sobre el operador
LIKEaquí -
Mostrar usuarios que no tengan
company.Clic arriesgado
Para resolver este reto, primero debemos entender que un usuario sin empresa tiene
company = NULL.Para esto, introducimos un nuevo concepto de SQL: el operador
IS.
El operadorISse utiliza para comparar un valor conNULLo con valores booleanos (TRUE,FALSE). Es especialmente importante porqueNULLno se puede comparar usando el operador=.Con esto en mente, aquí está la solución:
SELECT * FROM users WHERE company IS NULLMás información sobre el operador
ISaquí
Aquí ya aprendiste SELECT, WHERE, operadores lógicos y NULL.
Nivel 2 — Combinación de condiciones
-
Usuarios mayores de 25 años que sean
'employee'.Respuesta, por favor
En este ejercicio introducimos algunos nuevos operadores de SQL. El primero es
AND.El operador
ANDes un operador lógico que devuelveTRUEsolo si ambas condiciones sonTRUE.
En este caso, la condición seráTRUEsi el usuario es mayor de 25 años y tiene empleo.Otro concepto importante es el operador
NOT.
El operadorNOTtambién es un operador lógico que devuelveTRUEcuando una condición no se cumple.
En este caso, sicompanyno esNULL, la condición devolveráTRUE.Con esto en mente, aquí está la solución:
SELECT * FROM users WHERE TIMESTAMPDIFF(YEAR, birth_date , CURDATE()) > 25 AND company IS NOT NULLMás información sobre el operador
ANDaquí.
Más información sobre el operadorNOTaquí. -
Usuarios con
'CC'que estén activos.¿Soy un genio?
Siguiendo el ejercicio anterior, solo necesitamos verificar que
document_type='CC'yis_active=1:SELECT * FROM users WHERE document_type = 'CC' AND is_active = 1 -
Usuarios mayores de edad sin empleo.
¿O no…?
Este ejercicio es similar al ejercicio 9, pero filtra usuarios mayores de 18 años, que es la mayoría de edad en mi país.
SELECT * FROM users WHERE TIMESTAMPDIFF(YEAR, birth_date , CURDATE()) > 17 AND company IS NULL -
Usuarios con empleo y con ingresos mayores a 3,000,000.
Hora de confesar
Primero, verificamos que el usuario tenga empleo.
Esto significa que la columnacompanyno debe serNULL.Luego, filtramos los usuarios cuyo ingreso sea mayor a 3,000,000 usando el operador de comparación
>.
Ambas condiciones deben cumplirse para que el usuario aparezca en el resultado.Teniendo esto en cuenta, aquí está la solución:
SELECT * FROM users WHERE company IS NOT NULL AND monthly_income > 3000000 -
Usuarios casados con al menos 1 hijo.
Mostrar la respuesta
Primero, verificamos el estado civil comparando la columna
marital_statuscon el valor'Casado'.
Luego, nos aseguramos de que el usuario tenga al menos un hijo comprobando quechildren_countsea mayor o igual a1.Ambas condiciones deben cumplirse para que el usuario sea incluido en el resultado.
SELECT * FROM users WHERE marital_status = 'Casado' AND children_count >= 1 -
Usuarios entre 30 y 40 años.
Prueba o dolor
En este caso, primero verificamos que la edad del usuario sea mayor o igual a 30 y menor o igual a 40.
Esto hace que el resultado esté entre los 30 y 40 años.SELECT * FROM users WHERE TIMESTAMPDIFF(YEAR, birth_date , CURDATE()) >= 30 AND TIMESTAMPDIFF(YEAR, birth_date , CURDATE()) <= 40 -
Usuarios
'admin'verificados mayores de 25 años.Júzgame
Primero debemos asegurarnos de que el rol del usuario sea
adminy que sea mayor de 25 años.SELECT * FROM users WHERE role = 'admin' AND TIMESTAMPDIFF(YEAR, birth_date , CURDATE()) > 25
Aquí combinamos múltiples condiciones y lógica booleana.
Nivel 3 — Introducción a análisis (Agregaciones)
-
Contar usuarios por
role.Chequeo de realidad
Para comenzar esta sección, necesitamos introducir algunos conceptos nuevos que nos ayudarán a resolver este reto.
El primer concepto es la función
COUNT().
La funciónCOUNT()se utiliza para contar el número de filas que coinciden con una condición específica.El segundo concepto es la sentencia
GROUP BY.
Esta agrupa filas que tienen los mismos valores en filas de resumen.El último concepto es la palabra clave
AS, que se utiliza para renombrar una columna o tabla usando un alias.Suficiente teoría — pongamos las manos en el teclado.
Primero, necesitamos hacer un
SELECTde los datos que queremos analizar. En este caso, seleccionamos la columnaroley el número de veces que aparece cada rol usandoCOUNT(role).
En lugar de mostrar el nombre de columna por defectoCOUNT(role), usamos la palabra claveASpara darle un alias más legible.Luego, especificamos la tabla donde están almacenados los datos y finalmente usamos
GROUP BYpara agrupar los resultados por rol.SELECT role, COUNT(role) AS Counting FROM users GROUP BY roleMás información sobre la función
COUNT()aquí.
Más información sobre la sentenciaGROUP BYaquí.
Más información sobre la palabra claveASaquí. -
Contar usuarios por
document_type.No te rías
Este ejercicio es muy similar al anterior. En este caso, usamos
document_typecomo el campo de agrupación.SELECT document_type, COUNT(document_type) AS Counting FROM users GROUP BY document_type -
Contar cuántos usuarios están desempleados.
Sé amable
En este caso tomamos
'Unemployed'como un valor fijo y usamosCOUNT(*)para contar todos los usuarios en la tablausers.
Luego filtramos solo los usuariosWHERE company IS NULL, lo que significa que están desempleados.SELECT 'Unemployed', COUNT(*) AS Counting FROM users WHERE company IS NULL -
Calcular el promedio general de ingresos.
Haz clic con cuidado
Para este ejercicio, necesitamos introducir un par de conceptos nuevos de SQL.
El primero es la función
AVG().
La funciónAVG()devuelve el valor promedio de una columna numérica.El segundo y último concepto de esta sección es la función
ROUND().
La funciónROUND()redondea un número a una cantidad específica de decimales.En este caso, queremos calcular el ingreso mensual promedio de todos los usuarios.
Usamos la funciónAVG()para obtener el promedio y la funciónROUND()para redondear el resultado a 0 decimales.Este es el resultado final:
SELECT 'Average Income', ROUND(AVG(monthly_income ), 0) FROM usersMás información sobre la función
AVG()aquí.
Más información sobre la funciónROUND()aquí. -
Calcular el promedio de ingresos por
role.La gran revelación
Este ejercicio es muy similar al anterior, pero en este caso agrupamos los resultados usando
GROUP BY role.SELECT role, ROUND(AVG(monthly_income ), 0) AS average_income FROM users GROUP BY role
Ahora ya no estás consultando individuos, estás leyendo patrones.
Nivel 4 — Pensamiento analítico
- Mostrar profesiones con más de 10 personas.
- Mostrar la ciudad con más usuarios.
- Comparar cantidad de menores vs mayores de edad.
- Promedio de ingresos por ciudad ordenado de mayor a menor.
- Mostrar las 5 personas con mayor ingreso.
Aquí ya estás usando GROUP BY, ORDER BY, LIMIT y HAVING.
Nivel 5 — Nivel Ingeniero
-
Clasificar usuarios como:
- "Menor"
- "Adulto"
- "Adulto mayor"
-
Mostrar cuántos usuarios hay en cada clasificación anterior.
-
Ranking de ingresos por ciudad.
-
Profesión con mayor ingreso promedio.
-
Mostrar usuarios cuyo ingreso esté por encima del promedio general.