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

15 preguntas engañosas de SQL para usuarios experimentados

Las preguntas de las entrevistas SQL para usuarios experimentados suelen contener algunas preguntas capciosas. Los entrevistadores las utilizan para poner a prueba tus agallas, que suelen ser el resultado de una amplia experiencia y un alto nivel de conocimientos de SQL.

En este artículo te mostraré 15 preguntas capciosas para entrevistas SQL (la mayoría de codificación). Eso sí, no son necesariamente preguntas complejas. En realidad, esa es su principal característica: parecen muy fáciles y sencillas, pero es el entrevistador el que intenta engañarte. Pero como usuario experimentado de SQL, deberías ser capaz de reconocer las trampas y evitarlas.

Yo te enseñaré cómo hacerlo, pero no puedo preparar la entrevista en tu lugar. Entonces, ¿cómo debe enfocar la preparación de la entrevista?

Preparación de la entrevista como usuario experimentado de SQL

Unas bases sólidas en temas básicos e intermedios de SQL son requisitos previos para considerarte un usuario experimentado de SQL. Si no sabes en qué punto del espectro de conocimientos de SQL te encuentras, tenemos algo nuevo para ti: nuestra evaluación de habilidades SQL. Puedes hacer la prueba y evaluar tu nivel de SQL. Es una función gratuita; puedes hacer una prueba cada 30 días. Al final de la prueba, obtendrás una puntuación global sobre tus conocimientos de SQL. Hay resultados detallados para seis áreas de competencia: Consultas SQL básicas, Tipos de JOIN en SQL, Funciones SQL estándar, Informes SQL básicos, Informes SQL intermedios e Informes SQL complejos.

Preguntas de la entrevista SQL para usuarios experimentados

Después de la evaluación, puede ir a nuestra pista SQL avanzado para practicar más. Consta de tres cursos interactivos principales que cubren detalles de funciones de ventana, extensiones de GROUP BY y consultas recursivas. Los temas se reparten a lo largo de 395 desafíos de codificación, por lo que escribirás mucho código, lo que se ha demostrado que es la forma más eficaz de aprender SQL. Una vez finalizado el curso, se sentirá cómodo con los temas avanzados de SQL.

El curso de aprendizaje te aportará conocimientos, de eso no hay duda. Sin embargo, los empleadores confían en que los usuarios experimentados aprovechen SQL para resolver problemas de la vida real. Pero en la vida, las cosas rara vez son sencillas; los problemas reales no suelen ser ejemplos de libros de texto de SQL hechos a medida para el aprendizaje. Por lo tanto, debes ir más allá de los ejemplos del curso. Tienes que trabajar la flexibilidad y la creatividad, ver de antemano los posibles escollos y evitarlos en tu código SQL. Eso es lo que los entrevistadores buscan en los usuarios experimentados. Por eso, no basta con preparar la entrevista con preguntas SQL sencillas. También debes repasar las preguntas difíciles, ya que a los entrevistadores les gusta utilizarlas para intentar pillarte desprevenido.

A continuación se presentan algunas de las preguntas difíciles más comunes en las entrevistas SQL para usuarios experimentados.

Pregunta 1: Seleccionar autónomos y su información de tareas

Escriba una consulta que seleccione todos los freelancers junto con la información de sus tareas:

  • Título de la tarea
  • Tipo y subtipo de tarea
  • Fecha de vencimiento

Incluya a los autónomos que no tengan ninguna tarea asignada.

Conjunto de datos: El conjunto de datos es de una empresa que emplea autónomos en determinadas tareas. Consta de tres tablas. La primera tabla es freelancer. Puede encontrar el script aquí.

idfirst_namelast_name
1BobFranklin
2DionneRavanelli
3MarekLewandowski
4FrancoisCousteau
5EmmaBiesa

La segunda tabla es un diccionario de diferentes tipos de tareas denominado task_category. Aquí está el script.

idtask_typetask_subtype
1Blog articleSQL
2Blog articlePython
3Blog articleCareer
4Social media postLinkedIn
5Social media postOther social media

La tercera tabla muestra los detalles del trabajo asignado que los freelancers están haciendo para nuestra empresa. La tabla se llama taskcon el script aquí.

idtask_category_idtitlefreelancer_iddate_assigneddue_datecompleted_date
12Working With Pandas in Python52023-11-302023-12-152023-12-15
24Promote SQL avanzado Learning Track42023-12-182023-12-202023-12-20
31Working With LEFT JOIN in SQL12023-12-082024-03-01NULL
43What Does a Data Analyst Do?22023-12-202024-02-012024-02-10
54Promote Working With Pandas in Python42024-01-152024-01-182024-01-18
62Python Libraries You Should Know12024-01-152024-02-152024-02-15
71Using COUNT in SQL22024-01-202024-02-152024-02-15
81Filtering Data in SQL52024-02-20NULLNULL

