SQL Preguntas de entrevista
Las entrevistas SQL evalúan si puedes expresar preguntas de datos de manera correcta y eficiente. Espera escribir consultas en vivo, a menudo involucrando joins, agregación y funciones de ventana.
Lo que cubren las entrevistas de SQL
Joins y filtrado
Joins INNER/LEFT/RIGHT/FULL, WHERE vs HAVING y self-joins.
Agregación
GROUP BY, funciones de agregación y trampas de agrupación (NULLs, duplicados).
Funciones de ventana
ROW_NUMBER, RANK, LAG/LEAD, totales acumulados y top-N por grupo.
Rendimiento
Índices, planes de consulta, sargabilidad y por qué una consulta es lenta.
Ejemplos de preguntas de entrevista sobre SQL
- Encuentra el segundo salario más alto en una tabla.Lo que cubre una buena respuesta
- Uso de DISTINCT y ORDER BY
- LIMIT con OFFSET
- Manejo de empates
- Consideración de NULLs
- Alternativa con subconsulta y MAX
Ver respuesta de ejemplo
Para obtener el segundo salario más alto, una manera común es ordenar los salarios distintos de forma descendente y luego usar LIMIT con OFFSET para saltar el primero. La consulta sería: SELECT DISTINCT salario FROM empleados ORDER BY salario DESC LIMIT 1 OFFSET 1. Esto devuelve el segundo valor si existe; si solo hay un salario o ninguno, devuelve vacío. Otra alternativa es usar una subconsulta: SELECT MAX(salario) FROM empleados WHERE salario < (SELECT MAX(salario) FROM empleados). Es importante considerar el manejo de NULLs, ya que ORDER BY los coloca al final según la configuración. También hay que tener en cuenta empates: si hay varios empleados con el mismo salario máximo, la segunda consulta sigue devolviendo el segundo valor mayor. La complejidad temporal es O(n log n) debido a la ordenación.
Solución de referenciasql -- Usando LIMIT y OFFSET SELECT DISTINCT salario FROM empleados ORDER BY salario DESC LIMIT 1 OFFSET 1; -- Alternativa con subconsulta SELECT MAX(salario) AS segundo_mas_alto FROM empleados WHERE salario < (SELECT MAX(salario) FROM empleados); - Obtén las N filas principales por grupo (por ejemplo, los 3 productos principales por categoría).Lo que cubre una buena respuesta
- Función de ventana ROW_NUMBER
- PARTITION BY para grupos
- Filtrado en consulta externa
- Alternativa con subconsultas correlacionadas
- Consideración de empates con RANK o DENSE_RANK
Ver respuesta de ejemplo
Para obtener las N filas principales por grupo, lo más eficiente es usar la función de ventana ROW_NUMBER() que asigna un número único a cada fila dentro de una partición. La consulta sería: SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY categoria ORDER BY ventas DESC) AS rn FROM productos) AS t WHERE rn <= 3. Esto devuelve los tres productos con mayores ventas por cada categoría. Si se permiten empates, se puede usar RANK() o DENSE_RANK(). La alternativa con subconsultas correlacionadas (WHERE 3 > (SELECT COUNT(*) ...)) suele ser menos eficiente. La complejidad temporal es O(n log n) debido a la ordenación dentro de cada partición.
Solución de referenciasql SELECT categoria, producto_id, ventas FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY categoria ORDER BY ventas DESC) AS rn FROM productos ) AS sub WHERE rn <= 3; - Explica la diferencia entre WHERE y HAVING.Lo que cubre una buena respuesta
- Filtro a nivel de filas vs grupos
- Momento de ejecución: WHERE antes de GROUP BY, HAVING después
- Uso de funciones de agregación en HAVING
- Ejemplo práctico de diferencia
- Alias no disponibles en WHERE
Ver respuesta de ejemplo
La cláusula WHERE filtra filas individuales antes de la agregación, mientras que HAVING filtra grupos después de que se ha aplicado GROUP BY. Por ejemplo, para obtener departamentos con salario promedio mayor a 50000, se usa HAVING AVG(salario) > 50000, pero no se puede usar en WHERE porque las funciones agregadas no están permitidas allí. WHERE se usa para filtrar filas basadas en condiciones de columnas, como 'WHERE salario > 30000' para excluir empleados con bajo salario antes de agrupar. HAVING permite usar alias de agregación y condiciones complejas sobre los resultados de GROUP BY. Errores comunes: intentar usar agregados en WHERE o poner condiciones de columna en HAVING que deberían ir en WHERE. En términos de rendimiento, WHERE reduce las filas antes de agrupar, lo que es más eficiente.
- Escribe una consulta para encontrar filas duplicadas y mantener solo una.Lo que cubre una buena respuesta
- Identificación de duplicados con GROUP BY y HAVING
- Uso de MIN o MAX para elegir la fila a mantener
- Eliminación segura con subconsulta
- Alternativa con función de ventana ROW_NUMBER
- Transacción o confirmación previa
Ver respuesta de ejemplo
Para encontrar y eliminar filas duplicadas manteniendo solo una, se puede usar una subconsulta que agrupe por las columnas que definen el duplicado y seleccione el ID mínimo (o máximo) a conservar. Luego se eliminan las filas cuyo ID no esté en esa lista. Por ejemplo: DELETE FROM tabla WHERE id NOT IN (SELECT MIN(id) FROM tabla GROUP BY col1, col2). Otra forma más controlada es usar una función de ventana: primero asignar un número de fila (ROW_NUMBER()) por cada grupo ordenado por algún criterio, y luego eliminar donde el número sea mayor que 1. Es importante ejecutar estas operaciones dentro de una transacción para poder revertir si es necesario. La complejidad es O(n log n) debido a la ordenación implícita en GROUP BY o ROW_NUMBER.
Solución de referenciasql -- Opción 1: usando GROUP BY y MIN DELETE FROM tabla WHERE id NOT IN ( SELECT MIN(id) FROM tabla GROUP BY col1, col2 ); -- Opción 2: usando ROW_NUMBER WITH duplicados AS ( SELECT id, ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY id) AS rn FROM tabla ) DELETE FROM tabla WHERE id IN (SELECT id FROM duplicados WHERE rn > 1); - Calcula un total acumulado de ingresos diarios.Lo que cubre una buena respuesta
- Función de ventana SUM con ORDER BY
- Ventana predeterminada ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
- Orden ascendente por fecha
- Manejo de fechas sin registros
- Alternativa con subconsulta menos eficiente
Ver respuesta de ejemplo
El total acumulado de ingresos diarios se calcula mediante la función de ventana SUM(ingresos) OVER (ORDER BY fecha). Esta función suma los ingresos desde el primer día hasta la fecha de la fila actual, ya que por defecto la ventana incluye todas las filas desde el inicio de la partición hasta la fila actual. La consulta sería: SELECT fecha, ingresos, SUM(ingresos) OVER (ORDER BY fecha) AS acumulado FROM ingresos_diarios. Si hay fechas sin registros, no aparecen en el resultado, pero el acumulado salta correctamente. Alternativas como subconsultas correlacionadas son menos eficientes. La complejidad temporal es O(n) porque la ventana se calcula en una sola pasada.
Solución de referenciasql SELECT fecha, ingresos, SUM(ingresos) OVER (ORDER BY fecha) AS total_acumulado FROM ingresos_diarios ORDER BY fecha; - ¿Cómo acelerarías una consulta lenta? ¿Qué te dice el plan de consulta?Lo que cubre una buena respuesta
- Uso de EXPLAIN ANALYZE para obtener el plan de ejecución
- Identificación de escaneos secuenciales grandes
- Importancia de índices en columnas de filtro y join
- Revisión de tipos de join (Nested Loop vs Hash Join)
- Ajustes como particionamiento o modificación de consulta
Ver respuesta de ejemplo
Para acelerar una consulta lenta, primero se debe analizar el plan de ejecución usando EXPLAIN (o EXPLAIN ANALYZE para tiempos reales). El plan muestra si se están realizando escaneos secuenciales (Seq Scan) en tablas grandes, lo que sugiere falta de índices. Se deben crear índices en las columnas usadas en cláusulas WHERE, JOIN y ORDER BY. También es importante verificar que los join sean eficientes (Hash Join o Merge Join frente a Nested Loop). Otras técnicas incluyen reescribir la consulta para evitar subconsultas innecesarias, usar particionamiento en tablas grandes, ajustar la configuración del servidor (work_mem, shared_buffers) y actualizar estadísticas. Un error común es asumir que agregar un índice siempre acelera; en tablas pequeñas puede ser contraproducente. El plan de consulta también revela cuándo se están usando índices (Index Scan) y si hay conversiones de tipo que los bloquean.
Cómo prepararse
- Practica escribir consultas a mano — muchas entrevistas usan un editor compartido sin autocompletado.
- Domina las funciones de ventana; desbloquean una gran clase de problemas de 'top-N por grupo' y totales acumulados.
- Piensa explícitamente en el comportamiento de NULL y duplicados — son áreas comunes de trucos.
- Prepárate para leer un plan de consulta y explicar por qué ayuda un índice.
Preguntas frecuentes
¿Qué dialecto SQL debo estudiar?
El SQL estándar cubre la mayoría de las entrevistas. Sabe que las funciones de ventana y CTEs son ampliamente soportadas; algunas funciones difieren entre PostgreSQL, MySQL y SQL Server.
¿Necesito optimizar consultas en una entrevista SQL?
Para roles de datos/backend, sí — prepárate para discutir índices, planes de consulta y por qué una consulta es lenta.
¿Las funciones de ventana se preguntan comúnmente?
Mucho. ROW_NUMBER/RANK y totales acumulados aparecen constantemente, especialmente para roles de ingeniería de datos y análisis.
¿Cómo puedo practicar entrevistas SQL?
Resuelve problemas de consultas sobre un esquema real y explica tu enfoque. Offersly puede generar preguntas enfocadas en SQL y evaluar tu razonamiento.
Practica preguntas sobre SQL con retroalimentación instantánea de IA
Sube tu currículum, obtén una entrevista simulada personalizada y ve exactamente qué mejorar — gratis para empezar.