Respuesta: Esta pregunta pone a prueba sus habilidades para unir tres tablas y elegir el tipo de unión correcto.

Aquí está la solución:

SELECT f.first_name,
	 f.last_name,
	 t.title,
	 t.due_date,
	 tc.task_type,
	 tc.task_subtype
FROM freelancer f
JOIN task t
ON f.id = t.freelancer_id
JOIN task_category tc
ON t.task_category_id = tc.id;

Explicación: Para obtener toda la información necesaria, debe unir las tres tablas. Primero, una las tablas freelancer y task en el ID del autónomo. Para añadir la tercera tabla, de nuevo necesitas escribir la palabra clave JOIN. A continuación, indique en la cláusula ON que está uniendo tablas en el ID de categoría de tarea.

El tipo de unión que utilice debe ser JOIN. Esto se debe a la posibilidad de que haya algunos autónomos que aún no tengan ninguna tarea. Usted sólo necesita los que tienen.

Resultado: Esta es la salida de la consulta:

first_namelast_nametitledue_datetask_typetask_subtype
EmmaBiesaWorking With Pandas in Python2023-12-15Blog articlePython
FrancoisCousteauPromote SQL avanzado Learning Track2023-12-20Social media postLinkedIn
BobFranklinWorking With LEFT JOIN in SQL2024-03-01Blog articleSQL
DionneRavanelliWhat Does a Data Analyst Do?2024-02-01Blog articleCareer
FrancoisCousteauPromote Working With Pandas in Python2024-01-18Social media postLinkedIn
BobFranklinPython Libraries You Should Know2024-02-15Blog articlePython
DionneRavanelliUsing COUNT in SQL2024-02-15Blog articleSQL
EmmaBiesaFiltering Data in SQLNULLBlog articleSQL

Pregunta 2: ¿Qué son los OUTER JOINs y cuándo se utilizan?

Respuesta: Esta pregunta quiere ver si usted realmente entiende cómo funcionan las uniones externas y cómo se diferencian de otras uniones.

OUTER JOINs son una de las distintas categorías de join en SQL, junto con INNER JOINs y CROSS JOINs.

Las siguientes uniones pertenecen a la familia OUTER JOIN:

  • LEFT (OUTER) JOIN
  • RIGHT (OUTER) JOIN
  • FULL (OUTER) JOIN

La característica principal de todos los OUTER JOINs es que unen tablas de forma que una tabla es dominante, por lo que se mostrarán todos sus datos. La segunda tabla está subordinada, de modo que la consulta sólo mostrará las filas coincidentes de esa tabla. Si hay filas no coincidentes, aparecerán como NULL.

Por lo tanto, OUTER JOINdebe utilizarse cuando desee mostrar tanto las filas no coincidentes como las coincidentes dentro de las tablas.

Cada una de las uniones externas anteriores funciona según este principio, pero se diferencian en lo siguiente:

  • LEFT JOIN muestra todos los datos de la primera tabla (izquierda) y sólo las filas coincidentes de la segunda tabla (derecha). Si hay filas que no coinciden, se muestran como NULL.
  • RIGHT JOIN muestra todos los datos de la segunda tabla (derecha) y sólo las filas coincidentes de la primera tabla (izquierda). Las filas no coincidentes se muestran como NULL.
  • FULL JOIN combina LEFT JOIN y RIGHT JOIN. Muestra todos los datos de ambas tablas. En otras palabras, mostrará todas las filas (coincidentes y no coincidentes) de la tabla izquierda. A continuación, añadirá todas las filas de la tabla derecha que no se encuentren en la tabla izquierda. Donde haya datos no coincidentes, verá NULLs.

Pregunta 3: Seleccionar Información de Freelancer y Tarea, Parte 2

Escriba una consulta que devuelva

  • Los nombres y apellidos de los freelancers.
  • Los títulos de sus tareas asignadas.
  • Tipo y subtipo de tarea.
  • Las fechas de vencimiento de las tareas.

Incluir a todos los autónomos, incluso a los que no tienen ninguna tarea.

Conjunto de datos: Igual que en la pregunta 1.

Respuesta: Otra pregunta de entrevista SQL para el usuario experimentado. Aquí necesita demostrar que entiende las relaciones entre las tablas. Debe utilizar LEFT JOIN para unir las tres tablas. Debe utilizar LEFT JOIN como primera unión. Pero debe tener en cuenta que la relación entre las tablas le "obliga" a utilizar LEFT JOIN de nuevo como segunda unión.

SELECT f.first_name,
	 f.last_name,
	 t.title,
	 t.due_date,
	 tc.task_type,
	 tc.task_subtype
FROM freelancer f
LEFT JOIN task t
ON f.id = t.freelancer_id
LEFT JOIN task_category tc
ON t.task_category_id = tc.id;

Explicación: La consulta es muy similar a la de la Pregunta 1. Así que su primer join es LEFT JOIN, ya que necesita obtener todos los autónomos, no sólo los que tienen una tarea asignada. En otras palabras, la relación es tal que una tarea debe tener un autónomo asignado, pero un autónomo no necesita tener una tarea asignada.

Sin embargo, cuando se une la tercera tabla, se necesita de nuevo LEFT JOIN. ¿Por qué? Porque una tarea tiene que tener un tipo y un subtipo. Al mismo tiempo, cada tipo de tarea disponible no necesita estar entre las tareas asignadas. Si utilizara INNER JOIN en su lugar, "cancelaría" la primera LEFT JOIN y sesgaría su salida.

Salida: Este es el resultado:

first_namelast_nametitledue_datetask_typetask_subtype
EmmaBiesaWorking With Pandas in Python2023-12-15Blog articlePython
FrancoisCousteauPromote SQL avanzado Learning Track2023-12-20Social media postLinkedIn
BobFranklinWorking With LEFT JOIN in SQL2024-03-01Blog articleSQL
DionneRavanelliWhat Does a Data Analyst Do?2024-02-01Blog articleCareer
FrancoisCousteauPromote Working With Pandas in Python2024-01-18Social media postLinkedIn
BobFranklinPython Libraries You Should Know2024-02-15Blog articlePython
DionneRavanelliUsing COUNT in SQL2024-02-15Blog articleSQL
EmmaBiesaFiltering Data in SQLNULLBlog articleSQL
MarekLewandowskiNULLNULLNULLNULL

Utilizando INNER JOIN como segunda unión eliminaría esta última fila, que muestra un autónomo sin tarea asignada. Si no hay tarea, tampoco hay tipo de tarea. Y INNER JOIN no muestra filas no coincidentes. Es por eso que LEFT JOIN es necesario aquí.

Pregunta 4: Seleccionar información de autónomos para proyectos que vencen en 2024

Escriba una consulta que seleccione

  • Todos los autónomos
  • Los títulos de sus tareas
  • Las fechas de vencimiento de las tareas

Incluya sólo los proyectos con fecha de vencimiento en 2024.

Conjunto de datos: El mismo que en la pregunta anterior.

Solución: La pregunta quiere inducirle a escribir una consulta que utilice la cláusula WHERE para filtrar los datos, como se muestra a continuación:

SELECT f.first_name,
	 f.last_name,
	 t.title,
	 t.due_date
FROM freelancer f
LEFT JOIN task t
ON f.id = t.freelancer_id
WHERE t.due_date > '2023-12-31';

Pero esa no es la respuesta correcta. Para obtener el resultado deseado, la condición de filtrado en WHERE debe cambiarse a una condición de unión, como la siguiente:

SELECT f.first_name,
	 f.last_name,
	 t.title,
	 t.due_date
FROM freelancer f
LEFT JOIN task t
ON f.id = t.freelancer_id AND t.due_date > '2023-12-31';

Explicación: En la primera consulta, el uso de WHERE devolvería sólo los datos de las tareas con fecha de vencimiento en 2024. Eso excluiría a todos los autónomos que no tienen una tarea asignada, pero también las tareas que no tienen - por varias razones - una fecha de vencimiento.

Así que, en su lugar, movemos la condición de filtrado a la cláusula ON. La primera condición une las tablas en el ID del autónomo. La segunda condición se añade utilizando la palabra clave AND. De esta forma, se incluyen todos los autónomos pero se filtran los proyectos que vencían en 2023.

Resultado: Aquí está la salida correcta:

first_namelast_nametitledue_date
BobFranklinWorking With LEFT JOIN in SQL2024-03-01
DionneRavanelliWhat Does a Data Analyst Do?2024-02-01
FrancoisCousteauPromote Working With Pandas in Python2024-01-18
BobFranklinPython Libraries You Should Know2024-02-15
DionneRavanelliUsing COUNT in SQL2024-02-15
EmmaBiesaNULLNULL
MarekLewandowskiNULLNULL

A pesar de que Emma Biesa tiene un proyecto titulado 'Filtrar datos en SQL', su fecha de vencimiento es NULL, por lo que el valor de la columna title es también NULL. En otras palabras, el proyecto de Emma Biesa no coincide con la condición de unión.

Por otra parte, el resultado es el mismo para Marek Lewandowski. Esta vez, es porque Marek no tiene ningún proyecto asignado.

Pregunta 5: Mostrar todos los empleados y sus jefes

Conjunto de datos: La pregunta le proporciona la tabla employees. Este es el script.

La tabla es una lista de empleados.

idfirst_namelast_namemanager_id
1JohnBorisov2
2LindaJohnson8
3FrankRanieriNULL
4NinaBowie1
5TamaraFelipeNULL
6SimonFyodorov8
7LanaHopkinsNULL
8TomBonfa1
9MariaFox1
10VictorIvanchich2

Solución: Como sólo hay una tabla, tienes que demostrar que sabes que una tabla se puede unir consigo misma. En otras palabras, resuelve la pregunta aplicando una autounión.

Esto se hace de la siguiente manera:

SELECT e.first_name AS employee_first_name, 
	 e.last_name AS employee_last_name, 
	 m.first_name AS manager_first_name,
	 m.last_name AS manager_last_name
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.id;

Explicación: Self-join es simplemente una tabla que se une consigo misma. Básicamente, al dar a una tabla diferentes alias, estás haciendo que SQL piense que has unido dos tablas diferentes.

Nuestra 'primera' tabla tiene el alias e. La utilizaremos para mostrar los nombres de los empleados.

El alias de la 'segunda' tabla unida es m; servirá para mostrar los nombres de los directivos.

En este caso, debe unirlas utilizando LEFT JOIN porque la pregunta requiere que enumere todos los empleados. Esto también incluye a los empleados que no tienen jefes. Si utilizara INNER JOIN, obtendría sólo los empleados que tienen un gerente.

La tabla está auto-unida con la condición de que el ID del manager sea igual al ID del empleado. Así se obtienen los nombres de los managers de cada empleado.

Resultado: Esta es la lista de empleados y sus superiores:

employee_first_nameemployee_last_namemanager_first_namemanager_last_name
JohnBorisovLindaJohnson
LindaJohnsonTomBonfa
FrankRanieriNULLNULL
NinaBowieJohnBorisov
TamaraFelipeNULLNULL
SimonFyodorovTomBonfa
LanaHopkinsNULLNULL
TomBonfaJohnBorisov
MariaFoxJohnBorisov
VictorIvanchichLindaJohnson

NULLs como nombres de gerente significa que el empleado respectivo no tiene superior.

Pregunta 6: Mostrar terapeutas y su primera y segunda lengua

Escriba una consulta que devuelva todos los terapeutas con su primer y segundo idioma.

Conjunto de datos: Este conjunto de datos procede de una consulta de psicoterapia colectiva destinada a expatriados. Varios terapeutas ofrecen terapia, y cada uno de ellos lo hace en dos idiomas.

La lista de los idiomas está en la tabla language. Aquí está el guión.

idlanguage_name
1English
2Dutch
3Russian
4Polish
5Croatian

La lista de terapeutas figura en el cuadro therapist. Aquí está el script.

idfirst_namelast_namefirst_language_idsecond_language_id
1MayaHoekstra21
2LanaMayakovski31
3MarijaAbramović52
4JanNowak41
5FrancisGordon12

Solución: Esta tarea, una de las muchas preguntas de entrevista SQL para usuarios experimentados, requiere que demuestres tus habilidades para unir tres tablas. Sin embargo, aquí una tabla se une dos veces. Debe reconocerlo, ya que la tabla therapist hace referencia a la tabla language en dos columnas: first_language_id y second_language_id.

La solución debería tener este aspecto:

SELECT t.first_name,
	 t.last_name,
	 fl.language_name AS first_language_name,
	 sl.language_name AS second_language_name
FROM therapist t
JOIN language fl
ON t.first_language_id = fl.id
JOIN language sl
ON t.second_language_id = sl.id;

Explicación: Primero, unimos la tabla therapist con la tabla languagedándole a esta última el alias fl (como en "primera lengua"). Lo utilizaremos para mostrar la primera lengua del terapeuta, es decir, su lengua materna. Por eso la condición join busca donde el ID de la primera lengua es el mismo que el ID de la lengua. De este modo, se mostrará el nombre de la primera lengua.

En el siguiente paso, volvemos a unir la tabla language. Esta vez, tiene el alias sl para "segunda lengua". La unión toma el ID de la segunda lengua y lo busca en language. Así obtenemos el nombre de la segunda lengua.

Para mostrar el primer y el segundo idioma, seleccionamos la columna language_name - una vez desde la fl tabla' y la segunda vez de la sl y damos a las columnas los nombres apropiados.

Resultado: Este es el resultado:

first_namelast_namefirst_language_namesecond_language_name
JanNowakPolishEnglish
LanaMayakovskiRussianEnglish
MayaHoekstraDutchEnglish
FrancisGordonEnglishDutch
MarijaAbramovićCroatianDutch

Pregunta 7: Mostrar el número de autónomos con tareas asignadas

Conjunto de datos: El conjunto de datos de autónomos utilizado en las preguntas 1, 3 y 4.

Solución: Esta complicada pregunta de la entrevista le lleva a utilizar la función agregada COUNT(). Parece muy fácil, con una consulta sencilla que sólo utiliza una tabla. Sin embargo, la pregunta quiere que te precipites y escribas la siguiente consulta:

SELECT COUNT(freelancer_id) AS number_of_working_freelancers
FROM task;

Sin embargo, tienes que demostrar que eres más inteligente que eso y escribir una consulta que utilice COUNT(DISTINCT freelancer_id) en lugar de COUNT(freelancer_id).

SELECT COUNT(DISTINCT freelancer_id) AS number_of_working_freelancers
FROM task;

Explicación: ¿Por qué es incorrecta la primera consulta? Bueno, COUNT(freelancer_id) contará cada instancia del ID de un autónomo. Esto significa que también contará los duplicados como otro autónomo. (Recuerde que cada freelancer puede tener múltiples tareas).

Para evitar esto, simplemente añada DISTINCT en esta expresión. Esto eliminará los duplicados - es decir, cada freelancer será contado sólo una vez.

Resultado: La primera consulta devolverá esto:

number_of_working_freelancers
8

Sabe que es incorrecto porque conoce sus datos. La tabla freelancer tiene sólo cinco autónomos listados, por lo que no puede ser cierto que haya más autónomos trabajando que autónomos.

Por lo tanto, la salida correcta es la siguiente. Hay cuatro autónomos porque sabemos que uno está sin asignar, es decir, no está trabajando.

number_of_working_freelancers
4

Pregunta 8: Mostrar el Número de Tareas por Tipo y Subtipo de Tarea

Conjunto de datos: Igual que el anterior.

Solución: Aquí debe reconocer que necesita utilizar una función agregada y agrupar la salida por dos columnas.

SELECT task_type,
	 task_subtype,
	 COUNT(*) AS number_of_tasks
FROM task_category tc
JOIN task t
ON tc.id = t.task_category_id
GROUP BY task_type, task_subtype;

Explicación: Para obtener la salida, necesita unir las tablas task_category y task en el ID del tipo de tarea.

A continuación, seleccione el tipo y subtipo de tarea, y utilice COUNT(*), que simplemente contará el número de filas, que es igual al número de tareas. Cada fila es una tarea.

A continuación, utilice GROUP BY para agrupar los datos por tipo de tarea. Sin embargo, la pregunta le pide que agregue los datos también en el nivel de subtipo de tarea, por lo que debe agregarlo en GROUP BY. Todas las columnas en GROUP BY deben estar separadas por una coma.

Resultado: El tipo de tarea "Publicación en redes sociales" sólo aparece una vez, ya que no hay otros subtipos en las tareas activas.

Por otro lado, el tipo de tarea "Artículo de blog" aparece tres veces, cada una con un subtipo de tarea diferente. La columna number_of_tasks representa el número de tareas por subtipo.

task_typetask_subtypenumber_of_tasks
Social media postLinkedIn2
Blog articleSQL3
Blog articlePython2
Blog articleCareer1

Pregunta 9: Mostrar el número de tareas activas por tipo y subtipo de tarea

Escriba una consulta que muestre el número de tareas activas por tipo y subtipo de tarea.

Incluya sólo las categorías con más de dos tareas.

Conjunto de datos: El mismo que el anterior.

Solución: Esta pregunta de entrevista SQL común pondrá a prueba si usted reconoce que es necesario utilizar HAVING en lugar de WHERE para filtrar la salida. Podrías resolver la pregunta así:

SELECT task_type,
	 task_subtype,
	 COUNT(*) AS number_of_tasks
FROM task_category tc
JOIN task t
ON tc.id = t.task_category_id
WHERE COUNT(*) > 2
GROUP BY task_type, task_subtype;

Eso es incorrecto, por lo que necesita reemplazar WHERE con HAVING:

SELECT task_type,
	 task_subtype,
	 COUNT(*) AS number_of_tasks
FROM task_category tc
JOIN task t
ON tc.id = t.task_category_id
GROUP BY task_type, task_subtype
HAVING COUNT(*) > 2;

Explicación: Esta consulta es básicamente la misma que la de la pregunta anterior. El requisito adicional es mostrar sólo los tipos y subtipos de tareas con más de dos tareas activas.

La primera consulta no devolverá nada excepto un error diciendo que las funciones agregadas no pueden usarse en WHERE. Esto se debe, por supuesto, a que WHERE filtra los datos antes de la agregación.

Así que primero hay que agregar los datos utilizando COUNT(*) para encontrar el número de tareas activas por tipo y subtipo. Sólo después podrá buscar las categorías con más de dos tareas.

En otras palabras, debe utilizar HAVING, ya que filtra los datos después de la agregación. Sólo tiene que utilizar la agregación de la columna number_of_tasks y establecer la condición de que el recuento debe ser superior a dos.

Salida:

task_typetask_subtypenumber_of_tasks
Blog articleSQL3

Pregunta 10: ¿Qué tiene de malo esta consulta?

Conjunto de datos: Igual que el anterior.

Solución: La pregunta le da una consulta:

SELECT first_name,
	 last_name,
	 task_type,
	 task_subtype,
	 COUNT(task_category_id) AS task_count
FROM freelancer f
JOIN task t
ON f.id = t.freelancer_id
JOIN task_category tc
ON t.task_category_ID = tc.id
GROUP BY first_name, last_name, task_type
ORDER BY last_name;

Su respuesta debería ser que esta consulta no funciona porque la columna task_subtype no aparece en la cláusula GROUP BY. La consulta corregida debería tener este aspecto:

SELECT first_name,
	 last_name,
	 task_type,
	 task_subtype,
	 COUNT(task_category_id) AS task_count
FROM freelancer f
JOIN task t
ON f.id = t.freelancer_id
JOIN task_category tc
ON t.task_category_ID = tc.id
GROUP BY first_name, last_name, task_type, task_subtype
ORDER BY last_name;

Explicación: ¿Por qué la columna task_subtype debe aparecer en GROUP BY? La regla en SQL es que todas las columnas (excepto las que contienen funciones agregadas) deben aparecer en GROUP BY. Esto es algo que deberías saber y ser capaz de reconocer en la consulta inmediatamente.

Salida: La salida corregida ahora funcionará y devolverá el siguiente resultado. Muestra los freelancers y el número de sus tareas por tipo y subtipo.

first_namelast_nametask_typetask_subtypetask_count
EmmaBiesaBlog articlePython1
EmmaBiesaBlog articleSQL1
FrancoisCousteauSocial media postLinkedIn2
BobFranklinBlog articlePython1
BobFranklinBlog articleSQL1
DionneRavanelliBlog articleCareer1
DionneRavanelliBlog articleSQL1

Pregunta 11: Mostrar todos los autónomos y el número de sus tareas

Conjunto de datos: Igual que el anterior.

Solución: En esta pregunta, podrías fácilmente escribir una consulta que use COUNT(*) para encontrar el número de tareas, así:

SELECT first_name,
	 last_name,
	 COUNT(*) AS task_count
FROM freelancer f
LEFT JOIN task t
ON f.id = t.freelancer_id
GROUP BY first_name, last_name;

Sí, ha utilizado sabiamente LEFT JOIN para devolver los autónomos sin tarea. Sin embargo, debería utilizar COUNT(task_category_id) en lugar de COUNT(*)...

SELECT first_name,
	 last_name,
	 COUNT(task_category_id) AS task_count
FROM freelancer f
LEFT JOIN task t
ON f.id = t.freelancer_id
GROUP BY first_name, last_name;

... ¿verdad?

Explicación: ¡No caigas en ese truco! Seguro que sabe que COUNT(*) no debe utilizarse en combinación con LEFT JOIN.

Utiliza LEFT JOIN para incluir autónomos sin la tarea. Esos autónomos no tendrán valores coincidentes en la tabla de la derecha, por lo que se mostrarán como NULL. Desafortunadamente, COUNT(*) no ignora NULLs, por lo que se contarán como valores regulares.

En su lugar, debe utilizar COUNT(task_category_id). De esta forma, sólo contará los valores noNULL.

Resultados: Eche un vistazo a la salida de la primera consulta (incorrecta):

first_namelast_nametask_count
DionneRavanelli2
MarekLewandowski1
EmmaBiesa2
BobFranklin2
FrancoisCousteau2

Marek Lewandowski tiene una tarea. Pero sabemos que esto no puede ser correcto, ya que no tiene ninguna tarea asignada. La salida muestra el recuento de uno porque COUNT(*) contó el valor NULL (fila no coincidente).

La salida de la consulta de solución muestra correctamente que el recuento de tareas de Marek es cero:

first_namelast_nametask_count
DionneRavanelli2
MarekLewandowski0
EmmaBiesa2
BobFranklin2
FrancoisCousteau2

Pregunta 12: Mostrar el número de tareas completadas por fecha de finalización

Escriba una consulta que muestre el número de tareas completadas por fecha de finalización. Incluya NULLs como una categoría de fecha independiente.

Conjunto de datos: El mismo que el anterior.

Solución: Esta pregunta intenta engañarle haciéndole pensar que de alguna manera necesita establecer explícitamente una condición en la que todas las tareas sin fecha de finalización se cuenten juntas bajo la categoría NULL como fecha.

Pero la solución es más sencilla de lo que piensa:

SELECT completed_date,
	 COUNT(id) AS completed_task_count
FROM task
GROUP BY completed_date
ORDER BY completed_date ASC;

Explicación: Como puede ver, la consulta anterior no se refiere a NULLs de ninguna manera. Simplemente selecciona la fecha de finalización y utiliza COUNT() en la columna ID de tarea para contar el número de tareas finalizadas.

Por supuesto, la salida debe agruparse por fecha de finalización. También se ordena de la fecha más antigua a la más reciente, lo que no es necesario pero queda mejor.

Al escribir una consulta de este tipo, demuestra que entiende que los valores de NULL no se cuentan por separado. Todos los valores de NULL se mostrarán como una categoría - NULL.

Resultado: Como puede ver, todas las tareas sin fecha de finalización se muestran en una fila:

completed_datecompleted_task_count
2023-12-151
2023-12-201
2024-01-181
2024-02-101
2024-02-152
NULL2

Pregunta 13: Mostrar Empleados con sus Departamentos y Salarios

Escriba una consulta que muestre los empleados, sus departamentos y sus salarios.

Incluya sólo a los empleados con un salario inferior a la media de su departamento.

Conjunto de datos: Esta pregunta de entrevista SQL utiliza la tabla salaries. Puedes encontrar el script aquí.

idfirst_namelast_namedepartmentsalary
1BennyGilhespySales5,293.47
2BenettaFeatherstonhaughEngineering2,214.55
3KarlaStiellSales2,070.45
4SissieSeabonAccounting5,077.42
5GennaBecheAccounting7,451.65
6KirstenFernandezEngineering7,533.13
7PenFredySales7,867.54
8TishCalderbankSales4,103.19
9GallardPhilipetAccounting7,220.06
10WalshKleinholzAccounting4,000.18
11CarceWilkensonAccounting3,991.00
12TamiLangrishSales5,588.34
13ShayneDearnEngineering2,785.92
14MerlaIngilsonEngineering2,980.36
15KeelyPatifieldSales2,877.92

Solución: La parte complicada aquí es reconocer que la consulta puede ser muy corta si sabes usar subconsultas correlacionadas.

Debería hacerse así:

SELECT id, 
	 first_name,
	 last_name,
	 department,
	 salary
FROM salaries s1
WHERE salary < (SELECT AVG(salary)
				FROM salaries s2
				WHERE s1.department = s2.department);

Explicación: Así, la consulta primero lista todas las columnas requeridas de la tabla salarios. Le he dado un alias a la tabla, s1.

A continuación, utilizo la cláusula WHERE para comparar el salario de cada empleado con la media departamental. La media departamental se calcula en un tipo especial de subconsulta: una subconsulta correlacionada.

¿Qué tiene de especial? Bueno, esta subconsulta está correlacionada porque hace referencia a los datos de la consulta principal. Esto ocurre en la cláusula WHERE de una subconsulta: el departamento de la tabla s1 (que aparece en la consulta principal) tiene que ser el mismo que el departamento de la tabla s2 que aparece en la subconsulta. Esta condición permitirá a la función agregada AVG() calcular la media departamental del departamento en el que trabaja este empleado en concreto.

Resultado: La siguiente tabla muestra sólo los empleados cuyos salarios están por debajo de la media de los salarios de sus respectivos departamentos.:

idfirst_namelast_namedepartmentsalary
2BenettaFeatherstonhaughEngineering2,214.55
3KarlaStiellSales2,070.45
4SissieSeabonAccounting5,077.42
8TishCalderbankSales4,103.19
10WalshKleinholzAccounting4,000.18
11CarceWilkensonAccounting3,991.00
13ShayneDearnEngineering2,785.92
14MerlaIngilsonEngineering2,980.36
15KeelyPatifieldSales2,877.92

Pregunta 14: ¿Cuál es la diferencia entre UNION y UNION ALL?

Respuesta: Para responder a esta pregunta, obviamente debe conocer la diferencia entre los dos operadores de conjunto más comunes en SQL.

Ambos operadores fusionan verticalmente las salidas de dos o más consultas. UNION lo hace excluyendo las filas duplicadas. En otras palabras, si las mismas filas aparecen en ambas consultas, sólo se mostrarán una vez. Puede considerarse como DISTINCT en el mundo de los operadores de conjuntos.

Por otro lado, UNION ALL muestra todas las filas de ambas consultas, incluidas las duplicadas. Puedes leer más sobre la diferencia entre UNION y UNION ALL en nuestra guía.

Pregunta 15: Mostrar los libros seleccionados con su autor y subtítulo

Escriba una consulta que seleccione el autor, el título y el subtítulo de un libro, pero sólo de aquellos libros cuyo subtítulo incluya la palabra "mujer". Incluya los libros sin subtítulos.

Conjunto de datos: La tabla utilizada en este ejemplo es booksy el script está aquí.

idfirst_namelast_namedepartmentsalary
2BenettaFeatherstonhaughEngineering2,214.55
3KarlaStiellSales2,070.45
4SissieSeabonAccounting5,077.42
8TishCalderbankSales4,103.19
10WalshKleinholzAccounting4,000.18
11CarceWilkensonAccounting3,991.00
13ShayneDearnEngineering2,785.92
14MerlaIngilsonEngineering2,980.36
15KeelyPatifieldSales2,877.92

Solución: Lo más sencillo es buscar la palabra "mujer" en el subtítulo. Sin embargo, ¿cómo incluir también los libros sin subtítulos, es decir, con valores NULL?

La respuesta es que necesita manejar explícitamente NULLs para incluirlos en la salida, de esta manera:

SELECT 
  author,
  title,
  subtitle
FROM books
WHERE subtitle ILIKE '%woman%' OR subtitle IS NULL;

Explicación: Su respuesta incluye dos condiciones en WHERE. La primera condición busca la palabra "mujer" en el subtítulo. Para ello, utilice LIKE (si su base de datos no distingue entre mayúsculas y minúsculas) o ILIKE (si su base de datos distingue entre mayúsculas y minúsculas, como PostgreSQL). Para buscar la palabra en cualquier lugar de una cadena, debe rodearla con '%'. Como estás buscando una cadena, todo eso debe escribirse entre comillas simples.

Ahora, puede añadir otra condición de filtrado en la que indique que el subtítulo debe ser NULL utilizando el operador IS NULL. Las dos condiciones se unen mediante la palabra clave OR, ya que no pueden cumplirse al mismo tiempo: si no hay subtítulo, éste no puede contener la palabra 'mujer'.

Resultado: Esta es la salida que muestra todos los datos que cumplen cualquiera de las dos condiciones:

authortitlesubtitle
Miljenko JergovićSarajevo MarlboroNULL
Tilar J. MazzeoIrena's ChildrenThe Extraordinary Story of the Woman Who Saved 2,500 Children from the Warsaw Ghetto
Olga TokarczukPrimeval and Other TimesNULL
Thomas HardyTess of the d' UrbevillesA Pure Woman Faithfully Presented
Sylvia PlathArielNULL
Toni MorrisonJazzNULL
Haben GirmaHabenThe Deafblind Woman Who Conquered Harvard Law

Más recursos de entrevistas para usuarios experimentados de SQL

Estos 15 ejercicios cubren algunas de las preguntas "trampa" más comunes en las entrevistas SQL para usuarios experimentados. Disponer de todas estas soluciones debería hacerte consciente de las trampas que te tienden y de cómo evitarlas.

Pero no debes detenerte ahora. Nunca hay demasiada preparación para una entrevista de trabajo. Así que te recomiendo que veas otros 25 ejemplos de consultas SQL avanzadas u otras 27 preguntas de entrevista SQL avanzadas.

También deberías practicar lo que has aprendido aquí. Aquí tienes algunas ideas sobre cómo practicar SQL avanzado con nuestros cursos y algunos ejercicios de práctica de SQL avanzado para empezar.

Utiliza esto junto con nuestro curso SQL avanzado y el curso de práctica SQL avanzado , ¡y estarás bien preparado para tu próxima entrevista de trabajo!